From caa7ac07649144d7f39ebb659c38f08c973f0029 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Sat, 21 Nov 2009 13:35:53 +0200 Subject: [PATCH] Put cinfo array into initdata section. Added more precision in bootmem cinfo array is now freed along with other init memory. bootmem allocator memory is reduced to be completely used up. free boot memory now prints the used free memory as well. --- include/l4/generic/bootmem.h | 1 + include/l4/macros.h | 2 ++ scripts/kernel/generate_kernel_cinfo.py | 2 +- src/generic/SConscript | 2 +- src/generic/{bootm.c => bootmem.c} | 15 +++++++++++---- src/generic/resource.c | 7 ++++--- 6 files changed, 20 insertions(+), 9 deletions(-) rename src/generic/{bootm.c => bootmem.c} (79%) diff --git a/include/l4/generic/bootmem.h b/include/l4/generic/bootmem.h index 7b35373..0cb9413 100644 --- a/include/l4/generic/bootmem.h +++ b/include/l4/generic/bootmem.h @@ -5,6 +5,7 @@ #ifndef __BOOTMEM_H__ #define __BOOTMEM_H__ +unsigned long bootmem_free_pages(void); void *alloc_bootmem(int size, int alignment); pmd_table_t *alloc_boot_pmd(void); diff --git a/include/l4/macros.h b/include/l4/macros.h index b1c2016..3a45b83 100644 --- a/include/l4/macros.h +++ b/include/l4/macros.h @@ -17,6 +17,8 @@ #define INC_API(x) #define INC_GLUE(x) +#define __initdata SECTION(".init.data") + /* use this to place code/data in a certain section */ #define SECTION(x) __attribute__((section(x))) #define ALIGN(x) __attribute__((aligned (x))) diff --git a/scripts/kernel/generate_kernel_cinfo.py b/scripts/kernel/generate_kernel_cinfo.py index fb7a1d5..aaced87 100755 --- a/scripts/kernel/generate_kernel_cinfo.py +++ b/scripts/kernel/generate_kernel_cinfo.py @@ -37,7 +37,7 @@ cinfo_file_start = \ * Add irqs, exceptions */ -struct container_info cinfo[] = { +__initdata struct container_info cinfo[] = { ''' cinfo_file_end = \ ''' diff --git a/src/generic/SConscript b/src/generic/SConscript index 1676db8..62cecca 100644 --- a/src/generic/SConscript +++ b/src/generic/SConscript @@ -4,7 +4,7 @@ Import('env') # The set of source files associated with this SConscript file. -src_local = ['irq.c', 'scheduler.c', 'time.c', 'tcb.c', 'space.c', 'bootm.c', 'resource.c', 'container.c', 'capability.c', 'cinfo.c'] +src_local = ['irq.c', 'scheduler.c', 'time.c', 'tcb.c', 'space.c', 'bootmem.c', 'resource.c', 'container.c', 'capability.c', 'cinfo.c'] obj = env.Object(src_local) Return('obj') diff --git a/src/generic/bootm.c b/src/generic/bootmem.c similarity index 79% rename from src/generic/bootm.c rename to src/generic/bootmem.c index f972d98..a3771ee 100644 --- a/src/generic/bootm.c +++ b/src/generic/bootmem.c @@ -10,16 +10,23 @@ #include #include -/* All memory allocated here is discarded after boot */ - -#define BOOTMEM_SIZE SZ_32K +/* + * All memory allocated here is discarded after boot. + * Increase this size if bootmem allocations fail. + */ +#define BOOTMEM_SIZE (SZ_4K * 4) SECTION(".init.pgd") pgd_table_t init_pgd; SECTION(".init.bootmem") char bootmem[BOOTMEM_SIZE]; -SECTION(".init.data") struct address_space init_space; +__initdata struct address_space init_space; static unsigned long cursor = (unsigned long)&bootmem; +unsigned long bootmem_free_pages(void) +{ + return BOOTMEM_SIZE - (page_align_up(cursor) - (unsigned long)&bootmem); +} + void *alloc_bootmem(int size, int alignment) { void *ptr; diff --git a/src/generic/resource.c b/src/generic/resource.c index 9859afb..c9826b6 100644 --- a/src/generic/resource.c +++ b/src/generic/resource.c @@ -335,6 +335,7 @@ int free_boot_memory(struct kernel_resources *kres) __pfn(virt_to_phys(_start_init)); unsigned long pfn_end = __pfn(page_align_up(virt_to_phys(_end_init))); + unsigned long init_pfns = pfn_end - pfn_start; /* Trim kernel used memory cap */ memcap_unmap(0, &kres->physmem_used, pfn_start, pfn_end); @@ -350,9 +351,9 @@ int free_boot_memory(struct kernel_resources *kres) 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); + printk("%s: Freed %lu KB init memory, of which %lu KB was used.\n", + __KERNELNAME__, init_pfns * 4, + (init_pfns - __pfn(page_align_up(bootmem_free_pages()))) * 4); return 0; }