• D
    x86/mpx: Rewrite the unmap code · 3ceaccdf
    Dave Hansen 提交于
    The MPX code needs to clear out bounds tables for memory which
    is no longer in use.  We do this when a userspace mapping is
    torn down (unmapped).
    
    There are two modes:
    
      1. An entire bounds table becomes unused, and can be freed
         and its pointer removed from the bounds directory.  This
         happens either when a large mapping is torn down, or when
         a small mapping is torn down and it is the last mapping
         "covered" by a bounds table.
    
      2. Only part of a bounds table becomes unused, in which case
         we free the backing memory as if MADV_DONTNEED was called.
    
    The old code was a spaghetti mess of "edge" bounds tables
    where the edges were handled specially, even if we were
    unmapping an entire one.  Non-edge bounds tables are always
    fully unmapped, but share a different code path from the edge
    ones.  The old code had a bug where it was unmapping too much
    memory.  I worked on fixing it for two days and gave up.
    
    I didn't write the original code.  I didn't particularly like
    it, but it worked, so I left it.  After my debug session, I
    realized it was undebuggagle *and* buggy, so out it went.
    
    I also wrote a new unmapping test program which uncovers bugs
    pretty nicely.
    Signed-off-by: NDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: NThomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Dave Hansen <dave@sr71.net>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20150607183706.DCAEC67D@viggo.jf.intel.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    3ceaccdf
mpx.c 27.8 KB