|
@@ -63,6 +63,27 @@ static inline struct zram *dev_to_zram(struct device *dev)
|
|
|
return (struct zram *)dev_to_disk(dev)->private_data;
|
|
|
}
|
|
|
|
|
|
+static ssize_t compact_store(struct device *dev,
|
|
|
+ struct device_attribute *attr, const char *buf, size_t len)
|
|
|
+{
|
|
|
+ unsigned long nr_migrated;
|
|
|
+ struct zram *zram = dev_to_zram(dev);
|
|
|
+ struct zram_meta *meta;
|
|
|
+
|
|
|
+ down_read(&zram->init_lock);
|
|
|
+ if (!init_done(zram)) {
|
|
|
+ up_read(&zram->init_lock);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ meta = zram->meta;
|
|
|
+ nr_migrated = zs_compact(meta->mem_pool);
|
|
|
+ atomic64_add(nr_migrated, &zram->stats.num_migrated);
|
|
|
+ up_read(&zram->init_lock);
|
|
|
+
|
|
|
+ return len;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t disksize_show(struct device *dev,
|
|
|
struct device_attribute *attr, char *buf)
|
|
|
{
|
|
@@ -1017,6 +1038,7 @@ static const struct block_device_operations zram_devops = {
|
|
|
.owner = THIS_MODULE
|
|
|
};
|
|
|
|
|
|
+static DEVICE_ATTR_WO(compact);
|
|
|
static DEVICE_ATTR_RW(disksize);
|
|
|
static DEVICE_ATTR_RO(initstate);
|
|
|
static DEVICE_ATTR_WO(reset);
|
|
@@ -1035,6 +1057,7 @@ ZRAM_ATTR_RO(invalid_io);
|
|
|
ZRAM_ATTR_RO(notify_free);
|
|
|
ZRAM_ATTR_RO(zero_pages);
|
|
|
ZRAM_ATTR_RO(compr_data_size);
|
|
|
+ZRAM_ATTR_RO(num_migrated);
|
|
|
|
|
|
static struct attribute *zram_disk_attrs[] = {
|
|
|
&dev_attr_disksize.attr,
|
|
@@ -1044,6 +1067,8 @@ static struct attribute *zram_disk_attrs[] = {
|
|
|
&dev_attr_num_writes.attr,
|
|
|
&dev_attr_failed_reads.attr,
|
|
|
&dev_attr_failed_writes.attr,
|
|
|
+ &dev_attr_num_migrated.attr,
|
|
|
+ &dev_attr_compact.attr,
|
|
|
&dev_attr_invalid_io.attr,
|
|
|
&dev_attr_notify_free.attr,
|
|
|
&dev_attr_zero_pages.attr,
|