Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e3ba878 authored by Minchan Kim's avatar Minchan Kim Committed by Linus Torvalds
Browse files

zram: support compaction



Now that zsmalloc supports compaction, zram can use it.  For the first
step, this patch exports compact knob via sysfs so user can do compaction
via "echo 1 > /sys/block/zram0/compact".

Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
Cc: Juneho Choi <juno.choi@lge.com>
Cc: Gunho Lee <gunho.lee@lge.com>
Cc: Luigi Semenzato <semenzato@google.com>
Cc: Dan Streetman <ddstreet@ieee.org>
Cc: Seth Jennings <sjennings@variantweb.net>
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Jerome Marchand <jmarchan@redhat.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d3d07c92
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -141,3 +141,18 @@ Description:
		amount of memory ZRAM can use to store the compressed data.  The
		limit could be changed in run time and "0" means disable the
		limit.  No limit is the initial state.  Unit: bytes

What:		/sys/block/zram<id>/compact
Date:		August 2015
Contact:	Minchan Kim <minchan@kernel.org>
Description:
		The compact file is write-only and trigger compaction for
		allocator zrm uses. The allocator moves some objects so that
		it could free fragment space.

What:		/sys/block/zram<id>/num_migrated
Date:		August 2015
Contact:	Minchan Kim <minchan@kernel.org>
Description:
		The compact file is read-only and shows how many object
		migrated by compaction.
+25 −0
Original line number Diff line number Diff line
@@ -63,6 +63,27 @@ static inline struct zram *dev_to_zram(struct device *dev)
	return (struct zram *)dev_to_disk(dev)->private_data;
}

static ssize_t compact_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t len)
{
	unsigned long nr_migrated;
	struct zram *zram = dev_to_zram(dev);
	struct zram_meta *meta;

	down_read(&zram->init_lock);
	if (!init_done(zram)) {
		up_read(&zram->init_lock);
		return -EINVAL;
	}

	meta = zram->meta;
	nr_migrated = zs_compact(meta->mem_pool);
	atomic64_add(nr_migrated, &zram->stats.num_migrated);
	up_read(&zram->init_lock);

	return len;
}

static ssize_t disksize_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
@@ -1017,6 +1038,7 @@ static const struct block_device_operations zram_devops = {
	.owner = THIS_MODULE
};

static DEVICE_ATTR_WO(compact);
static DEVICE_ATTR_RW(disksize);
static DEVICE_ATTR_RO(initstate);
static DEVICE_ATTR_WO(reset);
@@ -1035,6 +1057,7 @@ ZRAM_ATTR_RO(invalid_io);
ZRAM_ATTR_RO(notify_free);
ZRAM_ATTR_RO(zero_pages);
ZRAM_ATTR_RO(compr_data_size);
ZRAM_ATTR_RO(num_migrated);

static struct attribute *zram_disk_attrs[] = {
	&dev_attr_disksize.attr,
@@ -1044,6 +1067,8 @@ static struct attribute *zram_disk_attrs[] = {
	&dev_attr_num_writes.attr,
	&dev_attr_failed_reads.attr,
	&dev_attr_failed_writes.attr,
	&dev_attr_num_migrated.attr,
	&dev_attr_compact.attr,
	&dev_attr_invalid_io.attr,
	&dev_attr_notify_free.attr,
	&dev_attr_zero_pages.attr,
+1 −0
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ struct zram_stats {
	atomic64_t compr_data_size;	/* compressed size of pages stored */
	atomic64_t num_reads;	/* failed + successful */
	atomic64_t num_writes;	/* --do-- */
	atomic64_t num_migrated;	/* no. of migrated object */
	atomic64_t failed_reads;	/* can happen when memory is too low */
	atomic64_t failed_writes;	/* can happen when memory is too low */
	atomic64_t invalid_io;	/* non-page-aligned I/O requests */