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
< zram_num_devices
; i
++) {
38 zram
= &zram_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
)
59 struct zram
*zram
= dev_to_zram(dev
);
61 ret
= strict_strtoull(buf
, 10, &disksize
);
65 down_write(&zram
->init_lock
);
66 if (zram
->init_done
) {
67 up_write(&zram
->init_lock
);
68 pr_info("Cannot change disksize for initialized device\n");
72 zram
->disksize
= PAGE_ALIGN(disksize
);
73 set_capacity(zram
->disk
, zram
->disksize
>> SECTOR_SHIFT
);
74 up_write(&zram
->init_lock
);
79 static ssize_t
initstate_show(struct device
*dev
,
80 struct device_attribute
*attr
, char *buf
)
82 struct zram
*zram
= dev_to_zram(dev
);
84 return sprintf(buf
, "%u\n", zram
->init_done
);
87 static ssize_t
reset_store(struct device
*dev
,
88 struct device_attribute
*attr
, const char *buf
, size_t len
)
91 unsigned long do_reset
;
93 struct block_device
*bdev
;
95 zram
= dev_to_zram(dev
);
96 bdev
= bdget_disk(zram
->disk
, 0);
98 /* Do not reset an active device! */
102 ret
= strict_strtoul(buf
, 10, &do_reset
);
109 /* Make sure all pending I/O is finished */
113 down_write(&zram
->init_lock
);
115 __zram_reset_device(zram
);
116 up_write(&zram
->init_lock
);
121 static ssize_t
num_reads_show(struct device
*dev
,
122 struct device_attribute
*attr
, char *buf
)
124 struct zram
*zram
= dev_to_zram(dev
);
126 return sprintf(buf
, "%llu\n",
127 zram_stat64_read(zram
, &zram
->stats
.num_reads
));
130 static ssize_t
num_writes_show(struct device
*dev
,
131 struct device_attribute
*attr
, char *buf
)
133 struct zram
*zram
= dev_to_zram(dev
);
135 return sprintf(buf
, "%llu\n",
136 zram_stat64_read(zram
, &zram
->stats
.num_writes
));
139 static ssize_t
invalid_io_show(struct device
*dev
,
140 struct device_attribute
*attr
, char *buf
)
142 struct zram
*zram
= dev_to_zram(dev
);
144 return sprintf(buf
, "%llu\n",
145 zram_stat64_read(zram
, &zram
->stats
.invalid_io
));
148 static ssize_t
notify_free_show(struct device
*dev
,
149 struct device_attribute
*attr
, char *buf
)
151 struct zram
*zram
= dev_to_zram(dev
);
153 return sprintf(buf
, "%llu\n",
154 zram_stat64_read(zram
, &zram
->stats
.notify_free
));
157 static ssize_t
zero_pages_show(struct device
*dev
,
158 struct device_attribute
*attr
, char *buf
)
160 struct zram
*zram
= dev_to_zram(dev
);
162 return sprintf(buf
, "%u\n", zram
->stats
.pages_zero
);
165 static ssize_t
orig_data_size_show(struct device
*dev
,
166 struct device_attribute
*attr
, char *buf
)
168 struct zram
*zram
= dev_to_zram(dev
);
170 return sprintf(buf
, "%llu\n",
171 (u64
)(zram
->stats
.pages_stored
) << PAGE_SHIFT
);
174 static ssize_t
compr_data_size_show(struct device
*dev
,
175 struct device_attribute
*attr
, char *buf
)
177 struct zram
*zram
= dev_to_zram(dev
);
179 return sprintf(buf
, "%llu\n",
180 zram_stat64_read(zram
, &zram
->stats
.compr_size
));
183 static ssize_t
mem_used_total_show(struct device
*dev
,
184 struct device_attribute
*attr
, char *buf
)
187 struct zram
*zram
= dev_to_zram(dev
);
189 if (zram
->init_done
) {
190 val
= xv_get_total_size_bytes(zram
->mem_pool
) +
191 ((u64
)(zram
->stats
.pages_expand
) << PAGE_SHIFT
);
194 return sprintf(buf
, "%llu\n", val
);
197 static DEVICE_ATTR(disksize
, S_IRUGO
| S_IWUSR
,
198 disksize_show
, disksize_store
);
199 static DEVICE_ATTR(initstate
, S_IRUGO
, initstate_show
, NULL
);
200 static DEVICE_ATTR(reset
, S_IWUSR
, NULL
, reset_store
);
201 static DEVICE_ATTR(num_reads
, S_IRUGO
, num_reads_show
, NULL
);
202 static DEVICE_ATTR(num_writes
, S_IRUGO
, num_writes_show
, NULL
);
203 static DEVICE_ATTR(invalid_io
, S_IRUGO
, invalid_io_show
, NULL
);
204 static DEVICE_ATTR(notify_free
, S_IRUGO
, notify_free_show
, NULL
);
205 static DEVICE_ATTR(zero_pages
, S_IRUGO
, zero_pages_show
, NULL
);
206 static DEVICE_ATTR(orig_data_size
, S_IRUGO
, orig_data_size_show
, NULL
);
207 static DEVICE_ATTR(compr_data_size
, S_IRUGO
, compr_data_size_show
, NULL
);
208 static DEVICE_ATTR(mem_used_total
, S_IRUGO
, mem_used_total_show
, NULL
);
210 static struct attribute
*zram_disk_attrs
[] = {
211 &dev_attr_disksize
.attr
,
212 &dev_attr_initstate
.attr
,
213 &dev_attr_reset
.attr
,
214 &dev_attr_num_reads
.attr
,
215 &dev_attr_num_writes
.attr
,
216 &dev_attr_invalid_io
.attr
,
217 &dev_attr_notify_free
.attr
,
218 &dev_attr_zero_pages
.attr
,
219 &dev_attr_orig_data_size
.attr
,
220 &dev_attr_compr_data_size
.attr
,
221 &dev_attr_mem_used_total
.attr
,
225 struct attribute_group zram_disk_attr_group
= {
226 .attrs
= zram_disk_attrs
,