• matthieu castet's avatar
    x86: Fix improper large page preservation · 64edc8ed
    matthieu castet authored
    This patch fixes a bug in try_preserve_large_page() which may
    result in improper large page preservation and improper
    application of page attributes to the memory area outside of the
    original change request.
    
    More specifically, the problem manifests itself when set_memory_*()
    is called for several pages at the beginning of the large page and
    try_preserve_large_page() erroneously concludes that the change can
    be applied to whole large page.
    
    The fix consists of 3 parts:
    
      1. Addition of "required" protection attributes in
         static_protections(), so .data and .bss can be guaranteed to
         stay "RW"
    
      2. static_protections() is now called for every small
         page within large page to determine compatibility of new
         protection attributes (instead of just small pages within the
         requested range).
    
      3. Large page can be preserved only if attribute change is
         large-page-aligned and covers whole large page.
    
     -v1: Try_preserve_large_page() patch for Linux 2.6.34-rc2
     -v2: Replaced pfn check with address check for kernel rw-data
    Signed-off-by: default avatarSiarhei Liakh <sliakh.lkml@gmail.com>
    Signed-off-by: default avatarXuxian Jiang <jiang@cs.ncsu.edu>
    Reviewed-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
    Cc: Arjan van de Ven <arjan@infradead.org>
    Cc: James Morris <jmorris@namei.org>
    Cc: Andi Kleen <ak@muc.de>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    Cc: Dave Jones <davej@redhat.com>
    Cc: Kees Cook <kees.cook@canonical.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    LKML-Reference: <4CE2F7F3.8030809@free.fr>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    64edc8ed
pageattr.c 33.8 KB