From 9879bbf646bbb6edc187ba554cdc8adc6343e57a Mon Sep 17 00:00:00 2001 From: Max Wash Date: Tue, 7 Feb 2023 15:58:37 +0000 Subject: [PATCH] vm: optimise page array size and initialisation. * the page array now only extends up to the last non-reserved memory frame. * rather than memset'ing the whole array to zero, we only initialise p_flags for each page in vm_page_array_init, and then leave it to group_pages_into_block to initialise the other parts of vm_page_t. --- vm/page.c | 14 +++++++------- vm/zone.c | 12 +++++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/vm/page.c b/vm/page.c index f65d4a5..63a43b7 100644 --- a/vm/page.c +++ b/vm/page.c @@ -69,7 +69,7 @@ void vm_page_init_array() size_t pmem_size = 0; memblock_iter_t it; - for_each_mem_range (&it, 0x0, UINTPTR_MAX) { + for_each_free_mem_range (&it, 0x0, UINTPTR_MAX) { if (pmem_size < it.it_limit + 1) { pmem_size = it.it_limit + 1; } @@ -83,18 +83,18 @@ void vm_page_init_array() page_array = memblock_alloc(sizeof(vm_page_t) * nr_pages, 8); page_array_count = nr_pages; + size_t nr_reserved = nr_pages; + for (size_t i = 0; i < nr_pages; i++) { - memset(&page_array[i], 0x0, sizeof page_array[i]); + page_array[i].p_flags = VM_PAGE_RESERVED; } - size_t nr_reserved = 0; - - for_each_reserved_mem_range(&it, 0x0, UINTPTR_MAX) { + for_each_free_mem_range(&it, 0x0, UINTPTR_MAX) { for (uintptr_t i = it.it_base; i < it.it_limit; i += VM_PAGE_SIZE) { size_t pfn = i / VM_PAGE_SIZE; - page_array[pfn].p_flags |= VM_PAGE_RESERVED; - nr_reserved++; + page_array[pfn].p_flags = 0; + nr_reserved--; } } diff --git a/vm/zone.c b/vm/zone.c index 5eb0866..3f54d89 100644 --- a/vm/zone.c +++ b/vm/zone.c @@ -10,6 +10,13 @@ static vm_page_t *group_pages_into_block(vm_zone_t *z, phys_addr_t base, phys_ad vm_page_t *first_page = NULL; for (phys_addr_t i = base; i < limit; i += VM_PAGE_SIZE) { vm_page_t *pg = vm_page_get(i); + /* p_flags is the only part of the page that has been + initialised at this point. */ + + pg->p_order = order; + pg->p_node = z->z_info.zd_node; + pg->p_zone = z->z_info.zd_id; + pg->p_reserved = 0; if (order != VM_PAGE_MIN_ORDER) { pg->p_flags |= VM_PAGE_HUGE; @@ -20,9 +27,8 @@ static vm_page_t *group_pages_into_block(vm_zone_t *z, phys_addr_t base, phys_ad first_page = pg; } - pg->p_order = order; - pg->p_node = z->z_info.zd_node; - pg->p_zone = z->z_info.zd_id; + pg->p_list = QUEUE_ENTRY_INIT; + pg->p_slab = NULL; } return first_page;