[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [MINI-OS PATCH 05/19] mm: refactor init_page_allocator()
Split init_page_allocator() into three functions in order to prepare for sparing some memory from being added to the buddy allocator. Use a function pointer for selecting the function used for handling a memory range, as this will be needed by a future patch. For the same reason make iterate_memory_range() globally visible. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- include/mm.h | 3 ++ mm.c | 111 +++++++++++++++++++++++++++++---------------------- 2 files changed, 66 insertions(+), 48 deletions(-) diff --git a/include/mm.h b/include/mm.h index 0a16d56c..1dc89ddb 100644 --- a/include/mm.h +++ b/include/mm.h @@ -95,4 +95,7 @@ void fini_mm(void); void change_readonly(bool readonly); +void iterate_memory_range(unsigned long min, unsigned long max, + void (*func)(unsigned long, unsigned long)); + #endif /* _MM_H_ */ diff --git a/mm.c b/mm.c index 9236db58..858dc108 100644 --- a/mm.c +++ b/mm.c @@ -150,16 +150,74 @@ static void dequeue_elem(chunk_head_t *elem) elem->next->prev = elem->prev; } +static void add_memory_range(unsigned long r_min, unsigned long r_max) +{ + unsigned int i; + unsigned long range; + chunk_head_t *ch; + + printk(" Adding memory range %lx-%lx\n", r_min, r_max); + + /* The buddy lists are addressed in high memory. */ + r_min = (unsigned long)to_virt(r_min); + r_max = (unsigned long)to_virt(r_max); + range = r_max - r_min; + + /* Free up the memory we've been given to play with. */ + map_free(PHYS_PFN(r_min), range >> PAGE_SHIFT); + + while ( range != 0 ) + { + /* + * Next chunk is limited by alignment of min, but also + * must not be bigger than remaining range. + */ + for ( i = PAGE_SHIFT; (1UL << (i + 1)) <= range; i++ ) + { + if ( r_min & (1UL << i) ) + break; + } + + ch = (chunk_head_t *)r_min; + r_min += 1UL << i; + range -= 1UL << i; + enqueue_elem(ch, i - PAGE_SHIFT); + } +} + +void iterate_memory_range(unsigned long min, unsigned long max, + void (*func)(unsigned long, unsigned long)) +{ + unsigned int m; + unsigned long r_min, r_max; + + for ( m = 0; m < e820_entries; m++ ) + { + if ( e820_map[m].type != E820_RAM ) + continue; + if ( e820_map[m].addr + e820_map[m].size >= ULONG_MAX ) + BUG(); + + r_min = e820_map[m].addr; + r_max = r_min + e820_map[m].size; + if ( r_max <= min || r_min >= max ) + continue; + if ( r_min < min ) + r_min = min; + if ( r_max > max ) + r_max = max; + + func(r_min, r_max); + } +} + /* * Initialise allocator, placing addresses [@min,@max] in free pool. * @min and @max are PHYSICAL addresses. */ static void init_page_allocator(unsigned long min, unsigned long max) { - int i, m; - unsigned long range; - unsigned long r_min, r_max; - chunk_head_t *ch; + int i; printk("MM: Initialise page allocator for %lx(%lx)-%lx(%lx)\n", (u_long)to_virt(min), min, (u_long)to_virt(max), max); @@ -182,50 +240,7 @@ static void init_page_allocator(unsigned long min, unsigned long max) /* All allocated by default. */ memset(mm_alloc_bitmap, ~0, mm_alloc_bitmap_size); - for ( m = 0; m < e820_entries; m++ ) - { - if ( e820_map[m].type != E820_RAM ) - continue; - if ( e820_map[m].addr + e820_map[m].size >= ULONG_MAX ) - BUG(); - - r_min = e820_map[m].addr; - r_max = r_min + e820_map[m].size; - if ( r_max <= min || r_min >= max ) - continue; - if ( r_min < min ) - r_min = min; - if ( r_max > max ) - r_max = max; - - printk(" Adding memory range %lx-%lx\n", r_min, r_max); - - /* The buddy lists are addressed in high memory. */ - r_min = (unsigned long)to_virt(r_min); - r_max = (unsigned long)to_virt(r_max); - range = r_max - r_min; - - /* Free up the memory we've been given to play with. */ - map_free(PHYS_PFN(r_min), range >> PAGE_SHIFT); - - while ( range != 0 ) - { - /* - * Next chunk is limited by alignment of min, but also - * must not be bigger than remaining range. - */ - for ( i = PAGE_SHIFT; (1UL << (i + 1)) <= range; i++ ) - { - if ( r_min & (1UL << i) ) - break; - } - - ch = (chunk_head_t *)r_min; - r_min += 1UL << i; - range -= 1UL << i; - enqueue_elem(ch, i - PAGE_SHIFT); - } - } + iterate_memory_range(min, max, add_memory_range); mm_alloc_bitmap_remap(); } -- 2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |