Commit | Line | Data |
---|---|---|
306b0c95 | 1 | /* |
f1e3cfff | 2 | * Compressed RAM block device |
306b0c95 | 3 | * |
1130ebba | 4 | * Copyright (C) 2008, 2009, 2010 Nitin Gupta |
7bfb3de8 | 5 | * 2012, 2013 Minchan Kim |
306b0c95 NG |
6 | * |
7 | * This code is released using a dual license strategy: BSD/GPL | |
8 | * You can choose the licence that better fits your requirements. | |
9 | * | |
10 | * Released under the terms of 3-clause BSD License | |
11 | * Released under the terms of GNU General Public License Version 2.0 | |
12 | * | |
306b0c95 NG |
13 | */ |
14 | ||
f1e3cfff NG |
15 | #ifndef _ZRAM_DRV_H_ |
16 | #define _ZRAM_DRV_H_ | |
306b0c95 | 17 | |
6a907728 | 18 | #include <linux/spinlock.h> |
bcf1647d | 19 | #include <linux/zsmalloc.h> |
306b0c95 | 20 | |
b7ca232e SS |
21 | #include "zcomp.h" |
22 | ||
306b0c95 NG |
23 | /* |
24 | * Some arbitrary value. This is just to catch | |
25 | * invalid value for num_devices module parameter. | |
26 | */ | |
27 | static const unsigned max_num_devices = 32; | |
28 | ||
306b0c95 NG |
29 | /*-- Configurable parameters */ |
30 | ||
306b0c95 | 31 | /* |
306b0c95 NG |
32 | * Pages that compress to size greater than this are stored |
33 | * uncompressed in memory. | |
34 | */ | |
2ccbec05 | 35 | static const size_t max_zpage_size = PAGE_SIZE / 4 * 3; |
306b0c95 NG |
36 | |
37 | /* | |
97a06382 | 38 | * NOTE: max_zpage_size must be less than or equal to: |
55dcbbb1 MK |
39 | * ZS_MAX_ALLOC_SIZE. Otherwise, zs_malloc() would |
40 | * always return failure. | |
306b0c95 NG |
41 | */ |
42 | ||
43 | /*-- End of configurable params */ | |
44 | ||
45 | #define SECTOR_SHIFT 9 | |
306b0c95 NG |
46 | #define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT) |
47 | #define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT) | |
924bd88d JM |
48 | #define ZRAM_LOGICAL_BLOCK_SHIFT 12 |
49 | #define ZRAM_LOGICAL_BLOCK_SIZE (1 << ZRAM_LOGICAL_BLOCK_SHIFT) | |
50 | #define ZRAM_SECTOR_PER_LOGICAL_BLOCK \ | |
51 | (1 << (ZRAM_LOGICAL_BLOCK_SHIFT - SECTOR_SHIFT)) | |
306b0c95 | 52 | |
d2d5e762 WY |
53 | |
54 | /* | |
55 | * The lower ZRAM_FLAG_SHIFT bits of table.value is for | |
56 | * object size (excluding header), the higher bits is for | |
57 | * zram_pageflags. | |
58 | * | |
59 | * zram is mainly used for memory efficiency so we want to keep memory | |
60 | * footprint small so we can squeeze size and flags into a field. | |
61 | * The lower ZRAM_FLAG_SHIFT bits is for object size (excluding header), | |
62 | * the higher bits is for zram_pageflags. | |
63 | */ | |
64 | #define ZRAM_FLAG_SHIFT 24 | |
65 | ||
66 | /* Flags for zram pages (table[page_no].value) */ | |
f1e3cfff | 67 | enum zram_pageflags { |
306b0c95 | 68 | /* Page consists entirely of zeros */ |
d2d5e762 WY |
69 | ZRAM_ZERO = ZRAM_FLAG_SHIFT + 1, |
70 | ZRAM_ACCESS, /* page in now accessed */ | |
306b0c95 | 71 | |
f1e3cfff | 72 | __NR_ZRAM_PAGEFLAGS, |
306b0c95 NG |
73 | }; |
74 | ||
75 | /*-- Data structures */ | |
76 | ||
f1e3cfff | 77 | /* Allocated for each disk page */ |
cb8f2eec | 78 | struct zram_table_entry { |
c2344348 | 79 | unsigned long handle; |
d2d5e762 WY |
80 | unsigned long value; |
81 | }; | |
306b0c95 | 82 | |
f1e3cfff | 83 | struct zram_stats { |
90a7806e | 84 | atomic64_t compr_data_size; /* compressed size of pages stored */ |
da5cc7d3 JL |
85 | atomic64_t num_reads; /* failed + successful */ |
86 | atomic64_t num_writes; /* --do-- */ | |
0cf1e9d6 | 87 | atomic64_t failed_reads; /* can happen when memory is too low */ |
da5cc7d3 JL |
88 | atomic64_t failed_writes; /* can happen when memory is too low */ |
89 | atomic64_t invalid_io; /* non-page-aligned I/O requests */ | |
90 | atomic64_t notify_free; /* no. of swap slot free notifications */ | |
90a7806e SS |
91 | atomic64_t zero_pages; /* no. of zero filled pages */ |
92 | atomic64_t pages_stored; /* no. of pages currently stored */ | |
306b0c95 NG |
93 | }; |
94 | ||
8b3cc3ed | 95 | struct zram_meta { |
cb8f2eec | 96 | struct zram_table_entry *table; |
8b3cc3ed MK |
97 | struct zs_pool *mem_pool; |
98 | }; | |
99 | ||
100 | struct zram { | |
101 | struct zram_meta *meta; | |
306b0c95 NG |
102 | struct request_queue *queue; |
103 | struct gendisk *disk; | |
b7ca232e SS |
104 | struct zcomp *comp; |
105 | ||
0900beae JM |
106 | /* Prevent concurrent execution of device init, reset and R/W request */ |
107 | struct rw_semaphore init_lock; | |
306b0c95 | 108 | /* |
f1e3cfff NG |
109 | * This is the limit on amount of *uncompressed* worth of data |
110 | * we can store in a disk. | |
306b0c95 | 111 | */ |
33863c21 | 112 | u64 disksize; /* bytes */ |
beca3ec7 | 113 | int max_comp_streams; |
f1e3cfff | 114 | struct zram_stats stats; |
e46b8a03 | 115 | char compressor[10]; |
306b0c95 | 116 | }; |
6a907728 | 117 | #endif |