• Pallipadi, Venkatesh's avatar
    x86, pat: Fix set_memory_wc related corruption · bdc6340f
    Pallipadi, Venkatesh authored
    Changeset 3869c4aa
    that went in after 2.6.30-rc1 was a seemingly small change to _set_memory_wc()
    to make it complaint with SDM requirements. But, introduced a nasty bug, which
    can result in crash and/or strange corruptions when set_memory_wc is used.
    One such crash reported here
    http://lkml.org/lkml/2009/7/30/94
    
    Actually, that changeset introduced two bugs.
    * change_page_attr_set() takes &addr as first argument and can the addr value
      might have changed on return, even for single page change_page_attr_set()
      call. That will make the second change_page_attr_set() in this routine
      operate on unrelated addr, that can eventually cause strange corruptions
      and bad page state crash.
    * The second change_page_attr_set() call, before setting _PAGE_CACHE_WC, should
      clear the earlier _PAGE_CACHE_UC_MINUS, as otherwise cache attribute will not
      be WC (will be UC instead).
    
    The patch below fixes both these problems. Sending a single patch to fix both
    the problems, as the change is to the same line of code. The change to have a
    addr_copy is not very clean. But, it is simpler than making more changes
    through various routines in pageattr.c.
    
    A huge thanks to Jerome for reporting this problem and providing a simple test
    case that helped us root cause the problem.
    Reported-by: default avatarJerome Glisse <glisse@freedesktop.org>
    Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
    Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
    LKML-Reference: <20090730214319.GA1889@linux-os.sc.intel.com>
    Acked-by: default avatarDave Airlie <airlied@redhat.com>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    bdc6340f
pageattr.c 30.9 KB