From 9248328dd34f06cd07c44675d41e142a0ccda5a8 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Tue, 3 Nov 2009 15:09:28 +0200 Subject: [PATCH] Pager struct allocated from boot memory and never referenced after boot. We still have to have the pager structs because they possess intermediate data during boot up such as for transferring of capability lists to boot stack one-by-one, and then to newly generated ktcbs. --- include/l4/generic/container.h | 4 ++-- src/generic/container.c | 3 +++ src/generic/resource.c | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/l4/generic/container.h b/include/l4/generic/container.h index ee7b21f..f9ac26d 100644 --- a/include/l4/generic/container.h +++ b/include/l4/generic/container.h @@ -48,8 +48,8 @@ struct container { struct id_pool *space_id_pool; struct mutex_queue_head mutex_queue_head; /* Userspace mutex list */ - struct cap_list cap_list; /* Capabilities shared by whole container */ - struct pager pager[CONFIG_MAX_PAGERS_USED]; + struct cap_list cap_list; /* Capabilities shared by whole container */ + struct pager *pager; /* Boot-time array of pagers */ }; /* Compact, raw capability structure */ diff --git a/src/generic/container.c b/src/generic/container.c index 1f6d3bb..3a447f8 100644 --- a/src/generic/container.c +++ b/src/generic/container.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include INC_GLUE(memory.h) #include INC_SUBARCH(mm.h) @@ -25,6 +26,8 @@ int container_init(struct container *c) cap_list_init(&c->cap_list); /* Init pager structs */ + c->pager = alloc_bootmem(sizeof(c->pager[0]) * + CONFIG_MAX_PAGERS_USED, 0); for (int i = 0; i < CONFIG_MAX_PAGERS_USED; i++) cap_list_init(&c->pager[i].cap_list); diff --git a/src/generic/resource.c b/src/generic/resource.c index cebbc9f..75bd115 100644 --- a/src/generic/resource.c +++ b/src/generic/resource.c @@ -319,6 +319,7 @@ int memcap_map(struct cap_list *cap_list, /* Delete all boot memory and add it to physical memory pool. */ int free_boot_memory(struct kernel_resources *kres) { + struct container *c; unsigned long pfn_start = __pfn(virt_to_phys(_start_init)); unsigned long pfn_end = @@ -334,6 +335,10 @@ int free_boot_memory(struct kernel_resources *kres) for (unsigned long i = pfn_start; i < pfn_end; i++) remove_mapping(phys_to_virt(__pfn_to_addr(i))); + /* Reset pointers that will remain in system as precaution */ + list_foreach_struct(c, &kres->containers.list, list) + c->pager = 0; + printk("%s: Freed %lu KB init memory.\n", __KERNELNAME__, __pfn_to_addr((pfn_end - pfn_start)) / 1024);