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.
This commit is contained in:
14
vm/page.c
14
vm/page.c
@@ -69,7 +69,7 @@ void vm_page_init_array()
|
|||||||
size_t pmem_size = 0;
|
size_t pmem_size = 0;
|
||||||
|
|
||||||
memblock_iter_t it;
|
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) {
|
if (pmem_size < it.it_limit + 1) {
|
||||||
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 = memblock_alloc(sizeof(vm_page_t) * nr_pages, 8);
|
||||||
page_array_count = nr_pages;
|
page_array_count = nr_pages;
|
||||||
|
|
||||||
|
size_t nr_reserved = nr_pages;
|
||||||
|
|
||||||
for (size_t i = 0; i < nr_pages; i++) {
|
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_free_mem_range(&it, 0x0, UINTPTR_MAX) {
|
||||||
|
|
||||||
for_each_reserved_mem_range(&it, 0x0, UINTPTR_MAX) {
|
|
||||||
for (uintptr_t i = it.it_base; i < it.it_limit; i += VM_PAGE_SIZE) {
|
for (uintptr_t i = it.it_base; i < it.it_limit; i += VM_PAGE_SIZE) {
|
||||||
size_t pfn = i / VM_PAGE_SIZE;
|
size_t pfn = i / VM_PAGE_SIZE;
|
||||||
|
|
||||||
page_array[pfn].p_flags |= VM_PAGE_RESERVED;
|
page_array[pfn].p_flags = 0;
|
||||||
nr_reserved++;
|
nr_reserved--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
vm/zone.c
12
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;
|
vm_page_t *first_page = NULL;
|
||||||
for (phys_addr_t i = base; i < limit; i += VM_PAGE_SIZE) {
|
for (phys_addr_t i = base; i < limit; i += VM_PAGE_SIZE) {
|
||||||
vm_page_t *pg = vm_page_get(i);
|
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) {
|
if (order != VM_PAGE_MIN_ORDER) {
|
||||||
pg->p_flags |= VM_PAGE_HUGE;
|
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;
|
first_page = pg;
|
||||||
}
|
}
|
||||||
|
|
||||||
pg->p_order = order;
|
pg->p_list = QUEUE_ENTRY_INIT;
|
||||||
pg->p_node = z->z_info.zd_node;
|
pg->p_slab = NULL;
|
||||||
pg->p_zone = z->z_info.zd_id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return first_page;
|
return first_page;
|
||||||
|
|||||||
Reference in New Issue
Block a user