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