]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/zram/zram_drv.c
Merge tag 'char-misc-4.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[karo-tx-linux.git] / drivers / block / zram / zram_drv.c
index 8e233edd7a097a0f91d323071c97f16e43308e5d..c94386aa563d618abf2d59a046b50b1607c3a20f 100644 (file)
@@ -43,11 +43,22 @@ static const char *default_compressor = "lzo";
 /* Module params (documentation at end) */
 static unsigned int num_devices = 1;
 
+static inline void deprecated_attr_warn(const char *name)
+{
+       pr_warn_once("%d (%s) Attribute %s (and others) will be removed. %s\n",
+                       task_pid_nr(current),
+                       current->comm,
+                       name,
+                       "See zram documentation.");
+}
+
 #define ZRAM_ATTR_RO(name)                                             \
 static ssize_t name##_show(struct device *d,           \
                                struct device_attribute *attr, char *b) \
 {                                                                      \
        struct zram *zram = dev_to_zram(d);                             \
+                                                                       \
+       deprecated_attr_warn(__stringify(name));                        \
        return scnprintf(b, PAGE_SIZE, "%llu\n",                        \
                (u64)atomic64_read(&zram->stats.name));                 \
 }                                                                      \
@@ -89,6 +100,7 @@ static ssize_t orig_data_size_show(struct device *dev,
 {
        struct zram *zram = dev_to_zram(dev);
 
+       deprecated_attr_warn("orig_data_size");
        return scnprintf(buf, PAGE_SIZE, "%llu\n",
                (u64)(atomic64_read(&zram->stats.pages_stored)) << PAGE_SHIFT);
 }
@@ -99,6 +111,7 @@ static ssize_t mem_used_total_show(struct device *dev,
        u64 val = 0;
        struct zram *zram = dev_to_zram(dev);
 
+       deprecated_attr_warn("mem_used_total");
        down_read(&zram->init_lock);
        if (init_done(zram)) {
                struct zram_meta *meta = zram->meta;
@@ -128,6 +141,7 @@ static ssize_t mem_limit_show(struct device *dev,
        u64 val;
        struct zram *zram = dev_to_zram(dev);
 
+       deprecated_attr_warn("mem_limit");
        down_read(&zram->init_lock);
        val = zram->limit_pages;
        up_read(&zram->init_lock);
@@ -159,6 +173,7 @@ static ssize_t mem_used_max_show(struct device *dev,
        u64 val = 0;
        struct zram *zram = dev_to_zram(dev);
 
+       deprecated_attr_warn("mem_used_max");
        down_read(&zram->init_lock);
        if (init_done(zram))
                val = atomic_long_read(&zram->stats.max_used_pages);
@@ -528,7 +543,7 @@ out_cleanup:
 static inline void update_used_max(struct zram *zram,
                                        const unsigned long pages)
 {
-       int old_max, cur_max;
+       unsigned long old_max, cur_max;
 
        old_max = atomic_long_read(&zram->stats.max_used_pages);
 
@@ -670,8 +685,12 @@ out:
 static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index,
                        int offset, int rw)
 {
+       unsigned long start_time = jiffies;
        int ret;
 
+       generic_start_io_acct(rw, bvec->bv_len >> SECTOR_SHIFT,
+                       &zram->disk->part0);
+
        if (rw == READ) {
                atomic64_inc(&zram->stats.num_reads);
                ret = zram_bvec_read(zram, bvec, index, offset);
@@ -680,6 +699,8 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index,
                ret = zram_bvec_write(zram, bvec, index, offset);
        }
 
+       generic_end_io_acct(rw, &zram->disk->part0, start_time);
+
        if (unlikely(ret)) {
                if (rw == READ)
                        atomic64_inc(&zram->stats.failed_reads);
@@ -1027,6 +1048,55 @@ static DEVICE_ATTR_RW(mem_used_max);
 static DEVICE_ATTR_RW(max_comp_streams);
 static DEVICE_ATTR_RW(comp_algorithm);
 
+static ssize_t io_stat_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct zram *zram = dev_to_zram(dev);
+       ssize_t ret;
+
+       down_read(&zram->init_lock);
+       ret = scnprintf(buf, PAGE_SIZE,
+                       "%8llu %8llu %8llu %8llu\n",
+                       (u64)atomic64_read(&zram->stats.failed_reads),
+                       (u64)atomic64_read(&zram->stats.failed_writes),
+                       (u64)atomic64_read(&zram->stats.invalid_io),
+                       (u64)atomic64_read(&zram->stats.notify_free));
+       up_read(&zram->init_lock);
+
+       return ret;
+}
+
+static ssize_t mm_stat_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct zram *zram = dev_to_zram(dev);
+       u64 orig_size, mem_used = 0;
+       long max_used;
+       ssize_t ret;
+
+       down_read(&zram->init_lock);
+       if (init_done(zram))
+               mem_used = zs_get_total_pages(zram->meta->mem_pool);
+
+       orig_size = atomic64_read(&zram->stats.pages_stored);
+       max_used = atomic_long_read(&zram->stats.max_used_pages);
+
+       ret = scnprintf(buf, PAGE_SIZE,
+                       "%8llu %8llu %8llu %8lu %8ld %8llu %8llu\n",
+                       orig_size << PAGE_SHIFT,
+                       (u64)atomic64_read(&zram->stats.compr_data_size),
+                       mem_used << PAGE_SHIFT,
+                       zram->limit_pages << PAGE_SHIFT,
+                       max_used << PAGE_SHIFT,
+                       (u64)atomic64_read(&zram->stats.zero_pages),
+                       (u64)atomic64_read(&zram->stats.num_migrated));
+       up_read(&zram->init_lock);
+
+       return ret;
+}
+
+static DEVICE_ATTR_RO(io_stat);
+static DEVICE_ATTR_RO(mm_stat);
 ZRAM_ATTR_RO(num_reads);
 ZRAM_ATTR_RO(num_writes);
 ZRAM_ATTR_RO(failed_reads);
@@ -1054,6 +1124,8 @@ static struct attribute *zram_disk_attrs[] = {
        &dev_attr_mem_used_max.attr,
        &dev_attr_max_comp_streams.attr,
        &dev_attr_comp_algorithm.attr,
+       &dev_attr_io_stat.attr,
+       &dev_attr_mm_stat.attr,
        NULL,
 };
 
@@ -1082,6 +1154,7 @@ static int create_device(struct zram *zram, int device_id)
        if (!zram->disk) {
                pr_warn("Error allocating disk structure for device %d\n",
                        device_id);
+               ret = -ENOMEM;
                goto out_free_queue;
        }