|
@@ -993,6 +993,16 @@ void mem_cgroup_add_lru_list(struct page *page, enum lru_list lru)
|
|
|
return;
|
|
|
pc = lookup_page_cgroup(page);
|
|
|
VM_BUG_ON(PageCgroupAcctLRU(pc));
|
|
|
+ /*
|
|
|
+ * putback: charge:
|
|
|
+ * SetPageLRU SetPageCgroupUsed
|
|
|
+ * smp_mb smp_mb
|
|
|
+ * PageCgroupUsed && add to memcg LRU PageLRU && add to memcg LRU
|
|
|
+ *
|
|
|
+ * Ensure that one of the two sides adds the page to the memcg
|
|
|
+ * LRU during a race.
|
|
|
+ */
|
|
|
+ smp_mb();
|
|
|
if (!PageCgroupUsed(pc))
|
|
|
return;
|
|
|
/* Ensure pc->mem_cgroup is visible after reading PCG_USED. */
|
|
@@ -1044,7 +1054,16 @@ static void mem_cgroup_lru_add_after_commit(struct page *page)
|
|
|
unsigned long flags;
|
|
|
struct zone *zone = page_zone(page);
|
|
|
struct page_cgroup *pc = lookup_page_cgroup(page);
|
|
|
-
|
|
|
+ /*
|
|
|
+ * putback: charge:
|
|
|
+ * SetPageLRU SetPageCgroupUsed
|
|
|
+ * smp_mb smp_mb
|
|
|
+ * PageCgroupUsed && add to memcg LRU PageLRU && add to memcg LRU
|
|
|
+ *
|
|
|
+ * Ensure that one of the two sides adds the page to the memcg
|
|
|
+ * LRU during a race.
|
|
|
+ */
|
|
|
+ smp_mb();
|
|
|
/* taking care of that the page is added to LRU while we commit it */
|
|
|
if (likely(!PageLRU(page)))
|
|
|
return;
|