]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - mm/memcontrol.c
memcg: fix swap accounting leak
[net-next-2.6.git] / mm / memcontrol.c
index a7ecf23150c50b88168f8514fbeb3d0766303168..0ed61e27d526ebc249754d4952da76db66e637d5 100644 (file)
@@ -1169,10 +1169,11 @@ void mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *ptr)
        /*
         * Now swap is on-memory. This means this page may be
         * counted both as mem and swap....double count.
-        * Fix it by uncharging from memsw. This SwapCache is stable
-        * because we're still under lock_page().
+        * Fix it by uncharging from memsw. Basically, this SwapCache is stable
+        * under lock_page(). But in do_swap_page()::memory.c, reuse_swap_page()
+        * may call delete_from_swap_cache() before reach here.
         */
-       if (do_swap_account) {
+       if (do_swap_account && PageSwapCache(page)) {
                swp_entry_t ent = {.val = page_private(page)};
                struct mem_cgroup *memcg;
                memcg = swap_cgroup_record(ent, NULL);