zram: remove max_comp_streams internals

Remove the internal part of max_comp_streams interface, since we
switched to per-cpu streams.  We will keep RW max_comp_streams attr
around, because:

a) we may (silently) switch back to idle compression streams list and
   don't want to disturb user space

b) max_comp_streams attr must wait for the next 'lay off cycle'; we
   give user space 2 years to adjust before we remove/downgrade the attr,
   and there are already several attrs scheduled for removal in 4.11, so
   it's too late for max_comp_streams.

This slightly change a user visible behaviour:

- First, reading from max_comp_stream file now will always return the
  number of online CPUs.

- Second, writing to max_comp_stream will not take any effect.

Link: http://lkml.kernel.org/r/20160503165546.25201-1-sergey.senozhatsky@gmail.com
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Sergey Senozhatsky 2016-05-20 16:59:59 -07:00 committed by Linus Torvalds
parent d34f615720
commit 43209ea2d1
4 changed files with 18 additions and 58 deletions

View File

@ -59,27 +59,16 @@ num_devices parameter is optional and tells zram how many devices should be
pre-created. Default: 1. pre-created. Default: 1.
2) Set max number of compression streams 2) Set max number of compression streams
Compression backend may use up to max_comp_streams compression streams, Regardless the value passed to this attribute, ZRAM will always
thus allowing up to max_comp_streams concurrent compression operations. allocate multiple compression streams - one per online CPUs - thus
By default, compression backend uses single compression stream. allowing several concurrent compression operations. The number of
allocated compression streams goes down when some of the CPUs
become offline. There is no single-compression-stream mode anymore,
unless you are running a UP system or has only 1 CPU online.
Examples: To find out how many streams are currently available:
#show max compression streams number
cat /sys/block/zram0/max_comp_streams cat /sys/block/zram0/max_comp_streams
#set max compression streams number to 3
echo 3 > /sys/block/zram0/max_comp_streams
Note:
In order to enable compression backend's multi stream support max_comp_streams
must be initially set to desired concurrency level before ZRAM device
initialisation. Once the device initialised as a single stream compression
backend (max_comp_streams equals to 1), you will see error if you try to change
the value of max_comp_streams because single stream compression backend
implemented as a special case by lock overhead issue and does not support
dynamic max_comp_streams. Only multi stream backend supports dynamic
max_comp_streams adjustment.
3) Select compression algorithm 3) Select compression algorithm
Using comp_algorithm device attribute one can see available and Using comp_algorithm device attribute one can see available and
currently selected (shown in square brackets) compression algorithms, currently selected (shown in square brackets) compression algorithms,

View File

@ -95,11 +95,6 @@ bool zcomp_available_algorithm(const char *comp)
return find_backend(comp) != NULL; return find_backend(comp) != NULL;
} }
bool zcomp_set_max_streams(struct zcomp *comp, int num_strm)
{
return true;
}
struct zcomp_strm *zcomp_strm_find(struct zcomp *comp) struct zcomp_strm *zcomp_strm_find(struct zcomp *comp)
{ {
return *get_cpu_ptr(comp->stream); return *get_cpu_ptr(comp->stream);

View File

@ -304,46 +304,25 @@ static ssize_t mem_used_max_store(struct device *dev,
return len; return len;
} }
/*
* We switched to per-cpu streams and this attr is not needed anymore.
* However, we will keep it around for some time, because:
* a) we may revert per-cpu streams in the future
* b) it's visible to user space and we need to follow our 2 years
* retirement rule; but we already have a number of 'soon to be
* altered' attrs, so max_comp_streams need to wait for the next
* layoff cycle.
*/
static ssize_t max_comp_streams_show(struct device *dev, static ssize_t max_comp_streams_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
int val; return scnprintf(buf, PAGE_SIZE, "%d\n", num_online_cpus());
struct zram *zram = dev_to_zram(dev);
down_read(&zram->init_lock);
val = zram->max_comp_streams;
up_read(&zram->init_lock);
return scnprintf(buf, PAGE_SIZE, "%d\n", val);
} }
static ssize_t max_comp_streams_store(struct device *dev, static ssize_t max_comp_streams_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t len) struct device_attribute *attr, const char *buf, size_t len)
{ {
int num; return len;
struct zram *zram = dev_to_zram(dev);
int ret;
ret = kstrtoint(buf, 0, &num);
if (ret < 0)
return ret;
if (num < 1)
return -EINVAL;
down_write(&zram->init_lock);
if (init_done(zram)) {
if (!zcomp_set_max_streams(zram->comp, num)) {
pr_info("Cannot change max compression streams\n");
ret = -EINVAL;
goto out;
}
}
zram->max_comp_streams = num;
ret = len;
out:
up_write(&zram->init_lock);
return ret;
} }
static ssize_t comp_algorithm_show(struct device *dev, static ssize_t comp_algorithm_show(struct device *dev,
@ -1035,7 +1014,6 @@ static void zram_reset_device(struct zram *zram)
/* Reset stats */ /* Reset stats */
memset(&zram->stats, 0, sizeof(zram->stats)); memset(&zram->stats, 0, sizeof(zram->stats));
zram->disksize = 0; zram->disksize = 0;
zram->max_comp_streams = 1;
set_capacity(zram->disk, 0); set_capacity(zram->disk, 0);
part_stat_set_all(&zram->disk->part0, 0); part_stat_set_all(&zram->disk->part0, 0);
@ -1299,7 +1277,6 @@ static int zram_add(void)
} }
strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
zram->meta = NULL; zram->meta = NULL;
zram->max_comp_streams = 1;
pr_info("Added device: %s\n", zram->disk->disk_name); pr_info("Added device: %s\n", zram->disk->disk_name);
return device_id; return device_id;

View File

@ -102,7 +102,6 @@ struct zram {
* the number of pages zram can consume for storing compressed data * the number of pages zram can consume for storing compressed data
*/ */
unsigned long limit_pages; unsigned long limit_pages;
int max_comp_streams;
struct zram_stats stats; struct zram_stats stats;
atomic_t refcount; /* refcount for zram_meta */ atomic_t refcount; /* refcount for zram_meta */