From 4329a5734c6a56773be2093216c358e9e33549be Mon Sep 17 00:00:00 2001 From: Laura Abbott <lauraa@codeaurora.org> Date: Tue, 18 Mar 2014 20:28:44 -0700 Subject: [PATCH] mm/vmalloc.c: Correctly calculate VMALLOC_TOTAL VMALLOC_TOTAL currently only accounts for the 'official' vmalloc region when CONFIG_ENABLE_VMALLOC_SAVING is enabled. Account for all regions when the config is enabled. Change-Id: I7b977b050b5c0c1a69a94e876389ba8c5711432b Signed-off-by: Laura Abbott <lauraa@codeaurora.org> --- include/linux/vmalloc.h | 5 +++++ mm/vmalloc.c | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 1a7a64e0777c..6747abe8bc08 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -184,7 +184,12 @@ struct vmalloc_info { }; #ifdef CONFIG_MMU +#ifdef CONFIG_ENABLE_VMALLOC_SAVING +extern unsigned long total_vmalloc_size; +#define VMALLOC_TOTAL total_vmalloc_size +#else #define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START) +#endif extern void get_vmalloc_info(struct vmalloc_info *vmi); #else diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 0cc9adda2529..a123d58b7039 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -290,6 +290,9 @@ static unsigned long vmap_area_pcpu_hole; #define VMALLOC_TO_BIT(addr) ((addr - PAGE_OFFSET) >> PAGE_SHIFT) #define BIT_TO_VMALLOC(i) (PAGE_OFFSET + i * PAGE_SIZE) +unsigned long total_vmalloc_size; +unsigned long vmalloc_reserved; + DECLARE_BITMAP(possible_areas, VMALLOC_BITMAP_SIZE); void mark_vmalloc_reserved_area(void *x, unsigned long size) @@ -297,6 +300,7 @@ void mark_vmalloc_reserved_area(void *x, unsigned long size) unsigned long addr = (unsigned long)x; bitmap_set(possible_areas, VMALLOC_TO_BIT(addr), size >> PAGE_SHIFT); + vmalloc_reserved += size; } int is_vmalloc_addr(const void *x) @@ -311,6 +315,12 @@ int is_vmalloc_addr(const void *x) return 1; } + +static void calc_total_vmalloc_size(void) +{ + total_vmalloc_size = VMALLOC_END - POSSIBLE_VMALLOC_START - + vmalloc_reserved; +} #else int is_vmalloc_addr(const void *x) { @@ -318,6 +328,8 @@ int is_vmalloc_addr(const void *x) return addr >= VMALLOC_START && addr < VMALLOC_END; } + +static void calc_total_vmalloc_size(void) { } #endif EXPORT_SYMBOL(is_vmalloc_addr); @@ -1285,6 +1297,7 @@ void __init vmalloc_init(void) vmap_area_pcpu_hole = VMALLOC_END; + calc_total_vmalloc_size(); vmap_initialized = true; } -- GitLab