xref: /openbmc/linux/Documentation/admin-guide/cgroup-v1/memcg_test.rst (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1da82c92fSMauro Carvalho Chehab=====================================================
2da82c92fSMauro Carvalho ChehabMemory Resource Controller(Memcg) Implementation Memo
3da82c92fSMauro Carvalho Chehab=====================================================
4da82c92fSMauro Carvalho Chehab
5da82c92fSMauro Carvalho ChehabLast Updated: 2010/2
6da82c92fSMauro Carvalho Chehab
7da82c92fSMauro Carvalho ChehabBase Kernel Version: based on 2.6.33-rc7-mm(candidate for 34).
8da82c92fSMauro Carvalho Chehab
9da82c92fSMauro Carvalho ChehabBecause VM is getting complex (one of reasons is memcg...), memcg's behavior
10da82c92fSMauro Carvalho Chehabis complex. This is a document for memcg's internal behavior.
11da82c92fSMauro Carvalho ChehabPlease note that implementation details can be changed.
12da82c92fSMauro Carvalho Chehab
13da82c92fSMauro Carvalho Chehab(*) Topics on API should be in Documentation/admin-guide/cgroup-v1/memory.rst)
14da82c92fSMauro Carvalho Chehab
15da82c92fSMauro Carvalho Chehab0. How to record usage ?
16da82c92fSMauro Carvalho Chehab========================
17da82c92fSMauro Carvalho Chehab
18da82c92fSMauro Carvalho Chehab   2 objects are used.
19da82c92fSMauro Carvalho Chehab
20da82c92fSMauro Carvalho Chehab   page_cgroup ....an object per page.
21da82c92fSMauro Carvalho Chehab
22da82c92fSMauro Carvalho Chehab	Allocated at boot or memory hotplug. Freed at memory hot removal.
23da82c92fSMauro Carvalho Chehab
24da82c92fSMauro Carvalho Chehab   swap_cgroup ... an entry per swp_entry.
25da82c92fSMauro Carvalho Chehab
26da82c92fSMauro Carvalho Chehab	Allocated at swapon(). Freed at swapoff().
27da82c92fSMauro Carvalho Chehab
28da82c92fSMauro Carvalho Chehab   The page_cgroup has USED bit and double count against a page_cgroup never
29da82c92fSMauro Carvalho Chehab   occurs. swap_cgroup is used only when a charged page is swapped-out.
30da82c92fSMauro Carvalho Chehab
31da82c92fSMauro Carvalho Chehab1. Charge
32da82c92fSMauro Carvalho Chehab=========
33da82c92fSMauro Carvalho Chehab
34da82c92fSMauro Carvalho Chehab   a page/swp_entry may be charged (usage += PAGE_SIZE) at
35da82c92fSMauro Carvalho Chehab
36da82c92fSMauro Carvalho Chehab	mem_cgroup_try_charge()
37da82c92fSMauro Carvalho Chehab
38da82c92fSMauro Carvalho Chehab2. Uncharge
39da82c92fSMauro Carvalho Chehab===========
40da82c92fSMauro Carvalho Chehab
41da82c92fSMauro Carvalho Chehab  a page/swp_entry may be uncharged (usage -= PAGE_SIZE) by
42da82c92fSMauro Carvalho Chehab
43da82c92fSMauro Carvalho Chehab	mem_cgroup_uncharge()
44da82c92fSMauro Carvalho Chehab	  Called when a page's refcount goes down to 0.
45da82c92fSMauro Carvalho Chehab
46da82c92fSMauro Carvalho Chehab	mem_cgroup_uncharge_swap()
47da82c92fSMauro Carvalho Chehab	  Called when swp_entry's refcnt goes down to 0. A charge against swap
48da82c92fSMauro Carvalho Chehab	  disappears.
49da82c92fSMauro Carvalho Chehab
50da82c92fSMauro Carvalho Chehab3. charge-commit-cancel
51da82c92fSMauro Carvalho Chehab=======================
52da82c92fSMauro Carvalho Chehab
53da82c92fSMauro Carvalho Chehab	Memcg pages are charged in two steps:
54da82c92fSMauro Carvalho Chehab
55da82c92fSMauro Carvalho Chehab		- mem_cgroup_try_charge()
56da82c92fSMauro Carvalho Chehab		- mem_cgroup_commit_charge() or mem_cgroup_cancel_charge()
57da82c92fSMauro Carvalho Chehab
58da82c92fSMauro Carvalho Chehab	At try_charge(), there are no flags to say "this page is charged".
59da82c92fSMauro Carvalho Chehab	at this point, usage += PAGE_SIZE.
60da82c92fSMauro Carvalho Chehab
61da82c92fSMauro Carvalho Chehab	At commit(), the page is associated with the memcg.
62da82c92fSMauro Carvalho Chehab
63da82c92fSMauro Carvalho Chehab	At cancel(), simply usage -= PAGE_SIZE.
64da82c92fSMauro Carvalho Chehab
65*87f8d8f4SKrzysztof PawlaczykUnder below explanation, we assume CONFIG_SWAP=y.
66da82c92fSMauro Carvalho Chehab
67da82c92fSMauro Carvalho Chehab4. Anonymous
68da82c92fSMauro Carvalho Chehab============
69da82c92fSMauro Carvalho Chehab
70da82c92fSMauro Carvalho Chehab	Anonymous page is newly allocated at
71da82c92fSMauro Carvalho Chehab		  - page fault into MAP_ANONYMOUS mapping.
72da82c92fSMauro Carvalho Chehab		  - Copy-On-Write.
73da82c92fSMauro Carvalho Chehab
74da82c92fSMauro Carvalho Chehab	4.1 Swap-in.
75da82c92fSMauro Carvalho Chehab	At swap-in, the page is taken from swap-cache. There are 2 cases.
76da82c92fSMauro Carvalho Chehab
77da82c92fSMauro Carvalho Chehab	(a) If the SwapCache is newly allocated and read, it has no charges.
78da82c92fSMauro Carvalho Chehab	(b) If the SwapCache has been mapped by processes, it has been
79da82c92fSMauro Carvalho Chehab	    charged already.
80da82c92fSMauro Carvalho Chehab
81da82c92fSMauro Carvalho Chehab	4.2 Swap-out.
82da82c92fSMauro Carvalho Chehab	At swap-out, typical state transition is below.
83da82c92fSMauro Carvalho Chehab
84da82c92fSMauro Carvalho Chehab	(a) add to swap cache. (marked as SwapCache)
85da82c92fSMauro Carvalho Chehab	    swp_entry's refcnt += 1.
86da82c92fSMauro Carvalho Chehab	(b) fully unmapped.
87da82c92fSMauro Carvalho Chehab	    swp_entry's refcnt += # of ptes.
88da82c92fSMauro Carvalho Chehab	(c) write back to swap.
89da82c92fSMauro Carvalho Chehab	(d) delete from swap cache. (remove from SwapCache)
90da82c92fSMauro Carvalho Chehab	    swp_entry's refcnt -= 1.
91da82c92fSMauro Carvalho Chehab
92da82c92fSMauro Carvalho Chehab
93da82c92fSMauro Carvalho Chehab	Finally, at task exit,
94da82c92fSMauro Carvalho Chehab	(e) zap_pte() is called and swp_entry's refcnt -=1 -> 0.
95da82c92fSMauro Carvalho Chehab
96da82c92fSMauro Carvalho Chehab5. Page Cache
97da82c92fSMauro Carvalho Chehab=============
98da82c92fSMauro Carvalho Chehab
99da82c92fSMauro Carvalho Chehab	Page Cache is charged at
1002bb876b5SMatthew Wilcox (Oracle)	- filemap_add_folio().
101da82c92fSMauro Carvalho Chehab
102da82c92fSMauro Carvalho Chehab	The logic is very clear. (About migration, see below)
103da82c92fSMauro Carvalho Chehab
104da82c92fSMauro Carvalho Chehab	Note:
105da82c92fSMauro Carvalho Chehab	  __remove_from_page_cache() is called by remove_from_page_cache()
106da82c92fSMauro Carvalho Chehab	  and __remove_mapping().
107da82c92fSMauro Carvalho Chehab
108da82c92fSMauro Carvalho Chehab6. Shmem(tmpfs) Page Cache
109da82c92fSMauro Carvalho Chehab===========================
110da82c92fSMauro Carvalho Chehab
111da82c92fSMauro Carvalho Chehab	The best way to understand shmem's page state transition is to read
112da82c92fSMauro Carvalho Chehab	mm/shmem.c.
113da82c92fSMauro Carvalho Chehab
114da82c92fSMauro Carvalho Chehab	But brief explanation of the behavior of memcg around shmem will be
115da82c92fSMauro Carvalho Chehab	helpful to understand the logic.
116da82c92fSMauro Carvalho Chehab
117da82c92fSMauro Carvalho Chehab	Shmem's page (just leaf page, not direct/indirect block) can be on
118da82c92fSMauro Carvalho Chehab
119da82c92fSMauro Carvalho Chehab		- radix-tree of shmem's inode.
120da82c92fSMauro Carvalho Chehab		- SwapCache.
121da82c92fSMauro Carvalho Chehab		- Both on radix-tree and SwapCache. This happens at swap-in
122da82c92fSMauro Carvalho Chehab		  and swap-out,
123da82c92fSMauro Carvalho Chehab
124da82c92fSMauro Carvalho Chehab	It's charged when...
125da82c92fSMauro Carvalho Chehab
126da82c92fSMauro Carvalho Chehab	- A new page is added to shmem's radix-tree.
127da82c92fSMauro Carvalho Chehab	- A swp page is read. (move a charge from swap_cgroup to page_cgroup)
128da82c92fSMauro Carvalho Chehab
129da82c92fSMauro Carvalho Chehab7. Page Migration
130da82c92fSMauro Carvalho Chehab=================
131da82c92fSMauro Carvalho Chehab
132da82c92fSMauro Carvalho Chehab	mem_cgroup_migrate()
133da82c92fSMauro Carvalho Chehab
134da82c92fSMauro Carvalho Chehab8. LRU
135da82c92fSMauro Carvalho Chehab======
13615b44736SHugh Dickins	Each memcg has its own vector of LRUs (inactive anon, active anon,
13715b44736SHugh Dickins	inactive file, active file, unevictable) of pages from each node,
13815b44736SHugh Dickins	each LRU handled under a single lru_lock for that memcg and node.
139da82c92fSMauro Carvalho Chehab
140da82c92fSMauro Carvalho Chehab9. Typical Tests.
141da82c92fSMauro Carvalho Chehab=================
142da82c92fSMauro Carvalho Chehab
143da82c92fSMauro Carvalho Chehab Tests for racy cases.
144da82c92fSMauro Carvalho Chehab
145da82c92fSMauro Carvalho Chehab9.1 Small limit to memcg.
146da82c92fSMauro Carvalho Chehab-------------------------
147da82c92fSMauro Carvalho Chehab
148da82c92fSMauro Carvalho Chehab	When you do test to do racy case, it's good test to set memcg's limit
149da82c92fSMauro Carvalho Chehab	to be very small rather than GB. Many races found in the test under
150da82c92fSMauro Carvalho Chehab	xKB or xxMB limits.
151da82c92fSMauro Carvalho Chehab
152da82c92fSMauro Carvalho Chehab	(Memory behavior under GB and Memory behavior under MB shows very
153da82c92fSMauro Carvalho Chehab	different situation.)
154da82c92fSMauro Carvalho Chehab
155da82c92fSMauro Carvalho Chehab9.2 Shmem
156da82c92fSMauro Carvalho Chehab---------
157da82c92fSMauro Carvalho Chehab
158da82c92fSMauro Carvalho Chehab	Historically, memcg's shmem handling was poor and we saw some amount
159da82c92fSMauro Carvalho Chehab	of troubles here. This is because shmem is page-cache but can be
160da82c92fSMauro Carvalho Chehab	SwapCache. Test with shmem/tmpfs is always good test.
161da82c92fSMauro Carvalho Chehab
162da82c92fSMauro Carvalho Chehab9.3 Migration
163da82c92fSMauro Carvalho Chehab-------------
164da82c92fSMauro Carvalho Chehab
165da82c92fSMauro Carvalho Chehab	For NUMA, migration is an another special case. To do easy test, cpuset
166da82c92fSMauro Carvalho Chehab	is useful. Following is a sample script to do migration::
167da82c92fSMauro Carvalho Chehab
168da82c92fSMauro Carvalho Chehab		mount -t cgroup -o cpuset none /opt/cpuset
169da82c92fSMauro Carvalho Chehab
170da82c92fSMauro Carvalho Chehab		mkdir /opt/cpuset/01
171da82c92fSMauro Carvalho Chehab		echo 1 > /opt/cpuset/01/cpuset.cpus
172da82c92fSMauro Carvalho Chehab		echo 0 > /opt/cpuset/01/cpuset.mems
173da82c92fSMauro Carvalho Chehab		echo 1 > /opt/cpuset/01/cpuset.memory_migrate
174da82c92fSMauro Carvalho Chehab		mkdir /opt/cpuset/02
175da82c92fSMauro Carvalho Chehab		echo 1 > /opt/cpuset/02/cpuset.cpus
176da82c92fSMauro Carvalho Chehab		echo 1 > /opt/cpuset/02/cpuset.mems
177da82c92fSMauro Carvalho Chehab		echo 1 > /opt/cpuset/02/cpuset.memory_migrate
178da82c92fSMauro Carvalho Chehab
179da82c92fSMauro Carvalho Chehab	In above set, when you moves a task from 01 to 02, page migration to
180da82c92fSMauro Carvalho Chehab	node 0 to node 1 will occur. Following is a script to migrate all
181da82c92fSMauro Carvalho Chehab	under cpuset.::
182da82c92fSMauro Carvalho Chehab
183da82c92fSMauro Carvalho Chehab		--
184da82c92fSMauro Carvalho Chehab		move_task()
185da82c92fSMauro Carvalho Chehab		{
186da82c92fSMauro Carvalho Chehab		for pid in $1
187da82c92fSMauro Carvalho Chehab		do
188da82c92fSMauro Carvalho Chehab			/bin/echo $pid >$2/tasks 2>/dev/null
189da82c92fSMauro Carvalho Chehab			echo -n $pid
190da82c92fSMauro Carvalho Chehab			echo -n " "
191da82c92fSMauro Carvalho Chehab		done
192da82c92fSMauro Carvalho Chehab		echo END
193da82c92fSMauro Carvalho Chehab		}
194da82c92fSMauro Carvalho Chehab
195da82c92fSMauro Carvalho Chehab		G1_TASK=`cat ${G1}/tasks`
196da82c92fSMauro Carvalho Chehab		G2_TASK=`cat ${G2}/tasks`
197da82c92fSMauro Carvalho Chehab		move_task "${G1_TASK}" ${G2} &
198da82c92fSMauro Carvalho Chehab		--
199da82c92fSMauro Carvalho Chehab
200da82c92fSMauro Carvalho Chehab9.4 Memory hotplug
201da82c92fSMauro Carvalho Chehab------------------
202da82c92fSMauro Carvalho Chehab
203da82c92fSMauro Carvalho Chehab	memory hotplug test is one of good test.
204da82c92fSMauro Carvalho Chehab
205da82c92fSMauro Carvalho Chehab	to offline memory, do following::
206da82c92fSMauro Carvalho Chehab
207da82c92fSMauro Carvalho Chehab		# echo offline > /sys/devices/system/memory/memoryXXX/state
208da82c92fSMauro Carvalho Chehab
209da82c92fSMauro Carvalho Chehab	(XXX is the place of memory)
210da82c92fSMauro Carvalho Chehab
211da82c92fSMauro Carvalho Chehab	This is an easy way to test page migration, too.
212da82c92fSMauro Carvalho Chehab
21318421863SRoman Gushchin9.5 nested cgroups
21418421863SRoman Gushchin------------------
215da82c92fSMauro Carvalho Chehab
21618421863SRoman Gushchin	Use tests like the following for testing nested cgroups::
217da82c92fSMauro Carvalho Chehab
218da82c92fSMauro Carvalho Chehab		mkdir /opt/cgroup/01/child_a
219da82c92fSMauro Carvalho Chehab		mkdir /opt/cgroup/01/child_b
220da82c92fSMauro Carvalho Chehab
221da82c92fSMauro Carvalho Chehab		set limit to 01.
222da82c92fSMauro Carvalho Chehab		add limit to 01/child_b
223da82c92fSMauro Carvalho Chehab		run jobs under child_a and child_b
224da82c92fSMauro Carvalho Chehab
225da82c92fSMauro Carvalho Chehab	create/delete following groups at random while jobs are running::
226da82c92fSMauro Carvalho Chehab
227da82c92fSMauro Carvalho Chehab		/opt/cgroup/01/child_a/child_aa
228da82c92fSMauro Carvalho Chehab		/opt/cgroup/01/child_b/child_bb
229da82c92fSMauro Carvalho Chehab		/opt/cgroup/01/child_c
230da82c92fSMauro Carvalho Chehab
231da82c92fSMauro Carvalho Chehab	running new jobs in new group is also good.
232da82c92fSMauro Carvalho Chehab
233da82c92fSMauro Carvalho Chehab9.6 Mount with other subsystems
234da82c92fSMauro Carvalho Chehab-------------------------------
235da82c92fSMauro Carvalho Chehab
236da82c92fSMauro Carvalho Chehab	Mounting with other subsystems is a good test because there is a
237da82c92fSMauro Carvalho Chehab	race and lock dependency with other cgroup subsystems.
238da82c92fSMauro Carvalho Chehab
239da82c92fSMauro Carvalho Chehab	example::
240da82c92fSMauro Carvalho Chehab
241da82c92fSMauro Carvalho Chehab		# mount -t cgroup none /cgroup -o cpuset,memory,cpu,devices
242da82c92fSMauro Carvalho Chehab
243da82c92fSMauro Carvalho Chehab	and do task move, mkdir, rmdir etc...under this.
244da82c92fSMauro Carvalho Chehab
245da82c92fSMauro Carvalho Chehab9.7 swapoff
246da82c92fSMauro Carvalho Chehab-----------
247da82c92fSMauro Carvalho Chehab
248da82c92fSMauro Carvalho Chehab	Besides management of swap is one of complicated parts of memcg,
249da82c92fSMauro Carvalho Chehab	call path of swap-in at swapoff is not same as usual swap-in path..
250da82c92fSMauro Carvalho Chehab	It's worth to be tested explicitly.
251da82c92fSMauro Carvalho Chehab
252da82c92fSMauro Carvalho Chehab	For example, test like following is good:
253da82c92fSMauro Carvalho Chehab
254da82c92fSMauro Carvalho Chehab	(Shell-A)::
255da82c92fSMauro Carvalho Chehab
256da82c92fSMauro Carvalho Chehab		# mount -t cgroup none /cgroup -o memory
257da82c92fSMauro Carvalho Chehab		# mkdir /cgroup/test
258da82c92fSMauro Carvalho Chehab		# echo 40M > /cgroup/test/memory.limit_in_bytes
259da82c92fSMauro Carvalho Chehab		# echo 0 > /cgroup/test/tasks
260da82c92fSMauro Carvalho Chehab
261da82c92fSMauro Carvalho Chehab	Run malloc(100M) program under this. You'll see 60M of swaps.
262da82c92fSMauro Carvalho Chehab
263da82c92fSMauro Carvalho Chehab	(Shell-B)::
264da82c92fSMauro Carvalho Chehab
265da82c92fSMauro Carvalho Chehab		# move all tasks in /cgroup/test to /cgroup
266da82c92fSMauro Carvalho Chehab		# /sbin/swapoff -a
267da82c92fSMauro Carvalho Chehab		# rmdir /cgroup/test
268da82c92fSMauro Carvalho Chehab		# kill malloc task.
269da82c92fSMauro Carvalho Chehab
270da82c92fSMauro Carvalho Chehab	Of course, tmpfs v.s. swapoff test should be tested, too.
271da82c92fSMauro Carvalho Chehab
272da82c92fSMauro Carvalho Chehab9.8 OOM-Killer
273da82c92fSMauro Carvalho Chehab--------------
274da82c92fSMauro Carvalho Chehab
275da82c92fSMauro Carvalho Chehab	Out-of-memory caused by memcg's limit will kill tasks under
276da82c92fSMauro Carvalho Chehab	the memcg. When hierarchy is used, a task under hierarchy
277da82c92fSMauro Carvalho Chehab	will be killed by the kernel.
278da82c92fSMauro Carvalho Chehab
279da82c92fSMauro Carvalho Chehab	In this case, panic_on_oom shouldn't be invoked and tasks
280da82c92fSMauro Carvalho Chehab	in other groups shouldn't be killed.
281da82c92fSMauro Carvalho Chehab
282da82c92fSMauro Carvalho Chehab	It's not difficult to cause OOM under memcg as following.
283da82c92fSMauro Carvalho Chehab
284da82c92fSMauro Carvalho Chehab	Case A) when you can swapoff::
285da82c92fSMauro Carvalho Chehab
286da82c92fSMauro Carvalho Chehab		#swapoff -a
287da82c92fSMauro Carvalho Chehab		#echo 50M > /memory.limit_in_bytes
288da82c92fSMauro Carvalho Chehab
289da82c92fSMauro Carvalho Chehab	run 51M of malloc
290da82c92fSMauro Carvalho Chehab
291da82c92fSMauro Carvalho Chehab	Case B) when you use mem+swap limitation::
292da82c92fSMauro Carvalho Chehab
293da82c92fSMauro Carvalho Chehab		#echo 50M > memory.limit_in_bytes
294da82c92fSMauro Carvalho Chehab		#echo 50M > memory.memsw.limit_in_bytes
295da82c92fSMauro Carvalho Chehab
296da82c92fSMauro Carvalho Chehab	run 51M of malloc
297da82c92fSMauro Carvalho Chehab
298da82c92fSMauro Carvalho Chehab9.9 Move charges at task migration
299da82c92fSMauro Carvalho Chehab----------------------------------
300da82c92fSMauro Carvalho Chehab
301da82c92fSMauro Carvalho Chehab	Charges associated with a task can be moved along with task migration.
302da82c92fSMauro Carvalho Chehab
303da82c92fSMauro Carvalho Chehab	(Shell-A)::
304da82c92fSMauro Carvalho Chehab
305da82c92fSMauro Carvalho Chehab		#mkdir /cgroup/A
306da82c92fSMauro Carvalho Chehab		#echo $$ >/cgroup/A/tasks
307da82c92fSMauro Carvalho Chehab
308da82c92fSMauro Carvalho Chehab	run some programs which uses some amount of memory in /cgroup/A.
309da82c92fSMauro Carvalho Chehab
310da82c92fSMauro Carvalho Chehab	(Shell-B)::
311da82c92fSMauro Carvalho Chehab
312da82c92fSMauro Carvalho Chehab		#mkdir /cgroup/B
313da82c92fSMauro Carvalho Chehab		#echo 1 >/cgroup/B/memory.move_charge_at_immigrate
314da82c92fSMauro Carvalho Chehab		#echo "pid of the program running in group A" >/cgroup/B/tasks
315da82c92fSMauro Carvalho Chehab
316da82c92fSMauro Carvalho Chehab	You can see charges have been moved by reading ``*.usage_in_bytes`` or
317da82c92fSMauro Carvalho Chehab	memory.stat of both A and B.
318da82c92fSMauro Carvalho Chehab
319da82c92fSMauro Carvalho Chehab	See 8.2 of Documentation/admin-guide/cgroup-v1/memory.rst to see what value should
320da82c92fSMauro Carvalho Chehab	be written to move_charge_at_immigrate.
321da82c92fSMauro Carvalho Chehab
322da82c92fSMauro Carvalho Chehab9.10 Memory thresholds
323da82c92fSMauro Carvalho Chehab----------------------
324da82c92fSMauro Carvalho Chehab
325da82c92fSMauro Carvalho Chehab	Memory controller implements memory thresholds using cgroups notification
326da82c92fSMauro Carvalho Chehab	API. You can use tools/cgroup/cgroup_event_listener.c to test it.
327da82c92fSMauro Carvalho Chehab
328da82c92fSMauro Carvalho Chehab	(Shell-A) Create cgroup and run event listener::
329da82c92fSMauro Carvalho Chehab
330da82c92fSMauro Carvalho Chehab		# mkdir /cgroup/A
331da82c92fSMauro Carvalho Chehab		# ./cgroup_event_listener /cgroup/A/memory.usage_in_bytes 5M
332da82c92fSMauro Carvalho Chehab
333da82c92fSMauro Carvalho Chehab	(Shell-B) Add task to cgroup and try to allocate and free memory::
334da82c92fSMauro Carvalho Chehab
335da82c92fSMauro Carvalho Chehab		# echo $$ >/cgroup/A/tasks
336da82c92fSMauro Carvalho Chehab		# a="$(dd if=/dev/zero bs=1M count=10)"
337da82c92fSMauro Carvalho Chehab		# a=
338da82c92fSMauro Carvalho Chehab
339da82c92fSMauro Carvalho Chehab	You will see message from cgroup_event_listener every time you cross
340da82c92fSMauro Carvalho Chehab	the thresholds.
341da82c92fSMauro Carvalho Chehab
342da82c92fSMauro Carvalho Chehab	Use /cgroup/A/memory.memsw.usage_in_bytes to test memsw thresholds.
343da82c92fSMauro Carvalho Chehab
344da82c92fSMauro Carvalho Chehab	It's good idea to test root cgroup as well.
345