vm: log per-zone free memory during init

This commit is contained in:
2023-02-08 21:29:20 +00:00
parent 9792aa512d
commit 22eabbedbc

View File

@@ -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)