2
* Compressed RAM based swap device
4
* Copyright (C) 2008, 2009 Nitin Gupta
6
* This RAM based block device acts as swap disk.
7
* Pages swapped to this device are compressed and
10
* Released under the terms of GNU General Public License Version 2.0
12
* Project home: http://compcache.googlecode.com
21
* Stored at beginning of each compressed object.
23
* It stores back-reference to table entry which points to this
24
* object. This is required to support memory defragmentation or
25
* migrating compressed pages to backing swap disk.
33
/*-- Configurable parameters */
35
/* Default ramzswap disk size: 25% of total RAM */
36
#define DEFAULT_DISKSIZE_PERC_RAM 25
37
#define DEFAULT_MEMLIMIT_PERC_RAM 15
40
* Max compressed page size when backing device is provided.
41
* Pages that compress to size greater than this are sent to
44
#define MAX_CPAGE_SIZE_BDEV (PAGE_SIZE / 2)
47
* Max compressed page size when there is no backing dev.
48
* Pages that compress to size greater than this are stored
49
* uncompressed in memory.
51
#define MAX_CPAGE_SIZE_NOBDEV (PAGE_SIZE / 4 * 3)
54
* NOTE: MAX_CPAGE_SIZE_{BDEV,NOBDEV} sizes must be
55
* less than or equal to:
56
* XV_MAX_ALLOC_SIZE - sizeof(struct zobj_header)
57
* since otherwise xvMalloc would always return failure.
60
/*-- End of configurable params */
62
#define SECTOR_SHIFT 9
63
#define SECTOR_SIZE (1 << SECTOR_SHIFT)
64
#define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT)
65
#define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT)
68
#define C "ramzswap: "
70
/* Debugging and Stats */
71
#define NOP do { } while (0)
73
#if defined(CONFIG_BLK_DEV_RAMZSWAP_STATS)
78
#define stat_inc(stat) ((stat)++)
79
#define stat_dec(stat) ((stat)--)
80
#define stat_inc_if_less(stat, val1, val2) \
81
((stat) += ((val1) < (val2) ? 1 : 0))
82
#define stat_dec_if_less(stat, val1, val2) \
83
((stat) -= ((val1) < (val2) ? 1 : 0))
85
#define stat_inc(x) NOP
86
#define stat_dec(x) NOP
87
#define stat_inc_if_less(x, v1, v2) NOP
88
#define stat_dec_if_less(x, v1, v2) NOP
91
/* Flags for ramzswap pages (table[page_no].flags) */
93
/* Page is stored uncompressed */
96
/* Page consists entirely of zeros */
102
/*-- Data structures */
104
/* Indexed by page no. */
108
u8 count; /* object ref count (not yet used) */
113
struct xv_pool *mem_pool;
114
void *compress_workmem;
115
void *compress_buffer;
118
struct gendisk *disk;
120
* This is limit on compressed data size (stats.compr_size)
121
* Its applicable only when backing swap device is present.
123
size_t memlimit; /* bytes */
125
* This is limit on amount of *uncompressed* worth of data
126
* we can hold. When backing swap device is provided, it is
127
* set equal to device size.
129
size_t disksize; /* bytes */
131
/* backing swap device info */
132
struct block_device *backing_swap;
133
struct file *swap_file;
137
struct ramzswap_stats {
139
size_t compr_size; /* compressed size of pages stored -
140
* needed to enforce memlimit */
143
u64 num_reads; /* failed + successful */
144
u64 num_writes; /* --do-- */
145
u64 failed_reads; /* can happen when memory is too low */
146
u64 failed_writes; /* should NEVER! happen */
147
u64 invalid_io; /* non-swap I/O requests */
148
u64 pages_discard; /* no. of pages freed by discard callback */
149
u32 pages_zero; /* no. of zero filled pages */
150
u32 pages_stored; /* no. of pages currently stored */
151
u32 good_compress; /* no. of pages with compression ratio<=50% */
152
u32 pages_expand; /* no. of incompressible pages */
153
u64 bdev_num_reads; /* no. of reads on backing dev */
154
u64 bdev_num_writes; /* no. of writes on backing dev */