xref: /linux/Documentation/mm/z3fold.rst (revision 24168c5e6dfbdd5b414f048f47f75d64533296ca)
1======
2z3fold
3======
4
5z3fold is a special purpose allocator for storing compressed pages.
6It is designed to store up to three compressed pages per physical page.
7It is a zbud derivative which allows for higher compression
8ratio keeping the simplicity and determinism of its predecessor.
9
10The main differences between z3fold and zbud are:
11
12* unlike zbud, z3fold allows for up to PAGE_SIZE allocations
13* z3fold can hold up to 3 compressed pages in its page
14* z3fold doesn't export any API itself and is thus intended to be used
15  via the zpool API.
16
17To keep the determinism and simplicity, z3fold, just like zbud, always
18stores an integral number of compressed pages per page, but it can store
19up to 3 pages unlike zbud which can store at most 2. Therefore the
20compression ratio goes to around 2.7x while zbud's one is around 1.7x.
21
22Unlike zbud (but like zsmalloc for that matter) z3fold_alloc() does not
23return a dereferenceable pointer. Instead, it returns an unsigned long
24handle which encodes actual location of the allocated object.
25
26Keeping effective compression ratio close to zsmalloc's, z3fold doesn't
27depend on MMU enabled and provides more predictable reclaim behavior
28which makes it a better fit for small and response-critical systems.
29