mm: shmem: avoid atomic operation during shmem_getpage_gfp
authorMel Gorman <mgorman@suse.de>
Thu, 28 Aug 2014 18:35:28 +0000 (19:35 +0100)
committerJiri Slaby <jslaby@suse.cz>
Fri, 26 Sep 2014 09:52:04 +0000 (11:52 +0200)
commit 07a427884348d38a6fd56fa4d78249c407196650 upstream.

shmem_getpage_gfp uses an atomic operation to set the SwapBacked field
before it's even added to the LRU or visible.  This is unnecessary as what
could it possible race against?  Use an unlocked variant.

Signed-off-by: Mel Gorman <mgorman@suse.de>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Rik van Riel <riel@redhat.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Jan Kara <jack@suse.cz>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Hugh Dickins <hughd@google.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
include/linux/page-flags.h
mm/shmem.c

index 67fc8a246a07da33319e32a7a5c706671ff7a7e6..0d1b0357ca851172645bbbfd57af8b9cbf6f3fde 100644 (file)
@@ -208,6 +208,7 @@ PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */
 PAGEFLAG(SavePinned, savepinned);                      /* Xen */
 PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
 PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
+       __SETPAGEFLAG(SwapBacked, swapbacked)
 
 __PAGEFLAG(SlobFree, slob_free)
 
index 15e5527934ad52f3107b8491fc972b71a2063e3a..8572e8e39afb7e37b7c794bdaa1368cb2c396191 100644 (file)
@@ -1142,7 +1142,7 @@ repeat:
                        goto decused;
                }
 
-               SetPageSwapBacked(page);
+               __SetPageSwapBacked(page);
                __set_page_locked(page);
                error = mem_cgroup_cache_charge(page, current->mm,
                                                gfp & GFP_RECLAIM_MASK);