2009-04-02 11:21:48

by Alexander Beregalov

[permalink] [raw]
Subject: next-0402: build fails at mm/debug-pagealloc.c

mm/debug-pagealloc.c: In function 'set_page_poison':
mm/debug-pagealloc.c:8: error: 'struct page' has no member named 'debug_flags'
mm/debug-pagealloc.c: In function 'clear_page_poison':
mm/debug-pagealloc.c:13: error: 'struct page' has no member named 'debug_flags'
mm/debug-pagealloc.c: In function 'page_poison':
mm/debug-pagealloc.c:18: error: 'struct page' has no member named 'debug_flags'
mm/debug-pagealloc.c: At top level:
mm/debug-pagealloc.c:120: error: redefinition of 'kernel_map_pages'
include/linux/mm.h:1278: error: previous definition of
'kernel_map_pages' was here
mm/debug-pagealloc.c: In function 'kernel_map_pages':
mm/debug-pagealloc.c:122: error: 'debug_pagealloc_enabled' undeclared
(first use in this function)

Should debug_flags really be in vm_area_struct instead of `struct page` ?


2009-04-02 16:34:53

by Akinobu Mita

[permalink] [raw]
Subject: [PATCH] build fix for generic debug pagealloc

> mm/debug-pagealloc.c: In function 'set_page_poison':
> mm/debug-pagealloc.c:8: error: 'struct page' has no member named 'debug_flags'
> mm/debug-pagealloc.c: In function 'clear_page_poison':
> mm/debug-pagealloc.c:13: error: 'struct page' has no member named 'debug_flags'
> mm/debug-pagealloc.c: In function 'page_poison':
> mm/debug-pagealloc.c:18: error: 'struct page' has no member named 'debug_flags'
> mm/debug-pagealloc.c: At top level:
> mm/debug-pagealloc.c:120: error: redefinition of 'kernel_map_pages'
> include/linux/mm.h:1278: error: previous definition of
> 'kernel_map_pages' was here
> mm/debug-pagealloc.c: In function 'kernel_map_pages':
> mm/debug-pagealloc.c:122: error: 'debug_pagealloc_enabled' undeclared
> (first use in this function)

This patch fixes build failure with generic debug pagealloc:

- debug_flags should be in struct page
- define DEBUG_PAGEALLOC config option for all architectures

Signed-off-by: Akinobu Mita <[email protected]>
Reported-by: Alexander Beregalov <[email protected]>
---
arch/powerpc/Kconfig.debug | 10 ----------
arch/s390/Kconfig.debug | 9 ---------
arch/sparc/Kconfig.debug | 9 ---------
arch/x86/Kconfig.debug | 9 ---------
include/linux/mm_types.h | 6 +++---
mm/Kconfig.debug | 9 +++++++++
6 files changed, 12 insertions(+), 40 deletions(-)

diff --git a/arch/powerpc/Kconfig.debug b/arch/powerpc/Kconfig.debug
index 6aa0b5e..a1098e2 100644
--- a/arch/powerpc/Kconfig.debug
+++ b/arch/powerpc/Kconfig.debug
@@ -27,16 +27,6 @@ config DEBUG_STACK_USAGE

This option will slow down process creation somewhat.

-config DEBUG_PAGEALLOC
- bool "Debug page memory allocations"
- depends on DEBUG_KERNEL && !HIBERNATION
- depends on ARCH_SUPPORTS_DEBUG_PAGEALLOC
- help
- Unmap pages from the kernel linear mapping after free_pages().
- This results in a large slowdown, but helps to find certain types
- of memory corruptions.
-
-
config HCALL_STATS
bool "Hypervisor call instrumentation"
depends on PPC_PSERIES && DEBUG_FS
diff --git a/arch/s390/Kconfig.debug b/arch/s390/Kconfig.debug
index 7e297a3..2283933 100644
--- a/arch/s390/Kconfig.debug
+++ b/arch/s390/Kconfig.debug
@@ -6,13 +6,4 @@ config TRACE_IRQFLAGS_SUPPORT

source "lib/Kconfig.debug"

-config DEBUG_PAGEALLOC
- bool "Debug page memory allocations"
- depends on DEBUG_KERNEL
- depends on ARCH_SUPPORTS_DEBUG_PAGEALLOC
- help
- Unmap pages from the kernel linear mapping after free_pages().
- This results in a slowdown, but helps to find certain types of
- memory corruptions.
-
endmenu
diff --git a/arch/sparc/Kconfig.debug b/arch/sparc/Kconfig.debug
index d001b42..90d5fe2 100644
--- a/arch/sparc/Kconfig.debug
+++ b/arch/sparc/Kconfig.debug
@@ -22,15 +22,6 @@ config DEBUG_DCFLUSH
config STACK_DEBUG
bool "Stack Overflow Detection Support"

-config DEBUG_PAGEALLOC
- bool "Debug page memory allocations"
- depends on DEBUG_KERNEL && !HIBERNATION
- depends on ARCH_SUPPORTS_DEBUG_PAGEALLOC
- help
- Unmap pages from the kernel linear mapping after free_pages().
- This results in a large slowdown, but helps to find certain types
- of memory corruptions.
-
config MCOUNT
bool
depends on SPARC64
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
index a345cb5..d8359e7 100644
--- a/arch/x86/Kconfig.debug
+++ b/arch/x86/Kconfig.debug
@@ -72,15 +72,6 @@ config DEBUG_STACK_USAGE

This option will slow down process creation somewhat.

-config DEBUG_PAGEALLOC
- bool "Debug page memory allocations"
- depends on DEBUG_KERNEL
- depends on ARCH_SUPPORTS_DEBUG_PAGEALLOC
- ---help---
- Unmap pages from the kernel linear mapping after free_pages().
- This results in a large slowdown, but helps to find certain types
- of memory corruptions.
-
config DEBUG_PER_CPU_MAPS
bool "Debug access to per_cpu maps"
depends on DEBUG_KERNEL
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
index ddadb4d..0e80e26 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
@@ -95,6 +95,9 @@ struct page {
void *virtual; /* Kernel virtual address (NULL if
not kmapped, ie. highmem) */
#endif /* WANT_PAGE_VIRTUAL */
+#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
+ unsigned long debug_flags; /* Use atomic bitops on this */
+#endif
};

/*
@@ -175,9 +178,6 @@ struct vm_area_struct {
#ifdef CONFIG_NUMA
struct mempolicy *vm_policy; /* NUMA policy for the VMA */
#endif
-#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
- unsigned long debug_flags; /* Use atomic bitops on this */
-#endif
};

struct core_thread {
diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug
index c8d62d4..bb01e29 100644
--- a/mm/Kconfig.debug
+++ b/mm/Kconfig.debug
@@ -1,3 +1,12 @@
+config DEBUG_PAGEALLOC
+ bool "Debug page memory allocations"
+ depends on DEBUG_KERNEL && ARCH_SUPPORTS_DEBUG_PAGEALLOC
+ depends on !HIBERNATION || !PPC && !SPARC
+ ---help---
+ Unmap pages from the kernel linear mapping after free_pages().
+ This results in a large slowdown, but helps to find certain types
+ of memory corruptions.
+
config WANT_PAGE_DEBUG_FLAGS
bool

2009-04-02 16:54:54

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH] build fix for generic debug pagealloc

On Fri, 3 Apr 2009 01:31:52 +0900 Akinobu Mita <[email protected]> wrote:

> > mm/debug-pagealloc.c: In function 'set_page_poison':
> > mm/debug-pagealloc.c:8: error: 'struct page' has no member named 'debug_flags'
> > mm/debug-pagealloc.c: In function 'clear_page_poison':
> > mm/debug-pagealloc.c:13: error: 'struct page' has no member named 'debug_flags'
> > mm/debug-pagealloc.c: In function 'page_poison':
> > mm/debug-pagealloc.c:18: error: 'struct page' has no member named 'debug_flags'
> > mm/debug-pagealloc.c: At top level:
> > mm/debug-pagealloc.c:120: error: redefinition of 'kernel_map_pages'
> > include/linux/mm.h:1278: error: previous definition of
> > 'kernel_map_pages' was here
> > mm/debug-pagealloc.c: In function 'kernel_map_pages':
> > mm/debug-pagealloc.c:122: error: 'debug_pagealloc_enabled' undeclared
> > (first use in this function)
>
> This patch fixes build failure with generic debug pagealloc:
>
> - debug_flags should be in struct page
> - define DEBUG_PAGEALLOC config option for all architectures
>
> ...
>
> bool "Debug access to per_cpu maps"
> depends on DEBUG_KERNEL
> diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
> index ddadb4d..0e80e26 100644
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -95,6 +95,9 @@ struct page {
> void *virtual; /* Kernel virtual address (NULL if
> not kmapped, ie. highmem) */
> #endif /* WANT_PAGE_VIRTUAL */
> +#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
> + unsigned long debug_flags; /* Use atomic bitops on this */
> +#endif
> };
>
> /*
> @@ -175,9 +178,6 @@ struct vm_area_struct {
> #ifdef CONFIG_NUMA
> struct mempolicy *vm_policy; /* NUMA policy for the VMA */
> #endif
> -#ifdef CONFIG_WANT_PAGE_DEBUG_FLAGS
> - unsigned long debug_flags; /* Use atomic bitops on this */
> -#endif
> };

dammit.

> struct core_thread {
> diff --git a/mm/Kconfig.debug b/mm/Kconfig.debug
> index c8d62d4..bb01e29 100644
> --- a/mm/Kconfig.debug
> +++ b/mm/Kconfig.debug
> @@ -1,3 +1,12 @@
> +config DEBUG_PAGEALLOC
> + bool "Debug page memory allocations"
> + depends on DEBUG_KERNEL && ARCH_SUPPORTS_DEBUG_PAGEALLOC
> + depends on !HIBERNATION || !PPC && !SPARC
> + ---help---
> + Unmap pages from the kernel linear mapping after free_pages().
> + This results in a large slowdown, but helps to find certain types
> + of memory corruptions.
> +

I guess this is why it wasn't discovered in my compile testing. It's
quite regrettable that `make allmodconfig' didn't enable the feature.
That's what allmodconfig is for.

2009-04-03 16:47:01

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] build fix for generic debug pagealloc


* Andrew Morton <[email protected]> wrote:

> > +config DEBUG_PAGEALLOC
> > + bool "Debug page memory allocations"
> > + depends on DEBUG_KERNEL && ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + depends on !HIBERNATION || !PPC && !SPARC
> > + ---help---
> > + Unmap pages from the kernel linear mapping after free_pages().
> > + This results in a large slowdown, but helps to find certain types
> > + of memory corruptions.
> > +
>
> I guess this is why it wasn't discovered in my compile testing.
> It's quite regrettable that `make allmodconfig' didn't enable the
> feature. That's what allmodconfig is for.

Hm, i _do_ remember some hibernation magic fix from Rafael, in the
area of debugalloc. Many months ago.

Rafael, is it supposed to work? If yes, i think we should unblock
it.

Ingo

2009-04-03 20:39:06

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] build fix for generic debug pagealloc

On Friday 03 April 2009, Ingo Molnar wrote:
>
> * Andrew Morton <[email protected]> wrote:
>
> > > +config DEBUG_PAGEALLOC
> > > + bool "Debug page memory allocations"
> > > + depends on DEBUG_KERNEL && ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > > + depends on !HIBERNATION || !PPC && !SPARC
> > > + ---help---
> > > + Unmap pages from the kernel linear mapping after free_pages().
> > > + This results in a large slowdown, but helps to find certain types
> > > + of memory corruptions.
> > > +
> >
> > I guess this is why it wasn't discovered in my compile testing.
> > It's quite regrettable that `make allmodconfig' didn't enable the
> > feature. That's what allmodconfig is for.
>
> Hm, i _do_ remember some hibernation magic fix from Rafael, in the
> area of debugalloc. Many months ago.
>
> Rafael, is it supposed to work? If yes, i think we should unblock
> it.

Yes, it is, at least on x86.

ISTR using DEBUG_PAGEALLOC with hibernation quite some time ago already.

Thanks,
Rafael

2009-04-08 13:10:53

by Ingo Molnar

[permalink] [raw]
Subject: Re: [PATCH] build fix for generic debug pagealloc


* Rafael J. Wysocki <[email protected]> wrote:

> On Friday 03 April 2009, Ingo Molnar wrote:
> >
> > * Andrew Morton <[email protected]> wrote:
> >
> > > > +config DEBUG_PAGEALLOC
> > > > + bool "Debug page memory allocations"
> > > > + depends on DEBUG_KERNEL && ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > > > + depends on !HIBERNATION || !PPC && !SPARC
> > > > + ---help---
> > > > + Unmap pages from the kernel linear mapping after free_pages().
> > > > + This results in a large slowdown, but helps to find certain types
> > > > + of memory corruptions.
> > > > +
> > >
> > > I guess this is why it wasn't discovered in my compile testing.
> > > It's quite regrettable that `make allmodconfig' didn't enable the
> > > feature. That's what allmodconfig is for.
> >
> > Hm, i _do_ remember some hibernation magic fix from Rafael, in the
> > area of debugalloc. Many months ago.
> >
> > Rafael, is it supposed to work? If yes, i think we should unblock
> > it.
>
> Yes, it is, at least on x86.
>
> ISTR using DEBUG_PAGEALLOC with hibernation quite some time ago
> already.

Could you please send a patch to Andrew then to remove the above
dependency?

Ingo