[05/14] vcompound: Debugging aid

From: Christoph Lameter
Date: Fri Mar 21 2008 - 02:21:15 EST


Virtual fallbacks are rare and thus subtle bugs may creep in if we do not
test the fallbacks. CONFIG_VFALLBACK_ALWAYS makes all vcompound allocations
fall back to vmalloc.

Signed-off-by: Christoph Lameter <clameter@xxxxxxx>
---
lib/Kconfig.debug | 11 +++++++++++
mm/vmalloc.c | 18 +++++++++++++++---
2 files changed, 26 insertions(+), 3 deletions(-)

Index: linux-2.6.25-rc5-mm1/lib/Kconfig.debug
===================================================================
--- linux-2.6.25-rc5-mm1.orig/lib/Kconfig.debug 2008-03-20 23:05:12.910212550 -0700
+++ linux-2.6.25-rc5-mm1/lib/Kconfig.debug 2008-03-20 23:06:21.599135107 -0700
@@ -158,6 +158,17 @@ config DETECT_SOFTLOCKUP
can be detected via the NMI-watchdog, on platforms that
support it.)

+config VFALLBACK_ALWAYS
+ bool "Always fall back to virtually mapped compound pages"
+ default y
+ help
+ Virtual compound pages are only allocated if there is no linear
+ memory available. They are a fallback and errors created by the
+ use of virtual mappings instead of linear ones may not surface
+ because of their infrequent use. This option makes every
+ allocation that allows a fallback to a virtual mapping use
+ the virtual mapping. May have a significant performance impact.
+
config SCHED_DEBUG
bool "Collect scheduler debugging info"
depends on DEBUG_KERNEL && PROC_FS
Index: linux-2.6.25-rc5-mm1/mm/vmalloc.c
===================================================================
--- linux-2.6.25-rc5-mm1.orig/mm/vmalloc.c 2008-03-20 23:06:14.875045176 -0700
+++ linux-2.6.25-rc5-mm1/mm/vmalloc.c 2008-03-20 23:06:21.599135107 -0700
@@ -1159,7 +1159,13 @@ struct page *alloc_vcompound(gfp_t flags
struct vm_struct *vm;
struct page *page;

- page = alloc_pages(flags | __GFP_NORETRY | __GFP_NOWARN, order);
+#ifdef CONFIG_VFALLBACK_ALWAYS
+ if (system_state == SYSTEM_RUNNING && order)
+ page = NULL;
+ else
+#endif
+ page = alloc_pages(flags | __GFP_NORETRY | __GFP_NOWARN,
+ order);
if (page || !order)
return page;

@@ -1175,8 +1181,14 @@ void *__alloc_vcompound(gfp_t flags, int
struct vm_struct *vm;
void *addr;

- addr = (void *)__get_free_pages(flags | __GFP_NORETRY | __GFP_NOWARN,
- order);
+#ifdef CONFIG_VFALLBACK_ALWAYS
+ if (system_state == SYSTEM_RUNNING && order)
+ addr = NULL;
+ else
+#endif
+ addr = (void *)__get_free_pages(
+ flags | __GFP_NORETRY | __GFP_NOWARN, order);
+
if (addr || !order)
return addr;


--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/