1 /*
2 * Compressed RAM block device
3 *
4 * Copyright (C) 2008, 2009, 2010 Nitin Gupta
5 * 2012, 2013 Minchan Kim
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 *
13 */
14
15 #ifndef _ZRAM_DRV_H_
16 #define _ZRAM_DRV_H_
17
18 #include <linux/rwsem.h>
19 #include <linux/zsmalloc.h>
20 #include <linux/crypto.h>
21
22 #include "zcomp.h"
23
24 #ifdef CONFIG_ZRAM_GROUP
25 #include "zram_group.h"
26 #endif
27
28 #define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT)
29 #define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT)
30 #define ZRAM_LOGICAL_BLOCK_SHIFT 12
31 #define ZRAM_LOGICAL_BLOCK_SIZE (1 << ZRAM_LOGICAL_BLOCK_SHIFT)
32 #define ZRAM_SECTOR_PER_LOGICAL_BLOCK \
33 (1 << (ZRAM_LOGICAL_BLOCK_SHIFT - SECTOR_SHIFT))
34
35
36 /*
37 * ZRAM is mainly used for memory efficiency so we want to keep memory
38 * footprint small and thus squeeze size and zram pageflags into a flags
39 * member. The lower ZRAM_FLAG_SHIFT bits is for object size (excluding
40 * header), which cannot be larger than PAGE_SIZE (requiring PAGE_SHIFT
41 * bits), the higher bits are for zram_pageflags.
42 *
43 * We use BUILD_BUG_ON() to make sure that zram pageflags don't overflow.
44 */
45 #ifdef CONFIG_ZRAM_GROUP
46 /* reserve 16 bits for group id */
47 #define ZRAM_SIZE_SHIFT 24
48 #define ZRAM_GRPID_SHIFT 16
49 #define ZRAM_GRPID_MASK (((1UL << ZRAM_GRPID_SHIFT) - 1) << ZRAM_SIZE_SHIFT)
50 #define ZRAM_FLAG_SHIFT (ZRAM_SIZE_SHIFT + ZRAM_GRPID_SHIFT)
51 #else
52 #define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
53 #endif
54
55 /* Only 2 bits are allowed for comp priority index */
56 #define ZRAM_COMP_PRIORITY_MASK 0x3
57
58 /* Flags for zram pages (table[page_no].flags) */
59 enum zram_pageflags {
60 /* zram slot is locked */
61 ZRAM_LOCK = ZRAM_FLAG_SHIFT,
62 ZRAM_SAME, /* Page consists the same element */
63 ZRAM_WB, /* page is stored on backing_device */
64 ZRAM_UNDER_WB, /* page is under writeback */
65 ZRAM_HUGE, /* Incompressible page */
66 ZRAM_IDLE, /* not accessed page since last idle marking */
67 #ifdef CONFIG_ZRAM_GROUP_WRITEBACK
68 ZRAM_GWB, /* obj is group writeback*/
69 ZRAM_FAULT, /* obj is needed by a pagefault req */
70 #endif
71 ZRAM_INCOMPRESSIBLE, /* none of the algorithms could compress it */
72
73 ZRAM_COMP_PRIORITY_BIT1, /* First bit of comp priority index */
74 ZRAM_COMP_PRIORITY_BIT2, /* Second bit of comp priority index */
75
76 __NR_ZRAM_PAGEFLAGS,
77 };
78
79 /*-- Data structures */
80
81 /* Allocated for each disk page */
82 struct zram_table_entry {
83 union {
84 unsigned long handle;
85 unsigned long element;
86 };
87 unsigned long flags;
88 #ifdef CONFIG_ZRAM_MEMORY_TRACKING
89 ktime_t ac_time;
90 #endif
91 };
92
93 struct zram_stats {
94 atomic64_t compr_data_size; /* compressed size of pages stored */
95 atomic64_t failed_reads; /* can happen when memory is too low */
96 atomic64_t failed_writes; /* can happen when memory is too low */
97 atomic64_t notify_free; /* no. of swap slot free notifications */
98 atomic64_t same_pages; /* no. of same element filled pages */
99 atomic64_t huge_pages; /* no. of huge pages */
100 atomic64_t huge_pages_since; /* no. of huge pages since zram set up */
101 atomic64_t pages_stored; /* no. of pages currently stored */
102 atomic_long_t max_used_pages; /* no. of maximum pages stored */
103 atomic64_t writestall; /* no. of write slow paths */
104 atomic64_t miss_free; /* no. of missed free */
105 #ifdef CONFIG_ZRAM_WRITEBACK
106 atomic64_t bd_count; /* no. of pages in backing device */
107 atomic64_t bd_reads; /* no. of reads from backing device */
108 atomic64_t bd_writes; /* no. of writes from backing device */
109 #endif
110 };
111
112 #ifdef CONFIG_ZRAM_MULTI_COMP
113 #define ZRAM_PRIMARY_COMP 0U
114 #define ZRAM_SECONDARY_COMP 1U
115 #define ZRAM_MAX_COMPS 4U
116 #else
117 #define ZRAM_PRIMARY_COMP 0U
118 #define ZRAM_SECONDARY_COMP 0U
119 #define ZRAM_MAX_COMPS 1U
120 #endif
121
122 struct zram {
123 struct zram_table_entry *table;
124 #ifdef CONFIG_ZRAM_GROUP
125 struct zram_group *zgrp;
126 unsigned int zgrp_ctrl;
127 #endif
128 struct zs_pool *mem_pool;
129 struct zcomp *comps[ZRAM_MAX_COMPS];
130 struct gendisk *disk;
131 /* Prevent concurrent execution of device init */
132 struct rw_semaphore init_lock;
133 /*
134 * the number of pages zram can consume for storing compressed data
135 */
136 unsigned long limit_pages;
137
138 struct zram_stats stats;
139 /*
140 * This is the limit on amount of *uncompressed* worth of data
141 * we can store in a disk.
142 */
143 u64 disksize; /* bytes */
144 const char *comp_algs[ZRAM_MAX_COMPS];
145 s8 num_active_comps;
146 /*
147 * zram is claimed so open request will be failed
148 */
149 bool claim; /* Protected by disk->open_mutex */
150 #ifdef CONFIG_ZRAM_WRITEBACK
151 struct file *backing_dev;
152 spinlock_t wb_limit_lock;
153 bool wb_limit_enable;
154 u64 bd_wb_limit;
155 struct block_device *bdev;
156 unsigned long *bitmap;
157 unsigned long nr_pages;
158 #endif
159 #ifdef CONFIG_ZRAM_MEMORY_TRACKING
160 struct dentry *debugfs_dir;
161 #endif
162 };
163
zram_slot_trylock(struct zram *zram, u32 index)164 static inline int zram_slot_trylock(struct zram *zram, u32 index)
165 {
166 return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags);
167 }
168
zram_slot_lock(struct zram *zram, u32 index)169 static inline void zram_slot_lock(struct zram *zram, u32 index)
170 {
171 bit_spin_lock(ZRAM_LOCK, &zram->table[index].flags);
172 }
173
zram_slot_unlock(struct zram *zram, u32 index)174 static inline void zram_slot_unlock(struct zram *zram, u32 index)
175 {
176 bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags);
177 }
178
zram_get_handle(struct zram *zram, u32 index)179 static inline unsigned long zram_get_handle(struct zram *zram, u32 index)
180 {
181 return zram->table[index].handle;
182 }
183
zram_set_handle(struct zram *zram, u32 index, unsigned long handle)184 static inline void zram_set_handle(struct zram *zram, u32 index, unsigned long handle)
185 {
186 zram->table[index].handle = handle;
187 }
188
189 /* flag operations require table entry bit_spin_lock() being held */
zram_test_flag(struct zram *zram, u32 index, enum zram_pageflags flag)190 static inline bool zram_test_flag(struct zram *zram, u32 index,
191 enum zram_pageflags flag)
192 {
193 return zram->table[index].flags & BIT(flag);
194 }
195
zram_set_flag(struct zram *zram, u32 index, enum zram_pageflags flag)196 static inline void zram_set_flag(struct zram *zram, u32 index,
197 enum zram_pageflags flag)
198 {
199 zram->table[index].flags |= BIT(flag);
200 }
201
zram_clear_flag(struct zram *zram, u32 index, enum zram_pageflags flag)202 static inline void zram_clear_flag(struct zram *zram, u32 index,
203 enum zram_pageflags flag)
204 {
205 zram->table[index].flags &= ~BIT(flag);
206 }
207 #ifdef CONFIG_ZRAM_GROUP
zram_get_obj_size(struct zram *zram, u32 index)208 static inline size_t zram_get_obj_size(struct zram *zram, u32 index)
209 {
210 return zram->table[index].flags & (BIT(ZRAM_SIZE_SHIFT) - 1);
211 }
212
zram_set_obj_size(struct zram *zram, u32 index, size_t size)213 static inline void zram_set_obj_size(struct zram *zram, u32 index, size_t size)
214 {
215 unsigned long flags = zram->table[index].flags >> ZRAM_SIZE_SHIFT;
216
217 zram->table[index].flags = (flags << ZRAM_SIZE_SHIFT) | size;
218 }
219
220 void zram_group_init(struct zram *zram, u32 nr_obj);
221 void zram_group_deinit(struct zram *zram);
222 void zram_group_track_obj(struct zram *zram, u32 index, struct mem_cgroup *memcg);
223 void zram_group_untrack_obj(struct zram *zram, u32 index);
224 #ifdef CONFIG_ZRAM_GROUP_WRITEBACK
225 int zram_group_fault_obj(struct zram *zram, u32 index);
226 #endif
227
228 #ifdef CONFIG_ZRAM_GROUP_DEBUG
229 void group_debug(struct zram *zram, u32 op, u32 index, u32 gid);
230 #endif
231
232 #else
zram_get_obj_size(struct zram *zram, u32 index)233 static inline size_t zram_get_obj_size(struct zram *zram, u32 index)
234 {
235 return zram->table[index].flags & (BIT(ZRAM_FLAG_SHIFT) - 1);
236 }
237
zram_set_obj_size(struct zram *zram, u32 index, size_t size)238 static inline void zram_set_obj_size(struct zram *zram, u32 index, size_t size)
239 {
240 unsigned long flags = zram->table[index].flags >> ZRAM_FLAG_SHIFT;
241
242 zram->table[index].flags = (flags << ZRAM_FLAG_SHIFT) | size;
243 }
244 #endif
245 #endif
246