xref: /openbmc/linux/Documentation/mm/zsmalloc.rst (revision 6486a57f)
1========
2zsmalloc
3========
4
5This allocator is designed for use with zram. Thus, the allocator is
6supposed to work well under low memory conditions. In particular, it
7never attempts higher order page allocation which is very likely to
8fail under memory pressure. On the other hand, if we just use single
9(0-order) pages, it would suffer from very high fragmentation --
10any object of size PAGE_SIZE/2 or larger would occupy an entire page.
11This was one of the major issues with its predecessor (xvmalloc).
12
13To overcome these issues, zsmalloc allocates a bunch of 0-order pages
14and links them together using various 'struct page' fields. These linked
15pages act as a single higher-order page i.e. an object can span 0-order
16page boundaries. The code refers to these linked pages as a single entity
17called zspage.
18
19For simplicity, zsmalloc can only allocate objects of size up to PAGE_SIZE
20since this satisfies the requirements of all its current users (in the
21worst case, page is incompressible and is thus stored "as-is" i.e. in
22uncompressed form). For allocation requests larger than this size, failure
23is returned (see zs_malloc).
24
25Additionally, zs_malloc() does not return a dereferenceable pointer.
26Instead, it returns an opaque handle (unsigned long) which encodes actual
27location of the allocated object. The reason for this indirection is that
28zsmalloc does not keep zspages permanently mapped since that would cause
29issues on 32-bit systems where the VA region for kernel space mappings
30is very small. So, before using the allocating memory, the object has to
31be mapped using zs_map_object() to get a usable pointer and subsequently
32unmapped using zs_unmap_object().
33
34stat
35====
36
37With CONFIG_ZSMALLOC_STAT, we could see zsmalloc internal information via
38``/sys/kernel/debug/zsmalloc/<user name>``. Here is a sample of stat output::
39
40 # cat /sys/kernel/debug/zsmalloc/zram0/classes
41
42 class  size almost_full almost_empty obj_allocated   obj_used pages_used pages_per_zspage
43    ...
44    ...
45     9   176           0            1           186        129          8                4
46    10   192           1            0          2880       2872        135                3
47    11   208           0            1           819        795         42                2
48    12   224           0            1           219        159         12                4
49    ...
50    ...
51
52
53class
54	index
55size
56	object size zspage stores
57almost_empty
58	the number of ZS_ALMOST_EMPTY zspages(see below)
59almost_full
60	the number of ZS_ALMOST_FULL zspages(see below)
61obj_allocated
62	the number of objects allocated
63obj_used
64	the number of objects allocated to the user
65pages_used
66	the number of pages allocated for the class
67pages_per_zspage
68	the number of 0-order pages to make a zspage
69
70We assign a zspage to ZS_ALMOST_EMPTY fullness group when n <= N / f, where
71
72* n = number of allocated objects
73* N = total number of objects zspage can store
74* f = fullness_threshold_frac(ie, 4 at the moment)
75
76Similarly, we assign zspage to:
77
78* ZS_ALMOST_FULL  when n > N / f
79* ZS_EMPTY        when n == 0
80* ZS_FULL         when n == N
81