mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
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:
parent
d34f615720
commit
43209ea2d1
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user