diff options
author | Seth Jennings <sjenning@linux.vnet.ibm.com> | 2013-07-10 19:05:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-10 21:11:34 -0400 |
commit | 61b0d76017a50c263c303fa263b295b04e0c68f6 (patch) | |
tree | 6db1222d90485b3eb3c36651cfd23127e0cf84ad /Documentation/vm/zswap.txt | |
parent | 2b2811178e85553405b86e3fe78357b9b95889ce (diff) |
zswap: add documentation
Add the documentation file for the zswap functionality
Signed-off-by: Seth Jennings <sjenning@linux.vnet.ibm.com>
Acked-by: Rik van Riel <riel@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Dan Magenheimer <dan.magenheimer@oracle.com>
Cc: Robert Jennings <rcj@linux.vnet.ibm.com>
Cc: Jenifer Hopper <jhopper@us.ibm.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Johannes Weiner <jweiner@redhat.com>
Cc: Larry Woodman <lwoodman@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Dave Hansen <dave@sr71.net>
Cc: Joe Perches <joe@perches.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Cody P Schafer <cody@linux.vnet.ibm.com>
Cc: Hugh Dickens <hughd@google.com>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation/vm/zswap.txt')
-rw-r--r-- | Documentation/vm/zswap.txt | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Documentation/vm/zswap.txt b/Documentation/vm/zswap.txt new file mode 100644 index 000000000000..7e492d8aaeaf --- /dev/null +++ b/Documentation/vm/zswap.txt | |||
@@ -0,0 +1,68 @@ | |||
1 | Overview: | ||
2 | |||
3 | Zswap is a lightweight compressed cache for swap pages. It takes pages that are | ||
4 | in the process of being swapped out and attempts to compress them into a | ||
5 | dynamically allocated RAM-based memory pool. zswap basically trades CPU cycles | ||
6 | for potentially reduced swap I/O. This trade-off can also result in a | ||
7 | significant performance improvement if reads from the compressed cache are | ||
8 | faster than reads from a swap device. | ||
9 | |||
10 | NOTE: Zswap is a new feature as of v3.11 and interacts heavily with memory | ||
11 | reclaim. This interaction has not be fully explored on the large set of | ||
12 | potential configurations and workloads that exist. For this reason, zswap | ||
13 | is a work in progress and should be considered experimental. | ||
14 | |||
15 | Some potential benefits: | ||
16 | * Desktop/laptop users with limited RAM capacities can mitigate the | ||
17 | performance impact of swapping. | ||
18 | * Overcommitted guests that share a common I/O resource can | ||
19 | dramatically reduce their swap I/O pressure, avoiding heavy handed I/O | ||
20 | throttling by the hypervisor. This allows more work to get done with less | ||
21 | impact to the guest workload and guests sharing the I/O subsystem | ||
22 | * Users with SSDs as swap devices can extend the life of the device by | ||
23 | drastically reducing life-shortening writes. | ||
24 | |||
25 | Zswap evicts pages from compressed cache on an LRU basis to the backing swap | ||
26 | device when the compressed pool reaches it size limit. This requirement had | ||
27 | been identified in prior community discussions. | ||
28 | |||
29 | To enabled zswap, the "enabled" attribute must be set to 1 at boot time. e.g. | ||
30 | zswap.enabled=1 | ||
31 | |||
32 | Design: | ||
33 | |||
34 | Zswap receives pages for compression through the Frontswap API and is able to | ||
35 | evict pages from its own compressed pool on an LRU basis and write them back to | ||
36 | the backing swap device in the case that the compressed pool is full. | ||
37 | |||
38 | Zswap makes use of zbud for the managing the compressed memory pool. Each | ||
39 | allocation in zbud is not directly accessible by address. Rather, a handle is | ||
40 | return by the allocation routine and that handle must be mapped before being | ||
41 | accessed. The compressed memory pool grows on demand and shrinks as compressed | ||
42 | pages are freed. The pool is not preallocated. | ||
43 | |||
44 | When a swap page is passed from frontswap to zswap, zswap maintains a mapping | ||
45 | of the swap entry, a combination of the swap type and swap offset, to the zbud | ||
46 | handle that references that compressed swap page. This mapping is achieved | ||
47 | with a red-black tree per swap type. The swap offset is the search key for the | ||
48 | tree nodes. | ||
49 | |||
50 | During a page fault on a PTE that is a swap entry, frontswap calls the zswap | ||
51 | load function to decompress the page into the page allocated by the page fault | ||
52 | handler. | ||
53 | |||
54 | Once there are no PTEs referencing a swap page stored in zswap (i.e. the count | ||
55 | in the swap_map goes to 0) the swap code calls the zswap invalidate function, | ||
56 | via frontswap, to free the compressed entry. | ||
57 | |||
58 | Zswap seeks to be simple in its policies. Sysfs attributes allow for one user | ||
59 | controlled policies: | ||
60 | * max_pool_percent - The maximum percentage of memory that the compressed | ||
61 | pool can occupy. | ||
62 | |||
63 | Zswap allows the compressor to be selected at kernel boot time by setting the | ||
64 | “compressor” attribute. The default compressor is lzo. e.g. | ||
65 | zswap.compressor=deflate | ||
66 | |||
67 | A debugfs interface is provided for various statistic about pool size, number | ||
68 | of pages stored, and various counters for the reasons pages are rejected. | ||