x86, PAT: Change order of cpa and free in set_memory_wb
authorvenkatesh.pallipadi@intel.com <venkatesh.pallipadi@intel.com>
Thu, 9 Apr 2009 21:26:48 +0000 (14:26 -0700)
committerIngo Molnar <mingo@elte.hu>
Fri, 10 Apr 2009 11:55:46 +0000 (13:55 +0200)
To be free of aliasing due to races, set_memory_* interfaces should
follow ordering of reserving, changing memtype to UC/WC, changing
memtype back to WB followed by free.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
LKML-Reference: <20090409212708.512280000@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/pageattr.c

index d71e1b636ce69167515c0a6bd3b47d3807b49175..d487eaa17bffbae1e261bfddce14e638013bf364 100644 (file)
@@ -1021,15 +1021,19 @@ int _set_memory_wb(unsigned long addr, int numpages)
 
 int set_memory_wb(unsigned long addr, int numpages)
 {
+       int ret = _set_memory_wb(addr, numpages);
        free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
-
-       return _set_memory_wb(addr, numpages);
+       return ret;
 }
 EXPORT_SYMBOL(set_memory_wb);
 
 int set_memory_array_wb(unsigned long *addr, int addrinarray)
 {
        int i;
+       int ret;
+
+       ret = change_page_attr_clear(addr, addrinarray,
+                                     __pgprot(_PAGE_CACHE_MASK), 1);
 
        for (i = 0; i < addrinarray; i++) {
                unsigned long start = __pa(addr[i]);
@@ -1042,8 +1046,7 @@ int set_memory_array_wb(unsigned long *addr, int addrinarray)
                }
                free_memtype(start, end);
        }
-       return change_page_attr_clear(addr, addrinarray,
-                                     __pgprot(_PAGE_CACHE_MASK), 1);
+       return ret;
 }
 EXPORT_SYMBOL(set_memory_array_wb);