Merge tag 'for-5.11/block-2020-12-14' of git://git.kernel.dk/linux-block
[platform/kernel/linux-starfive.git] / drivers / block / zram / zram_drv.c
index b0701ba..e2933cb 100644 (file)
@@ -42,7 +42,7 @@ static DEFINE_IDR(zram_index_idr);
 static DEFINE_MUTEX(zram_index_mutex);
 
 static int zram_major;
-static const char *default_compressor = "lzo-rle";
+static const char *default_compressor = CONFIG_ZRAM_DEF_COMP;
 
 /* Module params (documentation at end) */
 static unsigned int num_devices = 1;
@@ -611,15 +611,19 @@ static int read_from_bdev_async(struct zram *zram, struct bio_vec *bvec,
        return 1;
 }
 
+#define PAGE_WB_SIG "page_index="
+
+#define PAGE_WRITEBACK 0
 #define HUGE_WRITEBACK 1
 #define IDLE_WRITEBACK 2
 
+
 static ssize_t writeback_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
        struct zram *zram = dev_to_zram(dev);
        unsigned long nr_pages = zram->disksize >> PAGE_SHIFT;
-       unsigned long index;
+       unsigned long index = 0;
        struct bio bio;
        struct bio_vec bio_vec;
        struct page *page;
@@ -631,8 +635,17 @@ static ssize_t writeback_store(struct device *dev,
                mode = IDLE_WRITEBACK;
        else if (sysfs_streq(buf, "huge"))
                mode = HUGE_WRITEBACK;
-       else
-               return -EINVAL;
+       else {
+               if (strncmp(buf, PAGE_WB_SIG, sizeof(PAGE_WB_SIG) - 1))
+                       return -EINVAL;
+
+               ret = kstrtol(buf + sizeof(PAGE_WB_SIG) - 1, 10, &index);
+               if (ret || index >= nr_pages)
+                       return -EINVAL;
+
+               nr_pages = 1;
+               mode = PAGE_WRITEBACK;
+       }
 
        down_read(&zram->init_lock);
        if (!init_done(zram)) {
@@ -651,7 +664,7 @@ static ssize_t writeback_store(struct device *dev,
                goto release_init_lock;
        }
 
-       for (index = 0; index < nr_pages; index++) {
+       while (nr_pages--) {
                struct bio_vec bvec;
 
                bvec.bv_page = page;
@@ -1062,7 +1075,7 @@ static ssize_t mm_stat_show(struct device *dev,
        max_used = atomic_long_read(&zram->stats.max_used_pages);
 
        ret = scnprintf(buf, PAGE_SIZE,
-                       "%8llu %8llu %8llu %8lu %8ld %8llu %8lu %8llu\n",
+                       "%8llu %8llu %8llu %8lu %8ld %8llu %8lu %8llu %8llu\n",
                        orig_size << PAGE_SHIFT,
                        (u64)atomic64_read(&zram->stats.compr_data_size),
                        mem_used << PAGE_SHIFT,
@@ -1070,7 +1083,8 @@ static ssize_t mm_stat_show(struct device *dev,
                        max_used << PAGE_SHIFT,
                        (u64)atomic64_read(&zram->stats.same_pages),
                        pool_stats.pages_compacted,
-                       (u64)atomic64_read(&zram->stats.huge_pages));
+                       (u64)atomic64_read(&zram->stats.huge_pages),
+                       (u64)atomic64_read(&zram->stats.huge_pages_since));
        up_read(&zram->init_lock);
 
        return ret;
@@ -1402,6 +1416,7 @@ out:
        if (comp_len == PAGE_SIZE) {
                zram_set_flag(zram, index, ZRAM_HUGE);
                atomic64_inc(&zram->stats.huge_pages);
+               atomic64_inc(&zram->stats.huge_pages_since);
        }
 
        if (flags) {