diff options
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/controllers/memcg_test.txt | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/Documentation/controllers/memcg_test.txt b/Documentation/controllers/memcg_test.txt index c91f69b0b549..08d4d3ea0d79 100644 --- a/Documentation/controllers/memcg_test.txt +++ b/Documentation/controllers/memcg_test.txt | |||
@@ -1,6 +1,6 @@ | |||
1 | Memory Resource Controller(Memcg) Implementation Memo. | 1 | Memory Resource Controller(Memcg) Implementation Memo. |
2 | Last Updated: 2008/12/10 | 2 | Last Updated: 2008/12/15 |
3 | Base Kernel Version: based on 2.6.28-rc7-mm. | 3 | Base Kernel Version: based on 2.6.28-rc8-mm. |
4 | 4 | ||
5 | Because VM is getting complex (one of reasons is memcg...), memcg's behavior | 5 | Because VM is getting complex (one of reasons is memcg...), memcg's behavior |
6 | is complex. This is a document for memcg's internal behavior. | 6 | 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. | |||
111 | (b) If the SwapCache has been mapped by processes, it has been | 111 | (b) If the SwapCache has been mapped by processes, it has been |
112 | charged already. | 112 | charged already. |
113 | 113 | ||
114 | In case (a), we charge it. In case (b), we don't charge it. | 114 | This swap-in is one of the most complicated work. In do_swap_page(), |
115 | (But racy state between (a) and (b) exists. We do check it.) | 115 | following events occur when pte is unchanged. |
116 | At charging, a charge recorded in swap_cgroup is moved to page_cgroup. | 116 | |
117 | (1) the page (SwapCache) is looked up. | ||
118 | (2) lock_page() | ||
119 | (3) try_charge_swapin() | ||
120 | (4) reuse_swap_page() (may call delete_swap_cache()) | ||
121 | (5) commit_charge_swapin() | ||
122 | (6) swap_free(). | ||
123 | |||
124 | Considering following situation for example. | ||
125 | |||
126 | (A) The page has not been charged before (2) and reuse_swap_page() | ||
127 | doesn't call delete_from_swap_cache(). | ||
128 | (B) The page has not been charged before (2) and reuse_swap_page() | ||
129 | calls delete_from_swap_cache(). | ||
130 | (C) The page has been charged before (2) and reuse_swap_page() doesn't | ||
131 | call delete_from_swap_cache(). | ||
132 | (D) The page has been charged before (2) and reuse_swap_page() calls | ||
133 | delete_from_swap_cache(). | ||
134 | |||
135 | memory.usage/memsw.usage changes to this page/swp_entry will be | ||
136 | Case (A) (B) (C) (D) | ||
137 | Event | ||
138 | Before (2) 0/ 1 0/ 1 1/ 1 1/ 1 | ||
139 | =========================================== | ||
140 | (3) +1/+1 +1/+1 +1/+1 +1/+1 | ||
141 | (4) - 0/ 0 - -1/ 0 | ||
142 | (5) 0/-1 0/ 0 -1/-1 0/ 0 | ||
143 | (6) - 0/-1 - 0/-1 | ||
144 | =========================================== | ||
145 | Result 1/ 1 1/ 1 1/ 1 1/ 1 | ||
146 | |||
147 | In any cases, charges to this page should be 1/ 1. | ||
117 | 148 | ||
118 | 4.2 Swap-out. | 149 | 4.2 Swap-out. |
119 | At swap-out, typical state transition is below. | 150 | At swap-out, typical state transition is below. |