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;
 }