2 * Compressed RAM block device
4 * Copyright (C) 2008, 2009, 2010 Nitin Gupta
6 * This code is released using a dual license strategy: BSD/GPL
7 * You can choose the licence that better fits your requirements.
9 * Released under the terms of 3-clause BSD License
10 * Released under the terms of GNU General Public License Version 2.0
12 * Project home: http://compcache.googlecode.com/
15 #include <linux/device.h>
16 #include <linux/genhd.h>
21 static u64
zram_stat64_read(struct zram
*zram
, u64
*v
)
25 spin_lock(&zram
->stat64_lock
);
27 spin_unlock(&zram
->stat64_lock
);
32 static struct zram
*dev_to_zram(struct device
*dev
)
35 struct zram
*zram
= NULL
;
37 for (i
= 0; i
< num_devices
; i
++) {
39 if (disk_to_dev(zram
->disk
) == dev
)
46 static ssize_t
disksize_show(struct device
*dev
,
47 struct device_attribute
*attr
, char *buf
)
49 struct zram
*zram
= dev_to_zram(dev
);
51 return sprintf(buf
, "%llu\n", zram
->disksize
);
54 static ssize_t
disksize_store(struct device
*dev
,
55 struct device_attribute
*attr
, const char *buf
, size_t len
)
58 struct zram
*zram
= dev_to_zram(dev
);
60 if (zram
->init_done
) {
61 pr_info("Cannot change disksize for initialized device\n");
65 ret
= strict_strtoull(buf
, 10, &zram
->disksize
);
69 zram
->disksize
= PAGE_ALIGN(zram
->disksize
);
70 set_capacity(zram
->disk
, zram
->disksize
>> SECTOR_SHIFT
);
75 static ssize_t
initstate_show(struct device
*dev
,
76 struct device_attribute
*attr
, char *buf
)
78 struct zram
*zram
= dev_to_zram(dev
);
80 return sprintf(buf
, "%u\n", zram
->init_done
);
83 static ssize_t
reset_store(struct device
*dev
,
84 struct device_attribute
*attr
, const char *buf
, size_t len
)
87 unsigned long do_reset
;
89 struct block_device
*bdev
;
91 zram
= dev_to_zram(dev
);
92 bdev
= bdget_disk(zram
->disk
, 0);
94 /* Do not reset an active device! */
98 ret
= strict_strtoul(buf
, 10, &do_reset
);
105 /* Make sure all pending I/O is finished */
110 zram_reset_device(zram
);
115 static ssize_t
num_reads_show(struct device
*dev
,
116 struct device_attribute
*attr
, char *buf
)
118 struct zram
*zram
= dev_to_zram(dev
);
120 return sprintf(buf
, "%llu\n",
121 zram_stat64_read(zram
, &zram
->stats
.num_reads
));
124 static ssize_t
num_writes_show(struct device
*dev
,
125 struct device_attribute
*attr
, char *buf
)
127 struct zram
*zram
= dev_to_zram(dev
);
129 return sprintf(buf
, "%llu\n",
130 zram_stat64_read(zram
, &zram
->stats
.num_writes
));
133 static ssize_t
invalid_io_show(struct device
*dev
,
134 struct device_attribute
*attr
, char *buf
)
136 struct zram
*zram
= dev_to_zram(dev
);
138 return sprintf(buf
, "%llu\n",
139 zram_stat64_read(zram
, &zram
->stats
.invalid_io
));
142 static ssize_t
notify_free_show(struct device
*dev
,
143 struct device_attribute
*attr
, char *buf
)
145 struct zram
*zram
= dev_to_zram(dev
);
147 return sprintf(buf
, "%llu\n",
148 zram_stat64_read(zram
, &zram
->stats
.notify_free
));
151 static ssize_t
zero_pages_show(struct device
*dev
,
152 struct device_attribute
*attr
, char *buf
)
154 struct zram
*zram
= dev_to_zram(dev
);
156 return sprintf(buf
, "%u\n", zram
->stats
.pages_zero
);
159 static ssize_t
orig_data_size_show(struct device
*dev
,
160 struct device_attribute
*attr
, char *buf
)
162 struct zram
*zram
= dev_to_zram(dev
);
164 return sprintf(buf
, "%llu\n",
165 (u64
)(zram
->stats
.pages_stored
) << PAGE_SHIFT
);
168 static ssize_t
compr_data_size_show(struct device
*dev
,
169 struct device_attribute
*attr
, char *buf
)
171 struct zram
*zram
= dev_to_zram(dev
);
173 return sprintf(buf
, "%llu\n",
174 zram_stat64_read(zram
, &zram
->stats
.compr_size
));
177 static ssize_t
mem_used_total_show(struct device
*dev
,
178 struct device_attribute
*attr
, char *buf
)
181 struct zram
*zram
= dev_to_zram(dev
);
183 if (zram
->init_done
) {
184 val
= xv_get_total_size_bytes(zram
->mem_pool
) +
185 ((u64
)(zram
->stats
.pages_expand
) << PAGE_SHIFT
);
188 return sprintf(buf
, "%llu\n", val
);
191 static DEVICE_ATTR(disksize
, S_IRUGO
| S_IWUSR
,
192 disksize_show
, disksize_store
);
193 static DEVICE_ATTR(initstate
, S_IRUGO
, initstate_show
, NULL
);
194 static DEVICE_ATTR(reset
, S_IWUSR
, NULL
, reset_store
);
195 static DEVICE_ATTR(num_reads
, S_IRUGO
, num_reads_show
, NULL
);
196 static DEVICE_ATTR(num_writes
, S_IRUGO
, num_writes_show
, NULL
);
197 static DEVICE_ATTR(invalid_io
, S_IRUGO
, invalid_io_show
, NULL
);
198 static DEVICE_ATTR(notify_free
, S_IRUGO
, notify_free_show
, NULL
);
199 static DEVICE_ATTR(zero_pages
, S_IRUGO
, zero_pages_show
, NULL
);
200 static DEVICE_ATTR(orig_data_size
, S_IRUGO
, orig_data_size_show
, NULL
);
201 static DEVICE_ATTR(compr_data_size
, S_IRUGO
, compr_data_size_show
, NULL
);
202 static DEVICE_ATTR(mem_used_total
, S_IRUGO
, mem_used_total_show
, NULL
);
204 static struct attribute
*zram_disk_attrs
[] = {
205 &dev_attr_disksize
.attr
,
206 &dev_attr_initstate
.attr
,
207 &dev_attr_reset
.attr
,
208 &dev_attr_num_reads
.attr
,
209 &dev_attr_num_writes
.attr
,
210 &dev_attr_invalid_io
.attr
,
211 &dev_attr_notify_free
.attr
,
212 &dev_attr_zero_pages
.attr
,
213 &dev_attr_orig_data_size
.attr
,
214 &dev_attr_compr_data_size
.attr
,
215 &dev_attr_mem_used_total
.attr
,
219 struct attribute_group zram_disk_attr_group
= {
220 .attrs
= zram_disk_attrs
,