vm: log per-zone free memory during init
This commit is contained in:
27
vm/zone.c
27
vm/zone.c
@@ -1,10 +1,12 @@
|
|||||||
#include <socks/locks.h>
|
#include <socks/locks.h>
|
||||||
|
#include <socks/util.h>
|
||||||
#include <socks/queue.h>
|
#include <socks/queue.h>
|
||||||
#include <socks/memblock.h>
|
#include <socks/memblock.h>
|
||||||
#include <socks/types.h>
|
#include <socks/types.h>
|
||||||
#include <socks/vm.h>
|
#include <socks/vm.h>
|
||||||
#include <socks/printk.h>
|
#include <socks/printk.h>
|
||||||
#include <socks/libc/string.h>
|
#include <socks/libc/string.h>
|
||||||
|
#include <socks/machine/cpu.h>
|
||||||
|
|
||||||
static vm_page_t *group_pages_into_block(vm_zone_t *z, phys_addr_t base, phys_addr_t limit, int order)
|
static vm_page_t *group_pages_into_block(vm_zone_t *z, phys_addr_t base, phys_addr_t limit, int order)
|
||||||
{
|
{
|
||||||
@@ -14,13 +16,10 @@ static vm_page_t *group_pages_into_block(vm_zone_t *z, phys_addr_t base, phys_ad
|
|||||||
if (!pg) {
|
if (!pg) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* p_flags is the only part of the page that has been
|
|
||||||
initialised at this point. */
|
|
||||||
|
|
||||||
pg->p_order = order;
|
pg->p_order = order;
|
||||||
pg->p_node = z->z_info.zd_node;
|
pg->p_node = z->z_info.zd_node;
|
||||||
pg->p_zone = z->z_info.zd_id;
|
pg->p_zone = z->z_info.zd_id;
|
||||||
pg->p_reserved = 0;
|
|
||||||
|
|
||||||
if (order != VM_PAGE_MIN_ORDER) {
|
if (order != VM_PAGE_MIN_ORDER) {
|
||||||
pg->p_flags |= VM_PAGE_HUGE;
|
pg->p_flags |= VM_PAGE_HUGE;
|
||||||
@@ -81,6 +80,21 @@ static void convert_region_to_blocks(vm_zone_t *zone,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t zone_free_bytes(vm_zone_t *z)
|
||||||
|
{
|
||||||
|
size_t free_bytes = 0;
|
||||||
|
for (vm_page_order_t i = VM_PAGE_MIN_ORDER; i <= VM_PAGE_MAX_ORDER; i++) {
|
||||||
|
size_t page_bytes = vm_page_order_to_bytes(i);
|
||||||
|
size_t nr_pages = 0;
|
||||||
|
queue_foreach (vm_page_t, pg, &z->z_free_pages[i], p_list) {
|
||||||
|
free_bytes += page_bytes;
|
||||||
|
nr_pages++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return free_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
void vm_zone_init(vm_zone_t *z, const vm_zone_descriptor_t *zone_info)
|
void vm_zone_init(vm_zone_t *z, const vm_zone_descriptor_t *zone_info)
|
||||||
{
|
{
|
||||||
memset(z, 0x0, sizeof *z);
|
memset(z, 0x0, sizeof *z);
|
||||||
@@ -139,8 +153,13 @@ void vm_zone_init(vm_zone_t *z, const vm_zone_descriptor_t *zone_info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t free_bytes = zone_free_bytes(z);
|
||||||
spin_unlock_irqrestore(&z->z_lock, flags);
|
spin_unlock_irqrestore(&z->z_lock, flags);
|
||||||
printk("vm: zone %s on node %u online.", z->z_info.zd_name, z->z_info.zd_node);
|
|
||||||
|
char free_bytes_str[64];
|
||||||
|
data_size_to_string(free_bytes, free_bytes_str, sizeof free_bytes_str);
|
||||||
|
|
||||||
|
printk("vm: node %u/zone %s: %s of memory online.", z->z_info.zd_node, z->z_info.zd_name, free_bytes_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int replenish_free_page_list(vm_zone_t *z, vm_page_order_t order)
|
static int replenish_free_page_list(vm_zone_t *z, vm_page_order_t order)
|
||||||
|
|||||||
Reference in New Issue
Block a user