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 | |
415403be | 18 | #include <linux/rwsem.h> |
bcf1647d | 19 | #include <linux/zsmalloc.h> |
415403be | 20 | #include <linux/crypto.h> |
306b0c95 | 21 | |
b7ca232e SS |
22 | #include "zcomp.h" |
23 | ||
306b0c95 NG |
24 | #define SECTORS_PER_PAGE_SHIFT (PAGE_SHIFT - SECTOR_SHIFT) |
25 | #define SECTORS_PER_PAGE (1 << SECTORS_PER_PAGE_SHIFT) | |
924bd88d JM |
26 | #define ZRAM_LOGICAL_BLOCK_SHIFT 12 |
27 | #define ZRAM_LOGICAL_BLOCK_SIZE (1 << ZRAM_LOGICAL_BLOCK_SHIFT) | |
28 | #define ZRAM_SECTOR_PER_LOGICAL_BLOCK \ | |
29 | (1 << (ZRAM_LOGICAL_BLOCK_SHIFT - SECTOR_SHIFT)) | |
306b0c95 | 30 | |
d2d5e762 WY |
31 | |
32 | /* | |
7e529283 | 33 | * The lower ZRAM_FLAG_SHIFT bits of table.flags is for |
d2d5e762 WY |
34 | * object size (excluding header), the higher bits is for |
35 | * zram_pageflags. | |
36 | * | |
37 | * zram is mainly used for memory efficiency so we want to keep memory | |
38 | * footprint small so we can squeeze size and flags into a field. | |
39 | * The lower ZRAM_FLAG_SHIFT bits is for object size (excluding header), | |
40 | * the higher bits is for zram_pageflags. | |
41 | */ | |
42 | #define ZRAM_FLAG_SHIFT 24 | |
43 | ||
7e529283 | 44 | /* Flags for zram pages (table[page_no].flags) */ |
f1e3cfff | 45 | enum zram_pageflags { |
c4d6c4cc MK |
46 | /* zram slot is locked */ |
47 | ZRAM_LOCK = ZRAM_FLAG_SHIFT, | |
48 | ZRAM_SAME, /* Page consists the same element */ | |
db8ffbd4 | 49 | ZRAM_WB, /* page is stored on backing_device */ |
a939888e | 50 | ZRAM_UNDER_WB, /* page is under writeback */ |
89e85bce | 51 | ZRAM_HUGE, /* Incompressible page */ |
e82592c4 | 52 | ZRAM_IDLE, /* not accessed page since last idle marking */ |
306b0c95 | 53 | |
f1e3cfff | 54 | __NR_ZRAM_PAGEFLAGS, |
306b0c95 NG |
55 | }; |
56 | ||
57 | /*-- Data structures */ | |
58 | ||
f1e3cfff | 59 | /* Allocated for each disk page */ |
cb8f2eec | 60 | struct zram_table_entry { |
8e19d540 | 61 | union { |
62 | unsigned long handle; | |
63 | unsigned long element; | |
64 | }; | |
7e529283 | 65 | unsigned long flags; |
c0265342 MK |
66 | #ifdef CONFIG_ZRAM_MEMORY_TRACKING |
67 | ktime_t ac_time; | |
68 | #endif | |
d2d5e762 | 69 | }; |
306b0c95 | 70 | |
f1e3cfff | 71 | struct zram_stats { |
90a7806e | 72 | atomic64_t compr_data_size; /* compressed size of pages stored */ |
da5cc7d3 JL |
73 | atomic64_t num_reads; /* failed + successful */ |
74 | atomic64_t num_writes; /* --do-- */ | |
0cf1e9d6 | 75 | atomic64_t failed_reads; /* can happen when memory is too low */ |
da5cc7d3 JL |
76 | atomic64_t failed_writes; /* can happen when memory is too low */ |
77 | atomic64_t invalid_io; /* non-page-aligned I/O requests */ | |
78 | atomic64_t notify_free; /* no. of swap slot free notifications */ | |
8e19d540 | 79 | atomic64_t same_pages; /* no. of same element filled pages */ |
89e85bce | 80 | atomic64_t huge_pages; /* no. of huge pages */ |
194e28da | 81 | atomic64_t huge_pages_since; /* no. of huge pages since zram set up */ |
90a7806e | 82 | atomic64_t pages_stored; /* no. of pages currently stored */ |
461a8eee | 83 | atomic_long_t max_used_pages; /* no. of maximum pages stored */ |
623e47fc | 84 | atomic64_t writestall; /* no. of write slow paths */ |
3c9959e0 | 85 | atomic64_t miss_free; /* no. of missed free */ |
23eddf39 MK |
86 | #ifdef CONFIG_ZRAM_WRITEBACK |
87 | atomic64_t bd_count; /* no. of pages in backing device */ | |
88 | atomic64_t bd_reads; /* no. of reads from backing device */ | |
89 | atomic64_t bd_writes; /* no. of writes from backing device */ | |
90 | #endif | |
306b0c95 NG |
91 | }; |
92 | ||
beb6602c | 93 | struct zram { |
cb8f2eec | 94 | struct zram_table_entry *table; |
8b3cc3ed | 95 | struct zs_pool *mem_pool; |
08eee69f | 96 | struct zcomp *comp; |
306b0c95 | 97 | struct gendisk *disk; |
08eee69f | 98 | /* Prevent concurrent execution of device init */ |
0900beae | 99 | struct rw_semaphore init_lock; |
306b0c95 | 100 | /* |
08eee69f | 101 | * the number of pages zram can consume for storing compressed data |
306b0c95 | 102 | */ |
08eee69f | 103 | unsigned long limit_pages; |
08eee69f | 104 | |
f1e3cfff | 105 | struct zram_stats stats; |
9ada9da9 | 106 | /* |
08eee69f MK |
107 | * This is the limit on amount of *uncompressed* worth of data |
108 | * we can store in a disk. | |
9ada9da9 | 109 | */ |
08eee69f | 110 | u64 disksize; /* bytes */ |
415403be | 111 | char compressor[CRYPTO_MAX_ALG_NAME]; |
f405c445 SS |
112 | /* |
113 | * zram is claimed so open request will be failed | |
114 | */ | |
a8698707 | 115 | bool claim; /* Protected by disk->open_mutex */ |
7e529283 | 116 | #ifdef CONFIG_ZRAM_WRITEBACK |
dd794835 | 117 | struct file *backing_dev; |
1d69a3f8 MK |
118 | spinlock_t wb_limit_lock; |
119 | bool wb_limit_enable; | |
120 | u64 bd_wb_limit; | |
013bf95a | 121 | struct block_device *bdev; |
1363d466 MK |
122 | unsigned long *bitmap; |
123 | unsigned long nr_pages; | |
013bf95a | 124 | #endif |
c0265342 MK |
125 | #ifdef CONFIG_ZRAM_MEMORY_TRACKING |
126 | struct dentry *debugfs_dir; | |
127 | #endif | |
306b0c95 | 128 | }; |
6a907728 | 129 | #endif |