|
@@ -122,6 +122,37 @@ static ssize_t max_comp_streams_show(struct device *dev,
|
|
|
return scnprintf(buf, PAGE_SIZE, "%d\n", val);
|
|
|
}
|
|
|
|
|
|
+static ssize_t mem_limit_show(struct device *dev,
|
|
|
+ struct device_attribute *attr, char *buf)
|
|
|
+{
|
|
|
+ u64 val;
|
|
|
+ struct zram *zram = dev_to_zram(dev);
|
|
|
+
|
|
|
+ down_read(&zram->init_lock);
|
|
|
+ val = zram->limit_pages;
|
|
|
+ up_read(&zram->init_lock);
|
|
|
+
|
|
|
+ return scnprintf(buf, PAGE_SIZE, "%llu\n", val << PAGE_SHIFT);
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t mem_limit_store(struct device *dev,
|
|
|
+ struct device_attribute *attr, const char *buf, size_t len)
|
|
|
+{
|
|
|
+ u64 limit;
|
|
|
+ char *tmp;
|
|
|
+ struct zram *zram = dev_to_zram(dev);
|
|
|
+
|
|
|
+ limit = memparse(buf, &tmp);
|
|
|
+ if (buf == tmp) /* no chars parsed, invalid input */
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ down_write(&zram->init_lock);
|
|
|
+ zram->limit_pages = PAGE_ALIGN(limit) >> PAGE_SHIFT;
|
|
|
+ up_write(&zram->init_lock);
|
|
|
+
|
|
|
+ return len;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t max_comp_streams_store(struct device *dev,
|
|
|
struct device_attribute *attr, const char *buf, size_t len)
|
|
|
{
|
|
@@ -513,6 +544,14 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
|
|
|
ret = -ENOMEM;
|
|
|
goto out;
|
|
|
}
|
|
|
+
|
|
|
+ if (zram->limit_pages &&
|
|
|
+ zs_get_total_pages(meta->mem_pool) > zram->limit_pages) {
|
|
|
+ zs_free(meta->mem_pool, handle);
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO);
|
|
|
|
|
|
if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) {
|
|
@@ -617,6 +656,9 @@ static void zram_reset_device(struct zram *zram, bool reset_capacity)
|
|
|
struct zram_meta *meta;
|
|
|
|
|
|
down_write(&zram->init_lock);
|
|
|
+
|
|
|
+ zram->limit_pages = 0;
|
|
|
+
|
|
|
if (!init_done(zram)) {
|
|
|
up_write(&zram->init_lock);
|
|
|
return;
|
|
@@ -857,6 +899,8 @@ static DEVICE_ATTR(initstate, S_IRUGO, initstate_show, NULL);
|
|
|
static DEVICE_ATTR(reset, S_IWUSR, NULL, reset_store);
|
|
|
static DEVICE_ATTR(orig_data_size, S_IRUGO, orig_data_size_show, NULL);
|
|
|
static DEVICE_ATTR(mem_used_total, S_IRUGO, mem_used_total_show, NULL);
|
|
|
+static DEVICE_ATTR(mem_limit, S_IRUGO | S_IWUSR, mem_limit_show,
|
|
|
+ mem_limit_store);
|
|
|
static DEVICE_ATTR(max_comp_streams, S_IRUGO | S_IWUSR,
|
|
|
max_comp_streams_show, max_comp_streams_store);
|
|
|
static DEVICE_ATTR(comp_algorithm, S_IRUGO | S_IWUSR,
|
|
@@ -885,6 +929,7 @@ static struct attribute *zram_disk_attrs[] = {
|
|
|
&dev_attr_orig_data_size.attr,
|
|
|
&dev_attr_compr_data_size.attr,
|
|
|
&dev_attr_mem_used_total.attr,
|
|
|
+ &dev_attr_mem_limit.attr,
|
|
|
&dev_attr_max_comp_streams.attr,
|
|
|
&dev_attr_comp_algorithm.attr,
|
|
|
NULL,
|