mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 09:13:55 +08:00
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: Minchan 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d3d07c92ff
commit
4e3ba87845
@ -141,3 +141,18 @@ Description:
|
|||||||
amount of memory ZRAM can use to store the compressed data. The
|
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 could be changed in run time and "0" means disable the
|
||||||
limit. No limit is the initial state. Unit: bytes
|
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.
|
||||||
|
@ -63,6 +63,27 @@ static inline struct zram *dev_to_zram(struct device *dev)
|
|||||||
return (struct zram *)dev_to_disk(dev)->private_data;
|
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,
|
static ssize_t disksize_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
@ -1017,6 +1038,7 @@ static const struct block_device_operations zram_devops = {
|
|||||||
.owner = THIS_MODULE
|
.owner = THIS_MODULE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static DEVICE_ATTR_WO(compact);
|
||||||
static DEVICE_ATTR_RW(disksize);
|
static DEVICE_ATTR_RW(disksize);
|
||||||
static DEVICE_ATTR_RO(initstate);
|
static DEVICE_ATTR_RO(initstate);
|
||||||
static DEVICE_ATTR_WO(reset);
|
static DEVICE_ATTR_WO(reset);
|
||||||
@ -1035,6 +1057,7 @@ ZRAM_ATTR_RO(invalid_io);
|
|||||||
ZRAM_ATTR_RO(notify_free);
|
ZRAM_ATTR_RO(notify_free);
|
||||||
ZRAM_ATTR_RO(zero_pages);
|
ZRAM_ATTR_RO(zero_pages);
|
||||||
ZRAM_ATTR_RO(compr_data_size);
|
ZRAM_ATTR_RO(compr_data_size);
|
||||||
|
ZRAM_ATTR_RO(num_migrated);
|
||||||
|
|
||||||
static struct attribute *zram_disk_attrs[] = {
|
static struct attribute *zram_disk_attrs[] = {
|
||||||
&dev_attr_disksize.attr,
|
&dev_attr_disksize.attr,
|
||||||
@ -1044,6 +1067,8 @@ static struct attribute *zram_disk_attrs[] = {
|
|||||||
&dev_attr_num_writes.attr,
|
&dev_attr_num_writes.attr,
|
||||||
&dev_attr_failed_reads.attr,
|
&dev_attr_failed_reads.attr,
|
||||||
&dev_attr_failed_writes.attr,
|
&dev_attr_failed_writes.attr,
|
||||||
|
&dev_attr_num_migrated.attr,
|
||||||
|
&dev_attr_compact.attr,
|
||||||
&dev_attr_invalid_io.attr,
|
&dev_attr_invalid_io.attr,
|
||||||
&dev_attr_notify_free.attr,
|
&dev_attr_notify_free.attr,
|
||||||
&dev_attr_zero_pages.attr,
|
&dev_attr_zero_pages.attr,
|
||||||
|
@ -84,6 +84,7 @@ struct zram_stats {
|
|||||||
atomic64_t compr_data_size; /* compressed size of pages stored */
|
atomic64_t compr_data_size; /* compressed size of pages stored */
|
||||||
atomic64_t num_reads; /* failed + successful */
|
atomic64_t num_reads; /* failed + successful */
|
||||||
atomic64_t num_writes; /* --do-- */
|
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_reads; /* can happen when memory is too low */
|
||||||
atomic64_t failed_writes; /* 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 */
|
atomic64_t invalid_io; /* non-page-aligned I/O requests */
|
||||||
|
Loading…
Reference in New Issue
Block a user