• Andrew Morton's avatar
    [PATCH] page unmapping debug · 98eb235b
    Andrew Morton authored
    From: Manfred Spraul <manfred@colorfullife.com>
    
    Manfred's latest page unmapping debug patch.
    
    The patch adds support for a special debug mode to both the page and the slab
    allocator: Unused pages are removed from the kernel linear mapping.  This
    means that now any access to freed memory will cause an immediate exception.
    Right now, read accesses remain totally unnoticed and write accesses may be
    catched by the slab poisoning, but usually far too late for a meaningfull bug
    report.
    
    The implementation is based on a new arch dependant function,
    kernel_map_pages(), that removes the pages from the linear mapping.  It's
    right now only implemented for i386.
    
    Changelog:
    
    - Add kernel_map_pages() for i386, based on change_page_attr.  If
      DEBUG_PAGEALLOC is not set, then the function is an empty stub.  The stub
      is in <linux/mm.h>, i.e.  it exists for all archs.
    
    - Make change_page_attr irq safe.  Note that it's not fully irq safe due to
      the lack of the tlb flush ipi, but it's good enough for kernel_map_pages().
       Another problem is that kernel_map_pages is not permitted to fail, thus
      PSE is disabled if DEBUG_PAGEALLOC is enabled
    
    - use kernel_map pages for the page allocator.
    
    - use kernel_map_pages for the slab allocator.
    
      I couldn't resist and added additional debugging support into mm/slab.c:
    
      * at kfree time, the complete backtrace of the kfree caller is stored
        in the freed object.
    
      * a ptrinfo() function that dumps all known data about a kernel virtual
        address: the pte value, if it belongs to a slab cache the cache name and
        additional info.
    
      * merging of common code: new helper function obj_dbglen and obj_dbghdr
        for the conversion between the user visible object pointers/len and the
        actual, internal addresses and len values.
    98eb235b
cacheflush.h 874 Bytes