unsigned long usage)
 {
        unsigned long protected, old_protected;
+       unsigned long low;
        long delta;
 
        if (!c->parent)
                        atomic_long_add(delta, &c->parent->children_min_usage);
        }
 
-       if (c->low || atomic_long_read(&c->low_usage)) {
-               protected = min(usage, c->low);
+       low = READ_ONCE(c->low);
+       if (low || atomic_long_read(&c->low_usage)) {
+               protected = min(usage, low);
                old_protected = atomic_long_xchg(&c->low_usage, protected);
                delta = protected - old_protected;
                if (delta)
 {
        struct page_counter *c;
 
-       counter->low = nr_pages;
+       WRITE_ONCE(counter->low, nr_pages);
 
        for (c = counter; c; c = c->parent)
                propagate_protected_usage(c, atomic_long_read(&c->usage));