mm/mmzone.c: use try_cmpxchg() in page_cpupid_xchg_last()
[linux-2.6-microblaze.git] / mm / mmzone.c
index eb89d6e..d8a9b0e 100644 (file)
@@ -89,13 +89,14 @@ int page_cpupid_xchg_last(struct page *page, int cpupid)
        unsigned long old_flags, flags;
        int last_cpupid;
 
+       old_flags = READ_ONCE(page->flags);
        do {
-               old_flags = flags = page->flags;
-               last_cpupid = page_cpupid_last(page);
+               flags = old_flags;
+               last_cpupid = (flags >> LAST_CPUPID_PGSHIFT) & LAST_CPUPID_MASK;
 
                flags &= ~(LAST_CPUPID_MASK << LAST_CPUPID_PGSHIFT);
                flags |= (cpupid & LAST_CPUPID_MASK) << LAST_CPUPID_PGSHIFT;
-       } while (unlikely(cmpxchg(&page->flags, old_flags, flags) != old_flags));
+       } while (unlikely(!try_cmpxchg(&page->flags, &old_flags, flags)));
 
        return last_cpupid;
 }