• M
    mm: introduce debug_pagealloc_{map,unmap}_pages() helpers · 77bc7fd6
    Mike Rapoport 提交于
    Patch series "arch, mm: improve robustness of direct map manipulation", v7.
    
    During recent discussion about KVM protected memory, David raised a
    concern about usage of __kernel_map_pages() outside of DEBUG_PAGEALLOC
    scope [1].
    
    Indeed, for architectures that define CONFIG_ARCH_HAS_SET_DIRECT_MAP it is
    possible that __kernel_map_pages() would fail, but since this function is
    void, the failure will go unnoticed.
    
    Moreover, there's lack of consistency of __kernel_map_pages() semantics
    across architectures as some guard this function with #ifdef
    DEBUG_PAGEALLOC, some refuse to update the direct map if page allocation
    debugging is disabled at run time and some allow modifying the direct map
    regardless of DEBUG_PAGEALLOC settings.
    
    This set straightens this out by restoring dependency of
    __kernel_map_pages() on DEBUG_PAGEALLOC and updating the call sites
    accordingly.
    
    Since currently the only user of __kernel_map_pages() outside
    DEBUG_PAGEALLOC is hibernation, it is updated to make direct map accesses
    there more explicit.
    
    [1] https://lore.kernel.org/lkml/2759b4bf-e1e3-d006-7d86-78a40348269d@redhat.com
    
    This patch (of 4):
    
    When CONFIG_DEBUG_PAGEALLOC is enabled, it unmaps pages from the kernel
    direct mapping after free_pages().  The pages than need to be mapped back
    before they could be used.  Theese mapping operations use
    __kernel_map_pages() guarded with with debug_pagealloc_enabled().
    
    The only place that calls __kernel_map_pages() without checking whether
    DEBUG_PAGEALLOC is enabled is the hibernation code that presumes
    availability of this function when ARCH_HAS_SET_DIRECT_MAP is set.  Still,
    on arm64, __kernel_map_pages() will bail out when DEBUG_PAGEALLOC is not
    enabled but set_direct_map_invalid_noflush() may render some pages not
    present in the direct map and hibernation code won't be able to save such
    pages.
    
    To make page allocation debugging and hibernation interaction more robust,
    the dependency on DEBUG_PAGEALLOC or ARCH_HAS_SET_DIRECT_MAP has to be
    made more explicit.
    
    Start with combining the guard condition and the call to
    __kernel_map_pages() into debug_pagealloc_map_pages() and
    debug_pagealloc_unmap_pages() functions to emphasize that
    __kernel_map_pages() should not be called without DEBUG_PAGEALLOC and use
    these new functions to map/unmap pages when page allocation debugging is
    enabled.
    
    Link: https://lkml.kernel.org/r/20201109192128.960-1-rppt@kernel.org
    Link: https://lkml.kernel.org/r/20201109192128.960-2-rppt@kernel.orgSigned-off-by: NMike Rapoport <rppt@linux.ibm.com>
    Reviewed-by: NDavid Hildenbrand <david@redhat.com>
    Acked-by: NKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Acked-by: NVlastimil Babka <vbabka@suse.cz>
    Cc: Albert Ou <aou@eecs.berkeley.edu>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Heiko Carstens <hca@linux.ibm.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Len Brown <len.brown@intel.com>
    Cc: Michael Ellerman <mpe@ellerman.id.au>
    Cc: Palmer Dabbelt <palmer@dabbelt.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    Cc: Pavel Machek <pavel@ucw.cz>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vasily Gorbik <gor@linux.ibm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    77bc7fd6
mm.h 99.8 KB