]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - Documentation/controllers/memcg_test.txt
memcg: fix swap accounting leak
[linux-2.6-omap-h63xx.git] / Documentation / controllers / memcg_test.txt
index c91f69b0b549f455cae716c7585b02722436e895..08d4d3ea0d79696444af3785fb82eda617346bbb 100644 (file)
@@ -1,6 +1,6 @@
 Memory Resource Controller(Memcg)  Implementation Memo.
-Last Updated: 2008/12/10
-Base Kernel Version: based on 2.6.28-rc7-mm.
+Last Updated: 2008/12/15
+Base Kernel Version: based on 2.6.28-rc8-mm.
 
 Because VM is getting complex (one of reasons is memcg...), memcg's behavior
 is complex. This is a document for memcg's internal behavior.
@@ -111,9 +111,40 @@ Under below explanation, we assume CONFIG_MEM_RES_CTRL_SWAP=y.
        (b) If the SwapCache has been mapped by processes, it has been
            charged already.
 
-       In case (a), we charge it. In case (b), we don't charge it.
-       (But racy state between (a) and (b) exists. We do check it.)
-       At charging, a charge recorded in swap_cgroup is moved to page_cgroup.
+       This swap-in is one of the most complicated work. In do_swap_page(),
+       following events occur when pte is unchanged.
+
+       (1) the page (SwapCache) is looked up.
+       (2) lock_page()
+       (3) try_charge_swapin()
+       (4) reuse_swap_page() (may call delete_swap_cache())
+       (5) commit_charge_swapin()
+       (6) swap_free().
+
+       Considering following situation for example.
+
+       (A) The page has not been charged before (2) and reuse_swap_page()
+           doesn't call delete_from_swap_cache().
+       (B) The page has not been charged before (2) and reuse_swap_page()
+           calls delete_from_swap_cache().
+       (C) The page has been charged before (2) and reuse_swap_page() doesn't
+           call delete_from_swap_cache().
+       (D) The page has been charged before (2) and reuse_swap_page() calls
+           delete_from_swap_cache().
+
+           memory.usage/memsw.usage changes to this page/swp_entry will be
+        Case          (A)      (B)       (C)     (D)
+         Event
+       Before (2)     0/ 1     0/ 1      1/ 1    1/ 1
+          ===========================================
+          (3)        +1/+1    +1/+1     +1/+1   +1/+1
+          (4)          -       0/ 0       -     -1/ 0
+          (5)         0/-1     0/ 0     -1/-1    0/ 0
+          (6)          -       0/-1       -      0/-1
+          ===========================================
+       Result         1/ 1     1/ 1      1/ 1    1/ 1
+
+       In any cases, charges to this page should be 1/ 1.
 
        4.2 Swap-out.
        At swap-out, typical state transition is below.