cpuset: mm: reduce large amounts of memory barrier related damage v3
[deliverable/linux.git] / mm / filemap.c
index f3230604006cc69edf6c531ed6731a456390b59b..843042045dc99821864f50c1cb53c732f093c4e3 100644 (file)
@@ -499,10 +499,13 @@ struct page *__page_cache_alloc(gfp_t gfp)
        struct page *page;
 
        if (cpuset_do_page_mem_spread()) {
-               get_mems_allowed();
-               n = cpuset_mem_spread_node();
-               page = alloc_pages_exact_node(n, gfp, 0);
-               put_mems_allowed();
+               unsigned int cpuset_mems_cookie;
+               do {
+                       cpuset_mems_cookie = get_mems_allowed();
+                       n = cpuset_mem_spread_node();
+                       page = alloc_pages_exact_node(n, gfp, 0);
+               } while (!put_mems_allowed(cpuset_mems_cookie) && !page);
+
                return page;
        }
        return alloc_pages(gfp, 0);
This page took 0.033798 seconds and 5 git commands to generate.