From: Mike Rapoport <rppt@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Albert Ou <aou@eecs.berkeley.edu>,
Andy Lutomirski <luto@kernel.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Borislav Petkov <bp@alien8.de>,
Catalin Marinas <catalin.marinas@arm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Christoph Lameter <cl@linux.com>,
"David S. Miller" <davem@davemloft.net>,
Dave Hansen <dave.hansen@linux.intel.com>,
David Hildenbrand <david@redhat.com>,
David Rientjes <rientjes@google.com>,
"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
Heiko Carstens <hca@linux.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Len Brown <len.brown@intel.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Mike Rapoport <rppt@linux.ibm.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Paul Mackerras <paulus@samba.org>,
Paul Walmsley <paul.walmsley@sifive.com>,
Pavel Machek <pavel@ucw.cz>, Pekka Enberg <penberg@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Thomas Gleixner <tglx@linutronix.de>,
Vasily Gorbik <gor@linux.ibm.com>, Will Deacon <will@kernel.org>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
linux-pm@vger.kernel.org, linux-riscv@lists.infradead.org,
linux-s390@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
sparclinux@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC
Date: Thu, 5 Nov 2020 13:42:00 +0200 [thread overview]
Message-ID: <20201105114200.GZ4879@kernel.org> (raw)
In-Reply-To: <f9c1dc66-fc60-db4d-9670-0271adb2ed07@suse.cz>
On Wed, Nov 04, 2020 at 07:02:20PM +0100, Vlastimil Babka wrote:
> On 11/3/20 5:20 PM, Mike Rapoport wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
>
> Subject should have "on DEBUG_PAGEALLOC" ?
>
> > The design of DEBUG_PAGEALLOC presumes that __kernel_map_pages() must never
> > fail. With this assumption is wouldn't be safe to allow general usage of
> > this function.
> >
> > Moreover, some architectures that implement __kernel_map_pages() have this
> > function guarded by #ifdef DEBUG_PAGEALLOC and some refuse to map/unmap
> > pages when page allocation debugging is disabled at runtime.
> >
> > As all the users of __kernel_map_pages() were converted to use
> > debug_pagealloc_map_pages() it is safe to make it available only when
> > DEBUG_PAGEALLOC is set.
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Acked-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> > arch/Kconfig | 3 +++
> > arch/arm64/Kconfig | 4 +---
> > arch/arm64/mm/pageattr.c | 8 ++++++--
> > arch/powerpc/Kconfig | 5 +----
> > arch/riscv/Kconfig | 4 +---
> > arch/riscv/include/asm/pgtable.h | 2 --
> > arch/riscv/mm/pageattr.c | 2 ++
> > arch/s390/Kconfig | 4 +---
> > arch/sparc/Kconfig | 4 +---
> > arch/x86/Kconfig | 4 +---
> > arch/x86/mm/pat/set_memory.c | 2 ++
> > include/linux/mm.h | 10 +++++++---
> > 12 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 56b6ccc0e32d..56d4752b6db6 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -1028,6 +1028,9 @@ config HAVE_STATIC_CALL_INLINE
> > bool
> > depends on HAVE_STATIC_CALL
> > +config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + bool
> > +
> > source "kernel/gcov/Kconfig"
> > source "scripts/gcc-plugins/Kconfig"
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 1d466addb078..a932810cfd90 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -71,6 +71,7 @@ config ARM64
> > select ARCH_USE_QUEUED_RWLOCKS
> > select ARCH_USE_QUEUED_SPINLOCKS
> > select ARCH_USE_SYM_ANNOTATIONS
> > + select ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > select ARCH_SUPPORTS_MEMORY_FAILURE
> > select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
> > select ARCH_SUPPORTS_ATOMIC_RMW
> > @@ -1025,9 +1026,6 @@ config HOLES_IN_ZONE
> > source "kernel/Kconfig.hz"
> > -config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > - def_bool y
> > -
> > config ARCH_SPARSEMEM_ENABLE
> > def_bool y
> > select SPARSEMEM_VMEMMAP_ENABLE
> > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> > index 1b94f5b82654..439325532be1 100644
> > --- a/arch/arm64/mm/pageattr.c
> > +++ b/arch/arm64/mm/pageattr.c
> > @@ -155,7 +155,7 @@ int set_direct_map_invalid_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_VALID),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
> > @@ -170,7 +170,7 @@ int set_direct_map_default_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_RDONLY),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
>
> I don't understand these two hunks. Previous patch calls this for
> hibernation when CONFIG_ARCH_HAS_SET_DIRECT_MAP, which is true for arm64.
> Why suddenly this starts to depend on debug_pagealloc_enabled()?
I was confused about this for quite a long :)
On arm64 the changes to direct^w linear map are allowed when
debug_page_alloc() || rodata_full
In hibernation we essentially have now
if (1)
set_direct_map(something)
else
debug_page_alloc_map()
With debug_pagealloc enabled but with rodata_full disabled arm64
versions of set_direct_map_*() will become a nop, so a page that was
unmapped by debug_pagealloc() will not be mapped back.
I'm still puzzled how hibernation might ever need to save a free page,
but that's another story.
--
Sincerely yours,
Mike.
WARNING: multiple messages have this Message-ID (diff)
From: Mike Rapoport <rppt@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
linux-mm@kvack.org, Paul Mackerras <paulus@samba.org>,
Pavel Machek <pavel@ucw.cz>, "H. Peter Anvin" <hpa@zytor.com>,
sparclinux@vger.kernel.org, Christoph Lameter <cl@linux.com>,
Will Deacon <will@kernel.org>,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org,
Michael Ellerman <mpe@ellerman.id.au>,
x86@kernel.org, Mike Rapoport <rppt@linux.ibm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Len Brown <len.brown@intel.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Vasily Gorbik <gor@linux.ibm.com>,
linux-pm@vger.kernel.org, Heiko Carstens <hca@linux.ibm.com>,
David Rientjes <rientjes@google.com>,
Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>,
Paul Walmsley <paul.walmsley@sifive.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Thomas Gleixner <tglx@linutronix.de>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
linux-arm-kernel@lists.infradead.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
linux-kernel@vger.kernel.org, Pekka Enberg <penberg@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
linuxppc-dev@lists.ozlabs.org,
"David S. Miller" <davem@davemloft.net>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC
Date: Thu, 5 Nov 2020 13:42:00 +0200 [thread overview]
Message-ID: <20201105114200.GZ4879@kernel.org> (raw)
In-Reply-To: <f9c1dc66-fc60-db4d-9670-0271adb2ed07@suse.cz>
On Wed, Nov 04, 2020 at 07:02:20PM +0100, Vlastimil Babka wrote:
> On 11/3/20 5:20 PM, Mike Rapoport wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
>
> Subject should have "on DEBUG_PAGEALLOC" ?
>
> > The design of DEBUG_PAGEALLOC presumes that __kernel_map_pages() must never
> > fail. With this assumption is wouldn't be safe to allow general usage of
> > this function.
> >
> > Moreover, some architectures that implement __kernel_map_pages() have this
> > function guarded by #ifdef DEBUG_PAGEALLOC and some refuse to map/unmap
> > pages when page allocation debugging is disabled at runtime.
> >
> > As all the users of __kernel_map_pages() were converted to use
> > debug_pagealloc_map_pages() it is safe to make it available only when
> > DEBUG_PAGEALLOC is set.
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Acked-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> > arch/Kconfig | 3 +++
> > arch/arm64/Kconfig | 4 +---
> > arch/arm64/mm/pageattr.c | 8 ++++++--
> > arch/powerpc/Kconfig | 5 +----
> > arch/riscv/Kconfig | 4 +---
> > arch/riscv/include/asm/pgtable.h | 2 --
> > arch/riscv/mm/pageattr.c | 2 ++
> > arch/s390/Kconfig | 4 +---
> > arch/sparc/Kconfig | 4 +---
> > arch/x86/Kconfig | 4 +---
> > arch/x86/mm/pat/set_memory.c | 2 ++
> > include/linux/mm.h | 10 +++++++---
> > 12 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 56b6ccc0e32d..56d4752b6db6 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -1028,6 +1028,9 @@ config HAVE_STATIC_CALL_INLINE
> > bool
> > depends on HAVE_STATIC_CALL
> > +config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + bool
> > +
> > source "kernel/gcov/Kconfig"
> > source "scripts/gcc-plugins/Kconfig"
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 1d466addb078..a932810cfd90 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -71,6 +71,7 @@ config ARM64
> > select ARCH_USE_QUEUED_RWLOCKS
> > select ARCH_USE_QUEUED_SPINLOCKS
> > select ARCH_USE_SYM_ANNOTATIONS
> > + select ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > select ARCH_SUPPORTS_MEMORY_FAILURE
> > select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
> > select ARCH_SUPPORTS_ATOMIC_RMW
> > @@ -1025,9 +1026,6 @@ config HOLES_IN_ZONE
> > source "kernel/Kconfig.hz"
> > -config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > - def_bool y
> > -
> > config ARCH_SPARSEMEM_ENABLE
> > def_bool y
> > select SPARSEMEM_VMEMMAP_ENABLE
> > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> > index 1b94f5b82654..439325532be1 100644
> > --- a/arch/arm64/mm/pageattr.c
> > +++ b/arch/arm64/mm/pageattr.c
> > @@ -155,7 +155,7 @@ int set_direct_map_invalid_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_VALID),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
> > @@ -170,7 +170,7 @@ int set_direct_map_default_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_RDONLY),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
>
> I don't understand these two hunks. Previous patch calls this for
> hibernation when CONFIG_ARCH_HAS_SET_DIRECT_MAP, which is true for arm64.
> Why suddenly this starts to depend on debug_pagealloc_enabled()?
I was confused about this for quite a long :)
On arm64 the changes to direct^w linear map are allowed when
debug_page_alloc() || rodata_full
In hibernation we essentially have now
if (1)
set_direct_map(something)
else
debug_page_alloc_map()
With debug_pagealloc enabled but with rodata_full disabled arm64
versions of set_direct_map_*() will become a nop, so a page that was
unmapped by debug_pagealloc() will not be mapped back.
I'm still puzzled how hibernation might ever need to save a free page,
but that's another story.
--
Sincerely yours,
Mike.
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Mike Rapoport <rppt@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
linux-mm@kvack.org, Paul Mackerras <paulus@samba.org>,
Pavel Machek <pavel@ucw.cz>, "H. Peter Anvin" <hpa@zytor.com>,
sparclinux@vger.kernel.org, Christoph Lameter <cl@linux.com>,
Will Deacon <will@kernel.org>,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org,
x86@kernel.org, Mike Rapoport <rppt@linux.ibm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Len Brown <len.brown@intel.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Vasily Gorbik <gor@linux.ibm.com>,
linux-pm@vger.kernel.org, Heiko Carstens <hca@linux.ibm.com>,
David Rientjes <rientjes@google.com>,
Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>,
Paul Walmsley <paul.walmsley@sifive.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Thomas Gleixner <tglx@linutronix.de>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
linux-arm-kernel@lists.infradead.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
linux-kernel@vger.kernel.org, Pekka Enberg <penberg@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
linuxppc-dev@lists.ozlabs.org,
"David S. Miller" <davem@davemloft.net>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC
Date: Thu, 5 Nov 2020 13:42:00 +0200 [thread overview]
Message-ID: <20201105114200.GZ4879@kernel.org> (raw)
In-Reply-To: <f9c1dc66-fc60-db4d-9670-0271adb2ed07@suse.cz>
On Wed, Nov 04, 2020 at 07:02:20PM +0100, Vlastimil Babka wrote:
> On 11/3/20 5:20 PM, Mike Rapoport wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
>
> Subject should have "on DEBUG_PAGEALLOC" ?
>
> > The design of DEBUG_PAGEALLOC presumes that __kernel_map_pages() must never
> > fail. With this assumption is wouldn't be safe to allow general usage of
> > this function.
> >
> > Moreover, some architectures that implement __kernel_map_pages() have this
> > function guarded by #ifdef DEBUG_PAGEALLOC and some refuse to map/unmap
> > pages when page allocation debugging is disabled at runtime.
> >
> > As all the users of __kernel_map_pages() were converted to use
> > debug_pagealloc_map_pages() it is safe to make it available only when
> > DEBUG_PAGEALLOC is set.
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Acked-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> > arch/Kconfig | 3 +++
> > arch/arm64/Kconfig | 4 +---
> > arch/arm64/mm/pageattr.c | 8 ++++++--
> > arch/powerpc/Kconfig | 5 +----
> > arch/riscv/Kconfig | 4 +---
> > arch/riscv/include/asm/pgtable.h | 2 --
> > arch/riscv/mm/pageattr.c | 2 ++
> > arch/s390/Kconfig | 4 +---
> > arch/sparc/Kconfig | 4 +---
> > arch/x86/Kconfig | 4 +---
> > arch/x86/mm/pat/set_memory.c | 2 ++
> > include/linux/mm.h | 10 +++++++---
> > 12 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 56b6ccc0e32d..56d4752b6db6 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -1028,6 +1028,9 @@ config HAVE_STATIC_CALL_INLINE
> > bool
> > depends on HAVE_STATIC_CALL
> > +config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + bool
> > +
> > source "kernel/gcov/Kconfig"
> > source "scripts/gcc-plugins/Kconfig"
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 1d466addb078..a932810cfd90 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -71,6 +71,7 @@ config ARM64
> > select ARCH_USE_QUEUED_RWLOCKS
> > select ARCH_USE_QUEUED_SPINLOCKS
> > select ARCH_USE_SYM_ANNOTATIONS
> > + select ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > select ARCH_SUPPORTS_MEMORY_FAILURE
> > select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
> > select ARCH_SUPPORTS_ATOMIC_RMW
> > @@ -1025,9 +1026,6 @@ config HOLES_IN_ZONE
> > source "kernel/Kconfig.hz"
> > -config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > - def_bool y
> > -
> > config ARCH_SPARSEMEM_ENABLE
> > def_bool y
> > select SPARSEMEM_VMEMMAP_ENABLE
> > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> > index 1b94f5b82654..439325532be1 100644
> > --- a/arch/arm64/mm/pageattr.c
> > +++ b/arch/arm64/mm/pageattr.c
> > @@ -155,7 +155,7 @@ int set_direct_map_invalid_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_VALID),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
> > @@ -170,7 +170,7 @@ int set_direct_map_default_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_RDONLY),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
>
> I don't understand these two hunks. Previous patch calls this for
> hibernation when CONFIG_ARCH_HAS_SET_DIRECT_MAP, which is true for arm64.
> Why suddenly this starts to depend on debug_pagealloc_enabled()?
I was confused about this for quite a long :)
On arm64 the changes to direct^w linear map are allowed when
debug_page_alloc() || rodata_full
In hibernation we essentially have now
if (1)
set_direct_map(something)
else
debug_page_alloc_map()
With debug_pagealloc enabled but with rodata_full disabled arm64
versions of set_direct_map_*() will become a nop, so a page that was
unmapped by debug_pagealloc() will not be mapped back.
I'm still puzzled how hibernation might ever need to save a free page,
but that's another story.
--
Sincerely yours,
Mike.
WARNING: multiple messages have this Message-ID (diff)
From: Mike Rapoport <rppt@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
linux-mm@kvack.org, Paul Mackerras <paulus@samba.org>,
Pavel Machek <pavel@ucw.cz>, "H. Peter Anvin" <hpa@zytor.com>,
sparclinux@vger.kernel.org, Christoph Lameter <cl@linux.com>,
Will Deacon <will@kernel.org>,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org,
Michael Ellerman <mpe@ellerman.id.au>,
x86@kernel.org, Mike Rapoport <rppt@linux.ibm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Len Brown <len.brown@intel.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Vasily Gorbik <gor@linux.ibm.com>,
linux-pm@vger.kernel.org, Heiko Carstens <hca@linux.ibm.com>,
David Rientjes <rientjes@google.com>,
Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>,
Paul Walmsley <paul.walmsley@sifive.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Thomas Gleixner <tglx@linutronix.de>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
linux-arm-kernel@lists.infradead.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
linux-kernel@vger.kernel.org, Pekka Enberg <penberg@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
linuxppc-dev@lists.ozlabs.org,
"David S. Miller" <davem@davemloft.net>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC
Date: Thu, 05 Nov 2020 11:42:00 +0000 [thread overview]
Message-ID: <20201105114200.GZ4879@kernel.org> (raw)
In-Reply-To: <f9c1dc66-fc60-db4d-9670-0271adb2ed07@suse.cz>
On Wed, Nov 04, 2020 at 07:02:20PM +0100, Vlastimil Babka wrote:
> On 11/3/20 5:20 PM, Mike Rapoport wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
>
> Subject should have "on DEBUG_PAGEALLOC" ?
>
> > The design of DEBUG_PAGEALLOC presumes that __kernel_map_pages() must never
> > fail. With this assumption is wouldn't be safe to allow general usage of
> > this function.
> >
> > Moreover, some architectures that implement __kernel_map_pages() have this
> > function guarded by #ifdef DEBUG_PAGEALLOC and some refuse to map/unmap
> > pages when page allocation debugging is disabled at runtime.
> >
> > As all the users of __kernel_map_pages() were converted to use
> > debug_pagealloc_map_pages() it is safe to make it available only when
> > DEBUG_PAGEALLOC is set.
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Acked-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> > arch/Kconfig | 3 +++
> > arch/arm64/Kconfig | 4 +---
> > arch/arm64/mm/pageattr.c | 8 ++++++--
> > arch/powerpc/Kconfig | 5 +----
> > arch/riscv/Kconfig | 4 +---
> > arch/riscv/include/asm/pgtable.h | 2 --
> > arch/riscv/mm/pageattr.c | 2 ++
> > arch/s390/Kconfig | 4 +---
> > arch/sparc/Kconfig | 4 +---
> > arch/x86/Kconfig | 4 +---
> > arch/x86/mm/pat/set_memory.c | 2 ++
> > include/linux/mm.h | 10 +++++++---
> > 12 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 56b6ccc0e32d..56d4752b6db6 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -1028,6 +1028,9 @@ config HAVE_STATIC_CALL_INLINE
> > bool
> > depends on HAVE_STATIC_CALL
> > +config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + bool
> > +
> > source "kernel/gcov/Kconfig"
> > source "scripts/gcc-plugins/Kconfig"
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 1d466addb078..a932810cfd90 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -71,6 +71,7 @@ config ARM64
> > select ARCH_USE_QUEUED_RWLOCKS
> > select ARCH_USE_QUEUED_SPINLOCKS
> > select ARCH_USE_SYM_ANNOTATIONS
> > + select ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > select ARCH_SUPPORTS_MEMORY_FAILURE
> > select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
> > select ARCH_SUPPORTS_ATOMIC_RMW
> > @@ -1025,9 +1026,6 @@ config HOLES_IN_ZONE
> > source "kernel/Kconfig.hz"
> > -config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > - def_bool y
> > -
> > config ARCH_SPARSEMEM_ENABLE
> > def_bool y
> > select SPARSEMEM_VMEMMAP_ENABLE
> > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> > index 1b94f5b82654..439325532be1 100644
> > --- a/arch/arm64/mm/pageattr.c
> > +++ b/arch/arm64/mm/pageattr.c
> > @@ -155,7 +155,7 @@ int set_direct_map_invalid_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_VALID),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
> > @@ -170,7 +170,7 @@ int set_direct_map_default_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_RDONLY),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
>
> I don't understand these two hunks. Previous patch calls this for
> hibernation when CONFIG_ARCH_HAS_SET_DIRECT_MAP, which is true for arm64.
> Why suddenly this starts to depend on debug_pagealloc_enabled()?
I was confused about this for quite a long :)
On arm64 the changes to direct^w linear map are allowed when
debug_page_alloc() || rodata_full
In hibernation we essentially have now
if (1)
set_direct_map(something)
else
debug_page_alloc_map()
With debug_pagealloc enabled but with rodata_full disabled arm64
versions of set_direct_map_*() will become a nop, so a page that was
unmapped by debug_pagealloc() will not be mapped back.
I'm still puzzled how hibernation might ever need to save a free page,
but that's another story.
--
Sincerely yours,
Mike.
WARNING: multiple messages have this Message-ID (diff)
From: Mike Rapoport <rppt@kernel.org>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: David Hildenbrand <david@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
linux-mm@kvack.org, Paul Mackerras <paulus@samba.org>,
Pavel Machek <pavel@ucw.cz>, "H. Peter Anvin" <hpa@zytor.com>,
sparclinux@vger.kernel.org, Christoph Lameter <cl@linux.com>,
Will Deacon <will@kernel.org>,
linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org,
Michael Ellerman <mpe@ellerman.id.au>,
x86@kernel.org, Mike Rapoport <rppt@linux.ibm.com>,
Christian Borntraeger <borntraeger@de.ibm.com>,
Ingo Molnar <mingo@redhat.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Len Brown <len.brown@intel.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Vasily Gorbik <gor@linux.ibm.com>,
linux-pm@vger.kernel.org, Heiko Carstens <hca@linux.ibm.com>,
David Rientjes <rientjes@google.com>,
Borislav Petkov <bp@alien8.de>, Andy Lutomirski <luto@kernel.org>,
Paul Walmsley <paul.walmsley@sifive.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Thomas Gleixner <tglx@linutronix.de>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
linux-arm-kernel@lists.infradead.org,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
linux-kernel@vger.kernel.org, Pekka Enberg <penberg@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Edgecombe, Rick P" <rick.p.edgecombe@intel.com>,
linuxppc-dev@lists.ozlabs.org,
"David S. Miller" <davem@davemloft.net>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>
Subject: Re: [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC
Date: Thu, 5 Nov 2020 13:42:00 +0200 [thread overview]
Message-ID: <20201105114200.GZ4879@kernel.org> (raw)
In-Reply-To: <f9c1dc66-fc60-db4d-9670-0271adb2ed07@suse.cz>
On Wed, Nov 04, 2020 at 07:02:20PM +0100, Vlastimil Babka wrote:
> On 11/3/20 5:20 PM, Mike Rapoport wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
>
> Subject should have "on DEBUG_PAGEALLOC" ?
>
> > The design of DEBUG_PAGEALLOC presumes that __kernel_map_pages() must never
> > fail. With this assumption is wouldn't be safe to allow general usage of
> > this function.
> >
> > Moreover, some architectures that implement __kernel_map_pages() have this
> > function guarded by #ifdef DEBUG_PAGEALLOC and some refuse to map/unmap
> > pages when page allocation debugging is disabled at runtime.
> >
> > As all the users of __kernel_map_pages() were converted to use
> > debug_pagealloc_map_pages() it is safe to make it available only when
> > DEBUG_PAGEALLOC is set.
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Acked-by: David Hildenbrand <david@redhat.com>
> > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> > ---
> > arch/Kconfig | 3 +++
> > arch/arm64/Kconfig | 4 +---
> > arch/arm64/mm/pageattr.c | 8 ++++++--
> > arch/powerpc/Kconfig | 5 +----
> > arch/riscv/Kconfig | 4 +---
> > arch/riscv/include/asm/pgtable.h | 2 --
> > arch/riscv/mm/pageattr.c | 2 ++
> > arch/s390/Kconfig | 4 +---
> > arch/sparc/Kconfig | 4 +---
> > arch/x86/Kconfig | 4 +---
> > arch/x86/mm/pat/set_memory.c | 2 ++
> > include/linux/mm.h | 10 +++++++---
> > 12 files changed, 26 insertions(+), 26 deletions(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 56b6ccc0e32d..56d4752b6db6 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -1028,6 +1028,9 @@ config HAVE_STATIC_CALL_INLINE
> > bool
> > depends on HAVE_STATIC_CALL
> > +config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > + bool
> > +
> > source "kernel/gcov/Kconfig"
> > source "scripts/gcc-plugins/Kconfig"
> > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> > index 1d466addb078..a932810cfd90 100644
> > --- a/arch/arm64/Kconfig
> > +++ b/arch/arm64/Kconfig
> > @@ -71,6 +71,7 @@ config ARM64
> > select ARCH_USE_QUEUED_RWLOCKS
> > select ARCH_USE_QUEUED_SPINLOCKS
> > select ARCH_USE_SYM_ANNOTATIONS
> > + select ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > select ARCH_SUPPORTS_MEMORY_FAILURE
> > select ARCH_SUPPORTS_SHADOW_CALL_STACK if CC_HAVE_SHADOW_CALL_STACK
> > select ARCH_SUPPORTS_ATOMIC_RMW
> > @@ -1025,9 +1026,6 @@ config HOLES_IN_ZONE
> > source "kernel/Kconfig.hz"
> > -config ARCH_SUPPORTS_DEBUG_PAGEALLOC
> > - def_bool y
> > -
> > config ARCH_SPARSEMEM_ENABLE
> > def_bool y
> > select SPARSEMEM_VMEMMAP_ENABLE
> > diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> > index 1b94f5b82654..439325532be1 100644
> > --- a/arch/arm64/mm/pageattr.c
> > +++ b/arch/arm64/mm/pageattr.c
> > @@ -155,7 +155,7 @@ int set_direct_map_invalid_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_VALID),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
> > @@ -170,7 +170,7 @@ int set_direct_map_default_noflush(struct page *page)
> > .clear_mask = __pgprot(PTE_RDONLY),
> > };
> > - if (!rodata_full)
> > + if (!debug_pagealloc_enabled() && !rodata_full)
> > return 0;
> > return apply_to_page_range(&init_mm,
>
> I don't understand these two hunks. Previous patch calls this for
> hibernation when CONFIG_ARCH_HAS_SET_DIRECT_MAP, which is true for arm64.
> Why suddenly this starts to depend on debug_pagealloc_enabled()?
I was confused about this for quite a long :)
On arm64 the changes to direct^w linear map are allowed when
debug_page_alloc() || rodata_full
In hibernation we essentially have now
if (1)
set_direct_map(something)
else
debug_page_alloc_map()
With debug_pagealloc enabled but with rodata_full disabled arm64
versions of set_direct_map_*() will become a nop, so a page that was
unmapped by debug_pagealloc() will not be mapped back.
I'm still puzzled how hibernation might ever need to save a free page,
but that's another story.
--
Sincerely yours,
Mike.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-11-05 11:42 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-03 16:20 [PATCH v4 0/4] arch, mm: improve robustness of direct map manipulation Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` [PATCH v4 1/4] mm: introduce debug_pagealloc_map_pages() helper Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-04 17:35 ` Vlastimil Babka
2020-11-04 17:35 ` Vlastimil Babka
2020-11-04 17:35 ` Vlastimil Babka
2020-11-04 17:35 ` Vlastimil Babka
2020-11-04 17:35 ` Vlastimil Babka
2020-11-05 11:31 ` Mike Rapoport
2020-11-05 11:31 ` Mike Rapoport
2020-11-05 11:31 ` Mike Rapoport
2020-11-05 11:31 ` Mike Rapoport
2020-11-05 11:31 ` Mike Rapoport
2020-11-03 16:20 ` [PATCH v4 2/4] PM: hibernate: make direct map manipulations more explicit Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-04 17:40 ` Vlastimil Babka
2020-11-04 17:40 ` Vlastimil Babka
2020-11-04 17:40 ` Vlastimil Babka
2020-11-04 17:40 ` Vlastimil Babka
2020-11-04 17:40 ` Vlastimil Babka
2020-11-05 11:33 ` Mike Rapoport
2020-11-05 11:33 ` Mike Rapoport
2020-11-05 11:33 ` Mike Rapoport
2020-11-05 11:33 ` Mike Rapoport
2020-11-05 11:33 ` Mike Rapoport
2020-11-03 16:20 ` [PATCH v4 3/4] arch, mm: restore dependency of __kernel_map_pages() of DEBUG_PAGEALLOC Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-04 18:02 ` Vlastimil Babka
2020-11-04 18:02 ` Vlastimil Babka
2020-11-04 18:02 ` Vlastimil Babka
2020-11-04 18:02 ` Vlastimil Babka
2020-11-04 18:02 ` Vlastimil Babka
2020-11-05 11:42 ` Mike Rapoport [this message]
2020-11-05 11:42 ` Mike Rapoport
2020-11-05 11:42 ` Mike Rapoport
2020-11-05 11:42 ` Mike Rapoport
2020-11-05 11:42 ` Mike Rapoport
2020-11-03 16:20 ` [PATCH v4 4/4] arch, mm: make kernel_page_present() always available Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
2020-11-03 16:20 ` Mike Rapoport
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201105114200.GZ4879@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=aou@eecs.berkeley.edu \
--cc=benh@kernel.crashing.org \
--cc=borntraeger@de.ibm.com \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=cl@linux.com \
--cc=dave.hansen@linux.intel.com \
--cc=davem@davemloft.net \
--cc=david@redhat.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=kirill@shutemov.name \
--cc=len.brown@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-s390@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=paulus@samba.org \
--cc=pavel@ucw.cz \
--cc=penberg@kernel.org \
--cc=peterz@infradead.org \
--cc=rick.p.edgecombe@intel.com \
--cc=rientjes@google.com \
--cc=rjw@rjwysocki.net \
--cc=rppt@linux.ibm.com \
--cc=sparclinux@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=vbabka@suse.cz \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.