]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/block/zram/zram_drv.c
zram: use atomic64_t for all zram stats
[mirror_ubuntu-artful-kernel.git] / drivers / block / zram / zram_drv.c
index 51c557cfd92b37cf6b7aecdfa50d212fdacc05ee..1bf97b2f8f3f72bc43fa56be7016720df4a170ea 100644 (file)
@@ -42,6 +42,11 @@ static struct zram *zram_devices;
 /* Module params (documentation at end) */
 static unsigned int num_devices = 1;
 
+static inline int init_done(struct zram *zram)
+{
+       return zram->meta != NULL;
+}
+
 static inline struct zram *dev_to_zram(struct device *dev)
 {
        return (struct zram *)dev_to_disk(dev)->private_data;
@@ -60,7 +65,7 @@ static ssize_t initstate_show(struct device *dev,
 {
        struct zram *zram = dev_to_zram(dev);
 
-       return sprintf(buf, "%u\n", zram->init_done);
+       return sprintf(buf, "%u\n", init_done(zram));
 }
 
 static ssize_t num_reads_show(struct device *dev,
@@ -104,7 +109,7 @@ static ssize_t zero_pages_show(struct device *dev,
 {
        struct zram *zram = dev_to_zram(dev);
 
-       return sprintf(buf, "%u\n", atomic_read(&zram->stats.pages_zero));
+       return sprintf(buf, "%llu\n", (u64)atomic64_read(&zram->stats.zero_pages));
 }
 
 static ssize_t orig_data_size_show(struct device *dev,
@@ -113,7 +118,7 @@ static ssize_t orig_data_size_show(struct device *dev,
        struct zram *zram = dev_to_zram(dev);
 
        return sprintf(buf, "%llu\n",
-               (u64)(atomic_read(&zram->stats.pages_stored)) << PAGE_SHIFT);
+               (u64)(atomic64_read(&zram->stats.pages_stored)) << PAGE_SHIFT);
 }
 
 static ssize_t compr_data_size_show(struct device *dev,
@@ -122,7 +127,7 @@ static ssize_t compr_data_size_show(struct device *dev,
        struct zram *zram = dev_to_zram(dev);
 
        return sprintf(buf, "%llu\n",
-                       (u64)atomic64_read(&zram->stats.compr_size));
+                       (u64)atomic64_read(&zram->stats.compr_data_size));
 }
 
 static ssize_t mem_used_total_show(struct device *dev,
@@ -133,7 +138,7 @@ static ssize_t mem_used_total_show(struct device *dev,
        struct zram_meta *meta = zram->meta;
 
        down_read(&zram->init_lock);
-       if (zram->init_done)
+       if (init_done(zram))
                val = zs_get_total_size_bytes(meta->mem_pool);
        up_read(&zram->init_lock);
 
@@ -288,7 +293,6 @@ static void zram_free_page(struct zram *zram, size_t index)
 {
        struct zram_meta *meta = zram->meta;
        unsigned long handle = meta->table[index].handle;
-       u16 size = meta->table[index].size;
 
        if (unlikely(!handle)) {
                /*
@@ -297,21 +301,15 @@ static void zram_free_page(struct zram *zram, size_t index)
                 */
                if (zram_test_flag(meta, index, ZRAM_ZERO)) {
                        zram_clear_flag(meta, index, ZRAM_ZERO);
-                       atomic_dec(&zram->stats.pages_zero);
+                       atomic64_dec(&zram->stats.zero_pages);
                }
                return;
        }
 
-       if (unlikely(size > max_zpage_size))
-               atomic_dec(&zram->stats.bad_compress);
-
        zs_free(meta->mem_pool, handle);
 
-       if (size <= PAGE_SIZE / 2)
-               atomic_dec(&zram->stats.good_compress);
-
-       atomic64_sub(meta->table[index].size, &zram->stats.compr_size);
-       atomic_dec(&zram->stats.pages_stored);
+       atomic64_sub(meta->table[index].size, &zram->stats.compr_data_size);
+       atomic64_dec(&zram->stats.pages_stored);
 
        meta->table[index].handle = 0;
        meta->table[index].size = 0;
@@ -454,7 +452,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
                zram_set_flag(meta, index, ZRAM_ZERO);
                write_unlock(&zram->meta->tb_lock);
 
-               atomic_inc(&zram->stats.pages_zero);
+               atomic64_inc(&zram->stats.zero_pages);
                ret = 0;
                goto out;
        }
@@ -473,7 +471,6 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
        }
 
        if (unlikely(clen > max_zpage_size)) {
-               atomic_inc(&zram->stats.bad_compress);
                clen = PAGE_SIZE;
                src = NULL;
                if (is_partial_io(bvec))
@@ -511,11 +508,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
        write_unlock(&zram->meta->tb_lock);
 
        /* Update stats */
-       atomic64_add(clen, &zram->stats.compr_size);
-       atomic_inc(&zram->stats.pages_stored);
-       if (clen <= PAGE_SIZE / 2)
-               atomic_inc(&zram->stats.good_compress);
-
+       atomic64_add(clen, &zram->stats.compr_data_size);
+       atomic64_inc(&zram->stats.pages_stored);
 out:
        if (locked)
                mutex_unlock(&meta->buffer_lock);
@@ -528,14 +522,18 @@ out:
 }
 
 static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index,
-                       int offset, struct bio *bio, int rw)
+                       int offset, struct bio *bio)
 {
        int ret;
+       int rw = bio_data_dir(bio);
 
-       if (rw == READ)
+       if (rw == READ) {
+               atomic64_inc(&zram->stats.num_reads);
                ret = zram_bvec_read(zram, bvec, index, offset, bio);
-       else
+       } else {
+               atomic64_inc(&zram->stats.num_writes);
                ret = zram_bvec_write(zram, bvec, index, offset);
+       }
 
        return ret;
 }
@@ -546,14 +544,12 @@ static void zram_reset_device(struct zram *zram, bool reset_capacity)
        struct zram_meta *meta;
 
        down_write(&zram->init_lock);
-       if (!zram->init_done) {
+       if (!init_done(zram)) {
                up_write(&zram->init_lock);
                return;
        }
 
        meta = zram->meta;
-       zram->init_done = 0;
-
        /* Free all pages that are still in this zram device */
        for (index = 0; index < zram->disksize >> PAGE_SHIFT; index++) {
                unsigned long handle = meta->table[index].handle;
@@ -594,8 +590,6 @@ static void zram_init_device(struct zram *zram, struct zram_meta *meta)
        queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zram->disk->queue);
 
        zram->meta = meta;
-       zram->init_done = 1;
-
        pr_debug("Initialization done!\n");
 }
 
@@ -615,7 +609,7 @@ static ssize_t disksize_store(struct device *dev,
        if (!meta)
                return -ENOMEM;
        down_write(&zram->init_lock);
-       if (zram->init_done) {
+       if (init_done(zram)) {
                up_write(&zram->init_lock);
                zram_meta_free(meta);
                pr_info("Cannot change disksize for initialized device\n");
@@ -671,22 +665,13 @@ out:
        return ret;
 }
 
-static void __zram_make_request(struct zram *zram, struct bio *bio, int rw)
+static void __zram_make_request(struct zram *zram, struct bio *bio)
 {
        int offset;
        u32 index;
        struct bio_vec bvec;
        struct bvec_iter iter;
 
-       switch (rw) {
-       case READ:
-               atomic64_inc(&zram->stats.num_reads);
-               break;
-       case WRITE:
-               atomic64_inc(&zram->stats.num_writes);
-               break;
-       }
-
        index = bio->bi_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT;
        offset = (bio->bi_iter.bi_sector &
                  (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT;
@@ -705,16 +690,15 @@ static void __zram_make_request(struct zram *zram, struct bio *bio, int rw)
                        bv.bv_len = max_transfer_size;
                        bv.bv_offset = bvec.bv_offset;
 
-                       if (zram_bvec_rw(zram, &bv, index, offset, bio, rw) < 0)
+                       if (zram_bvec_rw(zram, &bv, index, offset, bio) < 0)
                                goto out;
 
                        bv.bv_len = bvec.bv_len - max_transfer_size;
                        bv.bv_offset += max_transfer_size;
-                       if (zram_bvec_rw(zram, &bv, index+1, 0, bio, rw) < 0)
+                       if (zram_bvec_rw(zram, &bv, index + 1, 0, bio) < 0)
                                goto out;
                } else
-                       if (zram_bvec_rw(zram, &bvec, index, offset, bio, rw)
-                           < 0)
+                       if (zram_bvec_rw(zram, &bvec, index, offset, bio) < 0)
                                goto out;
 
                update_position(&index, &offset, &bvec);
@@ -736,7 +720,7 @@ static void zram_make_request(struct request_queue *queue, struct bio *bio)
        struct zram *zram = queue->queuedata;
 
        down_read(&zram->init_lock);
-       if (unlikely(!zram->init_done))
+       if (unlikely(!init_done(zram)))
                goto error;
 
        if (!valid_io_request(zram, bio)) {
@@ -744,7 +728,7 @@ static void zram_make_request(struct request_queue *queue, struct bio *bio)
                goto error;
        }
 
-       __zram_make_request(zram, bio, bio_data_dir(bio));
+       __zram_make_request(zram, bio);
        up_read(&zram->init_lock);
 
        return;
@@ -859,7 +843,7 @@ static int create_device(struct zram *zram, int device_id)
                goto out_free_disk;
        }
 
-       zram->init_done = 0;
+       zram->meta = NULL;
        return 0;
 
 out_free_disk: