From patchwork Sun Oct 9 09:07:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001945 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF3A4C4332F for ; Sun, 9 Oct 2022 09:07:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 201DB6B0073; Sun, 9 Oct 2022 05:07:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1630D6B0074; Sun, 9 Oct 2022 05:07:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F1C62900002; Sun, 9 Oct 2022 05:07:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id DEA276B0073 for ; Sun, 9 Oct 2022 05:07:30 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 8E98F1407DA for ; Sun, 9 Oct 2022 09:07:30 +0000 (UTC) X-FDA: 80000832660.15.FC5F42E Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) by imf10.hostedemail.com (Postfix) with ESMTP id 33D5CC0013 for ; Sun, 9 Oct 2022 09:07:29 +0000 (UTC) Received: by mail-pf1-f176.google.com with SMTP id v186so8419581pfv.11 for ; Sun, 09 Oct 2022 02:07:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RN0/9ftrQEX77iPPbChQJHYVjybhF/OgEdl9wxmnkf4=; b=JcG2gmo5pwbfQLQPoKGWMTnTpl9CgkQm68UB33vFvfR7qUVhLuqLtjAhCEI2NIIup2 eFxWjDtN9iIRrqh7+cEwliC0/H/hPH/9hzWjUD2M8nNY8yI9K6i5Fj0Vu4w/96cS4d4Z ZuXMW9EqXdjazBY+itAc8OQrOxJfvMSgiMpc8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RN0/9ftrQEX77iPPbChQJHYVjybhF/OgEdl9wxmnkf4=; b=XUOv2SeX44mZf3pcrqvEz9U6x3kJ0VRrFu80vBDZMFmrfXBspclA2JSTxnbvLhNx3V 56/yizjfM01d9FOAnCjCjQSm5YsVu6I0OrbFgT3Y99Io/wEkARMTUC5o+8UPXQMHYtSa vszXwUCK3zZZeozrV/ugZSdNF6oRNSXqtoIxsS//6kQ+cG2Dh/Jmm9uvA5k5Rx4WLHq1 puuPSG/kqmYGhyJLFapO064JXP251Ig7K7uOgYM4gzh5NscO+vxW4LzDDcqg6IPTcr7o 4kW/o41XZYKniutkEqmpONBmzPZHaWxZhrckJv9uLyGAdKD/RZfHzrYHnkEvhEZJypWN Ll3Q== X-Gm-Message-State: ACrzQf3XiHtaiJ2pnOFAOl5oYNMG69R3uWoAQwPCbRSNlxSyaS3vTqPM jHGlmmf4jzKpHQAUSdDOhMFEy3emvB+BWA== X-Google-Smtp-Source: AMsMyM7JrIj1aW/9GlPBhc2nLzfzKzg2w767zaqTiIHAkqgWrsX62xV1nGN/ulotXfisKwM2KTi0Ug== X-Received: by 2002:a63:1e56:0:b0:462:970:e0de with SMTP id p22-20020a631e56000000b004620970e0demr721488pgm.90.1665306448995; Sun, 09 Oct 2022 02:07:28 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:28 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 1/8] zram: Preparation for multi-zcomp support Date: Sun, 9 Oct 2022 18:07:13 +0900 Message-Id: <20221009090720.1040633-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306450; a=rsa-sha256; cv=none; b=d3rEfRo9emQolcQfJjSDloEifVGQtG9G6fKI+59dgxdVs7ffEznhP7xi4DfOvQardF2ZqN PynFZX08xdlCBGHcxTdlwkjoUfegABOFVmPXQPfXGOSvmD3Ky0wYt6nbUboQTciYLH0ekV FWLduSxYLg6dFDRi2RwtCv72N+PifUw= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=JcG2gmo5; spf=pass (imf10.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.176 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306450; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=RN0/9ftrQEX77iPPbChQJHYVjybhF/OgEdl9wxmnkf4=; b=AIvVqRAFb3BTozY3eO665gXIb+j4b0KwdjzP5lg0hqw68noGA18pY00IUe6ClKCpTz5wOb 1aDEt0WRH4B3w3aQCV2kJvTEzMZYKVeGbYWcbMDOSbH5exiezFnHyzHqXOrAWlO2KOZXls +TbkNjJejRKbJfC9v7hO+q6QGCUlcoU= Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=JcG2gmo5; spf=pass (imf10.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.176 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org X-Stat-Signature: zfko5asd45o8zhzk76q9ay5emmfdmkfa X-Rspamd-Queue-Id: 33D5CC0013 X-Rspam-User: X-Rspamd-Server: rspam05 X-HE-Tag: 1665306449-899296 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The patch turns compression streams and compressor algorithm name struct zram members into arrays, so that we can have multiple compression streams support (in the next patches). The patch uses a rather explicit API for compressor selection: - Get primary (default) compression stream zcomp_stream_get(zram->comps[ZRAM_PRIMARY_ZCOMP]) - Get secondary compression stream zcomp_stream_get(zram->comps[ZRAM_SECONDARY_ZCOMP]) We use similar API for compression streams put(). At this point we always have just one compression stream, since CONFIG_ZRAM_MULTI_COMP is not yet defined. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zcomp.c | 6 +-- drivers/block/zram/zcomp.h | 2 +- drivers/block/zram/zram_drv.c | 87 ++++++++++++++++++++++++----------- drivers/block/zram/zram_drv.h | 14 +++++- 4 files changed, 77 insertions(+), 32 deletions(-) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 0916de952e09..55af4efd7983 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -206,7 +206,7 @@ void zcomp_destroy(struct zcomp *comp) * case of allocation error, or any other error potentially * returned by zcomp_init(). */ -struct zcomp *zcomp_create(const char *compress) +struct zcomp *zcomp_create(const char *alg) { struct zcomp *comp; int error; @@ -216,14 +216,14 @@ struct zcomp *zcomp_create(const char *compress) * is not loaded yet. We must do it here, otherwise we are about to * call /sbin/modprobe under CPU hot-plug lock. */ - if (!zcomp_available_algorithm(compress)) + if (!zcomp_available_algorithm(alg)) return ERR_PTR(-EINVAL); comp = kzalloc(sizeof(struct zcomp), GFP_KERNEL); if (!comp) return ERR_PTR(-ENOMEM); - comp->name = compress; + comp->name = alg; error = zcomp_init(comp); if (error) { kfree(comp); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 40f6420f4b2e..cdefdef93da8 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -27,7 +27,7 @@ int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node); ssize_t zcomp_available_show(const char *comp, char *buf); bool zcomp_available_algorithm(const char *comp); -struct zcomp *zcomp_create(const char *comp); +struct zcomp *zcomp_create(const char *alg); void zcomp_destroy(struct zcomp *comp); struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 966aab902d19..770ea3489eb6 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1007,36 +1007,53 @@ static ssize_t comp_algorithm_show(struct device *dev, struct zram *zram = dev_to_zram(dev); down_read(&zram->init_lock); - sz = zcomp_available_show(zram->compressor, buf); + sz = zcomp_available_show(zram->comp_algs[ZRAM_PRIMARY_ZCOMP], buf); up_read(&zram->init_lock); return sz; } +static void comp_algorithm_set(struct zram *zram, u32 idx, const char *alg) +{ + /* Do not kfree() algs that we didn't allocate, IOW the default ones */ + if (zram->comp_algs[idx] != default_compressor) + kfree(zram->comp_algs[idx]); + zram->comp_algs[idx] = alg; +} + static ssize_t comp_algorithm_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { struct zram *zram = dev_to_zram(dev); - char compressor[ARRAY_SIZE(zram->compressor)]; + char *compressor; size_t sz; - strscpy(compressor, buf, sizeof(compressor)); + sz = strlen(buf); + if (sz >= CRYPTO_MAX_ALG_NAME) + return -E2BIG; + + compressor = kstrdup(buf, GFP_KERNEL); + if (!compressor) + return -ENOMEM; + /* ignore trailing newline */ - sz = strlen(compressor); if (sz > 0 && compressor[sz - 1] == '\n') compressor[sz - 1] = 0x00; - if (!zcomp_available_algorithm(compressor)) + if (!zcomp_available_algorithm(compressor)) { + kfree(compressor); return -EINVAL; + } down_write(&zram->init_lock); if (init_done(zram)) { up_write(&zram->init_lock); + kfree(compressor); pr_info("Can't change algorithm for initialized device\n"); return -EBUSY; } - strcpy(zram->compressor, compressor); + comp_algorithm_set(zram, ZRAM_PRIMARY_ZCOMP, compressor); up_write(&zram->init_lock); return len; } @@ -1284,7 +1301,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, size = zram_get_obj_size(zram, index); if (size != PAGE_SIZE) - zstrm = zcomp_stream_get(zram->comp); + zstrm = zcomp_stream_get(zram->comps[ZRAM_PRIMARY_ZCOMP]); src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); if (size == PAGE_SIZE) { @@ -1296,7 +1313,7 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, dst = kmap_atomic(page); ret = zcomp_decompress(zstrm, src, size, dst); kunmap_atomic(dst); - zcomp_stream_put(zram->comp); + zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); } zs_unmap_object(zram->mem_pool, handle); zram_slot_unlock(zram, index); @@ -1363,13 +1380,13 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, kunmap_atomic(mem); compress_again: - zstrm = zcomp_stream_get(zram->comp); + zstrm = zcomp_stream_get(zram->comps[ZRAM_PRIMARY_ZCOMP]); src = kmap_atomic(page); ret = zcomp_compress(zstrm, src, &comp_len); kunmap_atomic(src); if (unlikely(ret)) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); pr_err("Compression failed! err=%d\n", ret); zs_free(zram->mem_pool, handle); return ret; @@ -1397,7 +1414,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, __GFP_HIGHMEM | __GFP_MOVABLE); if (IS_ERR((void *)handle)) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); atomic64_inc(&zram->stats.writestall); handle = zs_malloc(zram->mem_pool, comp_len, GFP_NOIO | __GFP_HIGHMEM | @@ -1414,14 +1431,14 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, * zstrm buffer back. It is necessary that the dereferencing * of the zstrm variable below occurs correctly. */ - zstrm = zcomp_stream_get(zram->comp); + zstrm = zcomp_stream_get(zram->comps[ZRAM_PRIMARY_ZCOMP]); } alloced_pages = zs_get_total_pages(zram->mem_pool); update_used_max(zram, alloced_pages); if (zram->limit_pages && alloced_pages > zram->limit_pages) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); zs_free(zram->mem_pool, handle); return -ENOMEM; } @@ -1435,7 +1452,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, if (comp_len == PAGE_SIZE) kunmap_atomic(src); - zcomp_stream_put(zram->comp); + zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); zs_unmap_object(zram->mem_pool, handle); atomic64_add(comp_len, &zram->stats.compr_data_size); out: @@ -1710,6 +1727,20 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, return ret; } +static void zram_destroy_comps(struct zram *zram) +{ + u32 idx; + + for (idx = 0; idx < ZRAM_MAX_ZCOMPS; idx++) { + struct zcomp *comp = zram->comps[idx]; + + zram->comps[idx] = NULL; + if (IS_ERR_OR_NULL(comp)) + continue; + zcomp_destroy(comp); + } +} + static void zram_reset_device(struct zram *zram) { down_write(&zram->init_lock); @@ -1727,11 +1758,11 @@ static void zram_reset_device(struct zram *zram) /* I/O operation under all of CPU are done so let's free */ zram_meta_free(zram, zram->disksize); zram->disksize = 0; + zram_destroy_comps(zram); memset(&zram->stats, 0, sizeof(zram->stats)); - zcomp_destroy(zram->comp); - zram->comp = NULL; reset_bdev(zram); + comp_algorithm_set(zram, ZRAM_PRIMARY_ZCOMP, default_compressor); up_write(&zram->init_lock); } @@ -1742,6 +1773,7 @@ static ssize_t disksize_store(struct device *dev, struct zcomp *comp; struct zram *zram = dev_to_zram(dev); int err; + u32 idx; disksize = memparse(buf, NULL); if (!disksize) @@ -1760,22 +1792,25 @@ static ssize_t disksize_store(struct device *dev, goto out_unlock; } - comp = zcomp_create(zram->compressor); - if (IS_ERR(comp)) { - pr_err("Cannot initialise %s compressing backend\n", - zram->compressor); - err = PTR_ERR(comp); - goto out_free_meta; - } + for (idx = 0; idx < ZRAM_MAX_ZCOMPS; idx++) { + comp = zcomp_create(zram->comp_algs[idx]); + if (IS_ERR(comp)) { + pr_err("Cannot initialise %s compressing backend\n", + zram->comp_algs[idx]); + err = PTR_ERR(comp); + goto out_free_comps; + } - zram->comp = comp; + zram->comps[idx] = comp; + } zram->disksize = disksize; set_capacity_and_notify(zram->disk, zram->disksize >> SECTOR_SHIFT); up_write(&zram->init_lock); return len; -out_free_meta: +out_free_comps: + zram_destroy_comps(zram); zram_meta_free(zram, disksize); out_unlock: up_write(&zram->init_lock); @@ -1962,7 +1997,7 @@ static int zram_add(void) if (ret) goto out_cleanup_disk; - strscpy(zram->compressor, default_compressor, sizeof(zram->compressor)); + zram->comp_algs[ZRAM_PRIMARY_ZCOMP] = default_compressor; zram_debugfs_register(zram); pr_info("Added device: %s\n", zram->disk->disk_name); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index a2bda53020fd..4044ddbb2326 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -89,10 +89,20 @@ struct zram_stats { #endif }; +#ifdef CONFIG_ZRAM_MULTI_COMP +#define ZRAM_PRIMARY_ZCOMP 0 +#define ZRAM_SECONDARY_ZCOMP 1 +#define ZRAM_MAX_ZCOMPS 2 +#else +#define ZRAM_PRIMARY_ZCOMP 0 +#define ZRAM_SECONDARY_ZCOMP 0 +#define ZRAM_MAX_ZCOMPS 1 +#endif + struct zram { struct zram_table_entry *table; struct zs_pool *mem_pool; - struct zcomp *comp; + struct zcomp *comps[ZRAM_MAX_ZCOMPS]; struct gendisk *disk; /* Prevent concurrent execution of device init */ struct rw_semaphore init_lock; @@ -107,7 +117,7 @@ struct zram { * we can store in a disk. */ u64 disksize; /* bytes */ - char compressor[CRYPTO_MAX_ALG_NAME]; + const char *comp_algs[ZRAM_MAX_ZCOMPS]; /* * zram is claimed so open request will be failed */ From patchwork Sun Oct 9 09:07:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001946 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id DFCB4C433F5 for ; Sun, 9 Oct 2022 09:07:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7CC3A6B0074; Sun, 9 Oct 2022 05:07:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 77C5B900002; Sun, 9 Oct 2022 05:07:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5CF046B0078; Sun, 9 Oct 2022 05:07:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 3EF1B6B0074 for ; Sun, 9 Oct 2022 05:07:33 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id F317F1607C8 for ; Sun, 9 Oct 2022 09:07:32 +0000 (UTC) X-FDA: 80000832744.16.6AFCDA2 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) by imf12.hostedemail.com (Postfix) with ESMTP id 9566F40017 for ; Sun, 9 Oct 2022 09:07:32 +0000 (UTC) Received: by mail-pg1-f170.google.com with SMTP id r18so8058163pgr.12 for ; Sun, 09 Oct 2022 02:07:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sxrqiw0cbhfXN4+OelLD9+srPRQcNc3GlNvIAj2f+tU=; b=oe5qxBC1H4qUilQPWPy/moxJ4w1ln70cLpRc/Wk8jkmt3TBM5d7VJNyft5SpWN8+Hr V+SK/9WSNTNYqY8WLXByi/u6h7gRuxPzVFGafKEyR+Y8/tLdczZTPqNCD93xhD5PTkaY XKLkVqBfhhtAFrvw7K6Y4FSE3vUclNw6hsVzk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sxrqiw0cbhfXN4+OelLD9+srPRQcNc3GlNvIAj2f+tU=; b=Na4A8z5bDnxcl7GPh4SwQZaVqTRGpAiBKgfONbnHxTkgvWeo5EIdj4xmH46fMSiXXG s5ShNnX8icXtcxzLSUErKQW0MbZn+4fPNdz3/3cT39w0Rnq8/RFGYHpKiMAKxXjUCb+E Inugn75zJ16LfmrOrFTUGelwp9FDcr+QQ6ORZq0hePR3N9Fi4XbJNAVGLMuQb5doFqW8 A9t4jTMDqmSriG3rDN/QggeiI5uciVCa6Fk35+EwfGn0sGmoUL/IpZoyQWO8i64plPsy q/qhosJae8p7xTS4TeACpqOPfRx2w9nXgEkEnQjraOyKKEjhkh28qANNzgoG29+KJgBf twtQ== X-Gm-Message-State: ACrzQf3bguChyQiBV+0SIbodasF0pzwTLzrqSQ2P6EaM7yN+u51Lzs/9 TMNilXZC8m6icI4YWrdVUUwOOgkoLGFPEQ== X-Google-Smtp-Source: AMsMyM6C8IGN2Dj12wvsCAFdbafvyBhEfZJPCUlA+MTMr1Fg8ofJtLAKdkOUiWQsDUoA0tspOCcD7g== X-Received: by 2002:a63:b4d:0:b0:454:d8b4:285 with SMTP id a13-20020a630b4d000000b00454d8b40285mr11989075pgl.410.1665306451631; Sun, 09 Oct 2022 02:07:31 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:31 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 2/8] zram: Add recompression algorithm sysfs knob Date: Sun, 9 Oct 2022 18:07:14 +0900 Message-Id: <20221009090720.1040633-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306452; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=sxrqiw0cbhfXN4+OelLD9+srPRQcNc3GlNvIAj2f+tU=; b=L8xGlHkvH5yE6YbIgRNSZOwLdF6tmoa+QbAXJQ/KkcLqWdcB5WYnGoI2jLD4Dk5eV3KJTu TUBwXPM2k5kw4Gn9wD96XnWb0nk2G8bUGBG/l2ebI6G8jz3U0Lxi2ho+lVWxTGGHrThC6z H0mNNtPm6/jDGA5sWRZjTYeG9bLjeLA= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oe5qxBC1; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf12.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.170 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306452; a=rsa-sha256; cv=none; b=3alnG7AbD2QBAS6Kg8H9ZFhj8Wfb9J6hHyV2o2lko6rLaAVPpRMv6imiryLx4ssxJnrSRg 14oO7j6ZB12jKcCcshicbwP6gAyoOuSWrG5Ck89IIHrP6FwN02IZK8h9KMt02bYe5NeLpH BB/p8N0iO2bjhC7aETwiR1ww20JIC7k= X-Stat-Signature: ea7wg3knn8gndw7868bewf8rpdfcr4mq X-Rspamd-Server: rspam09 X-Rspam-User: Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oe5qxBC1; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf12.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.170 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org X-Rspamd-Queue-Id: 9566F40017 X-HE-Tag: 1665306452-870267 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Introduce recomp_algorithm sysfs knob that controls secondary algorithm selection used for recompression. This device attribute works in a similar way with comp_algorithm attribute. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 111 +++++++++++++++++++++++++++------- 1 file changed, 90 insertions(+), 21 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 770ea3489eb6..a8ef3c0c3dae 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -41,7 +41,12 @@ static DEFINE_IDR(zram_index_idr); static DEFINE_MUTEX(zram_index_mutex); static int zram_major; -static const char *default_compressor = CONFIG_ZRAM_DEF_COMP; +static const char *default_comp_algs[ZRAM_MAX_ZCOMPS] = { + CONFIG_ZRAM_DEF_COMP, +#ifdef CONFIG_ZRAM_MULTI_COMP + "zstd", +#endif +}; /* Module params (documentation at end) */ static unsigned int num_devices = 1; @@ -1000,31 +1005,37 @@ static ssize_t max_comp_streams_store(struct device *dev, return len; } -static ssize_t comp_algorithm_show(struct device *dev, - struct device_attribute *attr, char *buf) +static void comp_algorithm_set(struct zram *zram, u32 idx, const char *alg) { - size_t sz; - struct zram *zram = dev_to_zram(dev); + bool default_alg = false; + int i; - down_read(&zram->init_lock); - sz = zcomp_available_show(zram->comp_algs[ZRAM_PRIMARY_ZCOMP], buf); - up_read(&zram->init_lock); + /* Do not kfree() algs that we didn't allocate, IOW the default ones */ + for (i = 0; i < ZRAM_MAX_ZCOMPS; i++) { + if (zram->comp_algs[idx] == default_comp_algs[i]) { + default_alg = true; + break; + } + } - return sz; + if (!default_alg) + kfree(zram->comp_algs[idx]); + zram->comp_algs[idx] = alg; } -static void comp_algorithm_set(struct zram *zram, u32 idx, const char *alg) +static ssize_t __comp_algorithm_show(struct zram *zram, u32 idx, char *buf) { - /* Do not kfree() algs that we didn't allocate, IOW the default ones */ - if (zram->comp_algs[idx] != default_compressor) - kfree(zram->comp_algs[idx]); - zram->comp_algs[idx] = alg; + ssize_t sz; + + down_read(&zram->init_lock); + sz = zcomp_available_show(zram->comp_algs[idx], buf); + up_read(&zram->init_lock); + + return sz; } -static ssize_t comp_algorithm_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static int __comp_algorithm_store(struct zram *zram, u32 idx, const char *buf) { - struct zram *zram = dev_to_zram(dev); char *compressor; size_t sz; @@ -1053,11 +1064,55 @@ static ssize_t comp_algorithm_store(struct device *dev, return -EBUSY; } - comp_algorithm_set(zram, ZRAM_PRIMARY_ZCOMP, compressor); + comp_algorithm_set(zram, idx, compressor); up_write(&zram->init_lock); - return len; + return 0; +} + +static ssize_t comp_algorithm_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct zram *zram = dev_to_zram(dev); + + return __comp_algorithm_show(zram, ZRAM_PRIMARY_ZCOMP, buf); +} + +static ssize_t comp_algorithm_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct zram *zram = dev_to_zram(dev); + int ret; + + ret = __comp_algorithm_store(zram, ZRAM_PRIMARY_ZCOMP, buf); + return ret ? ret : len; } +#ifdef CONFIG_ZRAM_MULTI_COMP +static ssize_t recomp_algorithm_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct zram *zram = dev_to_zram(dev); + + return __comp_algorithm_show(zram, ZRAM_SECONDARY_ZCOMP, buf); +} + +static ssize_t recomp_algorithm_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct zram *zram = dev_to_zram(dev); + int ret; + + ret = __comp_algorithm_store(zram, ZRAM_SECONDARY_ZCOMP, buf); + return ret ? ret : len; +} +#endif + static ssize_t compact_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { @@ -1762,7 +1817,11 @@ static void zram_reset_device(struct zram *zram) memset(&zram->stats, 0, sizeof(zram->stats)); reset_bdev(zram); - comp_algorithm_set(zram, ZRAM_PRIMARY_ZCOMP, default_compressor); + comp_algorithm_set(zram, ZRAM_PRIMARY_ZCOMP, + default_comp_algs[ZRAM_PRIMARY_ZCOMP]); + if (IS_ENABLED(CONFIG_ZRAM_MULTI_COMP)) + comp_algorithm_set(zram, ZRAM_SECONDARY_ZCOMP, + default_comp_algs[ZRAM_SECONDARY_ZCOMP]); up_write(&zram->init_lock); } @@ -1895,6 +1954,9 @@ static DEVICE_ATTR_WO(writeback); static DEVICE_ATTR_RW(writeback_limit); static DEVICE_ATTR_RW(writeback_limit_enable); #endif +#ifdef CONFIG_ZRAM_MULTI_COMP +static DEVICE_ATTR_RW(recomp_algorithm); +#endif static struct attribute *zram_disk_attrs[] = { &dev_attr_disksize.attr, @@ -1918,6 +1980,9 @@ static struct attribute *zram_disk_attrs[] = { &dev_attr_bd_stat.attr, #endif &dev_attr_debug_stat.attr, +#ifdef CONFIG_ZRAM_MULTI_COMP + &dev_attr_recomp_algorithm.attr, +#endif NULL, }; @@ -1997,7 +2062,11 @@ static int zram_add(void) if (ret) goto out_cleanup_disk; - zram->comp_algs[ZRAM_PRIMARY_ZCOMP] = default_compressor; + zram->comp_algs[ZRAM_PRIMARY_ZCOMP] = + default_comp_algs[ZRAM_PRIMARY_ZCOMP]; + if (IS_ENABLED(CONFIG_ZRAM_MULTI_COMP)) + zram->comp_algs[ZRAM_SECONDARY_ZCOMP] = + default_comp_algs[ZRAM_SECONDARY_ZCOMP]; zram_debugfs_register(zram); pr_info("Added device: %s\n", zram->disk->disk_name); From patchwork Sun Oct 9 09:07:15 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001947 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40469C433FE for ; Sun, 9 Oct 2022 09:07:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CFC7B6B0075; Sun, 9 Oct 2022 05:07:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C870E6B007B; Sun, 9 Oct 2022 05:07:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B0CD76B0075; Sun, 9 Oct 2022 05:07:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 9E0C16B0075 for ; Sun, 9 Oct 2022 05:07:35 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 6FEE91407E3 for ; Sun, 9 Oct 2022 09:07:35 +0000 (UTC) X-FDA: 80000832870.24.91521C5 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.182]) by imf17.hostedemail.com (Postfix) with ESMTP id 0E73640026 for ; Sun, 9 Oct 2022 09:07:34 +0000 (UTC) Received: by mail-pg1-f182.google.com with SMTP id s206so8113011pgs.3 for ; Sun, 09 Oct 2022 02:07:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NpDlcwWZSRK+GLE9jeOjGHO/GXqOD7ElWxbYUhdOrA4=; b=m/pPO/9xut56toEBoPrxZZRoR2qK004hf4UOkxTjnrozUXN7IvLCcvwk7FCrdEbtmv UcUpkQjZZdv77JkrcOn3KRTs/KPJaMi8J2NEQtT0vQZnwdZa00RA9gESYlF10wu7FW3W CsuaSVfjOrbsPVaazJib/NqDbLehCZx6rr5/A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NpDlcwWZSRK+GLE9jeOjGHO/GXqOD7ElWxbYUhdOrA4=; b=oqf9TUAYMkXBF/vCkOT8RIkISfG8g3BTPpNQfy1/sFIOTkxe3RAzpVvGrEJBu4Hlvc TEuvyWDzruBGZuXef5pSHRG7O3irpiBtaE9wnvqE8/b4bswCeYL3KE/P1UR1UcVvVVbJ cBGEyRYkckK6wNf7rnb12bz/jJdOIeTkFu927p7fkGwg+kg0XXEAN43K+RpUEH28+mz4 W5EUWnet+UgwTfDECFTh845ljbk9B+lxgYhCUI7117WRvt59I3iqj1PM/DdinN9YwW2d tXP0m/eO1mWiLTeosl6YcTtVEt+m/O/JOCsB6vhtdQTAIlm9k4xlQqF7qsIL4GxGWcPt GXAw== X-Gm-Message-State: ACrzQf2r7Zw3LJLJ9Yd6efm4qIF73u5BCjWImydWKkTvq/iVBFOdRCi/ fGpCXQa41Nty23A3ygFiwyqBjQ== X-Google-Smtp-Source: AMsMyM5O6XJLSh+H0wcf7xO6063i9Fd43x32Eg2ntgvjKRu11pYf1BZfHPExCSvDcr2/A0Gi6aZQfg== X-Received: by 2002:a63:1944:0:b0:455:bea0:97ee with SMTP id 4-20020a631944000000b00455bea097eemr12190033pgz.258.1665306454057; Sun, 09 Oct 2022 02:07:34 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:33 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 3/8] zram: Factor out WB and non-WB zram read functions Date: Sun, 9 Oct 2022 18:07:15 +0900 Message-Id: <20221009090720.1040633-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306455; a=rsa-sha256; cv=none; b=fMXNtLDqKPc3hJZllPOjox3pKU+h0pdPkVdO76i1vbTbQiBlafCpTUYKkGmwR5GEkjZqiK T3HfqO//CmomGkflzjflE7j26b+jucswwkFmlfxCDQcJfjVQxmoINdveqlaSIX4C2O8FYE 13JUF/zCSWhB2GX30T0dTP5aYEn4Iyg= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b="m/pPO/9x"; spf=pass (imf17.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.182 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306455; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=NpDlcwWZSRK+GLE9jeOjGHO/GXqOD7ElWxbYUhdOrA4=; b=eIRFd/tih5TWs03uwtXfm8uTHmijHcsA/nru2a8aCRA4jupbAMCjSSmgYPN6pz/xEvfe4t DRaTTG5Gx6RNvgHvaOBH2AcLDEuQ9HUMkqTXgkD+awXfAFpC1SQEm0HsSBEUzf/kOVAS98 t2OStaFEjc/7egTOeB9npD2AJD2/hHs= Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b="m/pPO/9x"; spf=pass (imf17.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.182 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org X-Stat-Signature: 75nhe6srj7gftxgwkri9c4woa4678su4 X-Rspamd-Queue-Id: 0E73640026 X-Rspam-User: X-Rspamd-Server: rspam05 X-HE-Tag: 1665306454-366744 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: We will use non-WB variant in ZRAM page recompression path. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 73 ++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index a8ef3c0c3dae..94c62d7ea818 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1314,8 +1314,30 @@ static void zram_free_page(struct zram *zram, size_t index) ~(1UL << ZRAM_LOCK | 1UL << ZRAM_UNDER_WB)); } -static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, - struct bio *bio, bool partial_io) +/* + * Reads a page from the writeback devices. Corresponding ZRAM slot + * should be unlocked. + */ +static int zram_read_from_writeback(struct zram *zram, struct page *page, + u32 index, struct bio *bio, + bool partial_io) +{ + struct bio_vec bvec; + + bvec.bv_page = page; + bvec.bv_len = PAGE_SIZE; + bvec.bv_offset = 0; + return read_from_bdev(zram, &bvec, + zram_get_element(zram, index), + bio, partial_io); +} + +/* + * Reads (decompresses if needed) a page from zspool (zsmalloc). + * Corresponding ZRAM slot should be locked. + */ +static int zram_read_from_zspool(struct zram *zram, struct page *page, + u32 index) { struct zcomp_strm *zstrm; unsigned long handle; @@ -1323,23 +1345,6 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, void *src, *dst; int ret; - zram_slot_lock(zram, index); - if (zram_test_flag(zram, index, ZRAM_WB)) { - struct bio_vec bvec; - - zram_slot_unlock(zram, index); - /* A null bio means rw_page was used, we must fallback to bio */ - if (!bio) - return -EOPNOTSUPP; - - bvec.bv_page = page; - bvec.bv_len = PAGE_SIZE; - bvec.bv_offset = 0; - return read_from_bdev(zram, &bvec, - zram_get_element(zram, index), - bio, partial_io); - } - handle = zram_get_handle(zram, index); if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) { unsigned long value; @@ -1349,7 +1354,6 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, mem = kmap_atomic(page); zram_fill_page(mem, PAGE_SIZE, value); kunmap_atomic(mem); - zram_slot_unlock(zram, index); return 0; } @@ -1371,17 +1375,40 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); } zs_unmap_object(zram->mem_pool, handle); - zram_slot_unlock(zram, index); + return ret; +} + +static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, + struct bio *bio, bool partial_io) +{ + int ret; + + zram_slot_lock(zram, index); + if (!zram_test_flag(zram, index, ZRAM_WB)) { + /* Slot should be locked through out the function call */ + ret = zram_read_from_zspool(zram, page, index); + zram_slot_unlock(zram, index); + } else { + /* Slot should be unlocked before the function call */ + zram_slot_unlock(zram, index); + + /* A null bio means rw_page was used, we must fallback to bio */ + if (!bio) + return -EOPNOTSUPP; + + ret = zram_read_from_writeback(zram, page, index, bio, + partial_io); + } /* Should NEVER happen. Return bio error if it does. */ - if (WARN_ON(ret)) + if (WARN_ON(ret < 0)) pr_err("Decompression failed! err=%d, page=%u\n", ret, index); return ret; } static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, - u32 index, int offset, struct bio *bio) + u32 index, int offset, struct bio *bio) { int ret; struct page *page; From patchwork Sun Oct 9 09:07:16 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001952 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5C189C433F5 for ; Sun, 9 Oct 2022 09:07:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 843106B0080; Sun, 9 Oct 2022 05:07:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 755D1900002; Sun, 9 Oct 2022 05:07:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5336E6B0082; Sun, 9 Oct 2022 05:07:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 40AB06B0080 for ; Sun, 9 Oct 2022 05:07:48 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 1051A1A07E5 for ; Sun, 9 Oct 2022 09:07:48 +0000 (UTC) X-FDA: 80000833416.24.7C00942 Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.54]) by imf04.hostedemail.com (Postfix) with ESMTP id A856F4001C for ; Sun, 9 Oct 2022 09:07:47 +0000 (UTC) Received: by mail-qv1-f54.google.com with SMTP id i12so5654033qvs.2 for ; Sun, 09 Oct 2022 02:07:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Di6UYGr5o/GSN0ajTLtFClQB+xSRVwulRo8S0QrCcKI=; b=YhyVT+feaZTJaqgGyJt76SZs2ZcBpZEPkuaHpuvXaOtZOmphmqZgRaqvn3DYi0upEy t7yOIzNZs2gRP6fJS3kskvr4gH1ZoYrzP7/REgxqXRLm3i0Mufst4j2XcMHo7KeKIEop n/7EanSxuX44lUiLBTUef0T6xqzl8TmCaeIvc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Di6UYGr5o/GSN0ajTLtFClQB+xSRVwulRo8S0QrCcKI=; b=kJrBM+kUzRSGMIG9hk3rMF9RkF0MtK3jyfg7xLyN/xcpB27JhbjUvIK7Qg0GZ2KLJN jUS3vRzUZk/5UK9hwgV/3fPSi6kaSM7S1b+AfyFhXyIXk0H6SgW+Z0YHFrghm/ZJ5fcg qL6tzguuLt7YsT0nxdcicAE47uTg8Qm23u/bEOzsCHVByl4twJmQJcLFKIUy/n8aNb+R v93gG0VA/K7IsJSGljF2P4Q5yGmk1oYFXcYm/TTBkz8sFWwKybEjG4Z73FInDEDZl3LG 00/87dHSB8sRjCCXbmMSVqWp5aGNNLvGA8g0oQIfEkbDaE+12/YCf/C+u+Sw7LOp2d1a E33g== X-Gm-Message-State: ACrzQf3x5lw4PmW+K/Vna/wDajgh4BiuNPZXcWskJ5/VMMX4IhCn1s7g gqnZLiB1xURhXXofHs+3+3XBz9Uq976K6w== X-Google-Smtp-Source: AMsMyM7YWoa+daGBBBz9uSUN9qJ47XLGsV80REC7vAB/6UsA5DqmTTpqUmhteFDCgPBWGb9qrzm1Yw== X-Received: by 2002:a17:902:bd44:b0:17f:fc22:3a74 with SMTP id b4-20020a170902bd4400b0017ffc223a74mr11276401plx.161.1665306456519; Sun, 09 Oct 2022 02:07:36 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:36 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 4/8] zram: Introduce recompress sysfs knob Date: Sun, 9 Oct 2022 18:07:16 +0900 Message-Id: <20221009090720.1040633-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306467; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Di6UYGr5o/GSN0ajTLtFClQB+xSRVwulRo8S0QrCcKI=; b=nxyLnKIt6h5OfLNidJ2LDsL7PoFPc83t9kwMpPbpS07SZkCHatLMORTeNVKiZx/uXtxeZB t+sq7nMIL/uadRbC6kJh+mQxpT7hHm0nLrKs5WPWDZJmXYo49H/bhLjFkKHz/EhWL13lPa VzcA4w1OUu0Ckiu1segOwFKC3YZzLBM= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=YhyVT+fe; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf04.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.219.54 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306467; a=rsa-sha256; cv=none; b=lswNYx58b5mlXJI+TRLp5tMZpH76NRXA9b2E/l9OXgBq1xy8c5R9HEmcRIywtRKMzm87Cj 1rk7Tqvx53JW4FnEt+5YiTh1gLTD+VUjKSdj51p7MH5Qn7fx/CQaZx+kfOC1pJ59ZTV4CO vgiLUkkmks1jk7yOILNHSPbR1x9Fn9w= X-Stat-Signature: 15tsgi35dnf3e4mme1bqh1h6ofzykm1f X-Rspamd-Server: rspam09 X-Rspam-User: Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=YhyVT+fe; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf04.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.219.54 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org X-Rspamd-Queue-Id: A856F4001C X-HE-Tag: 1665306467-184654 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Allow zram to recompress (using secondary compression streams) pages. We support three modes: 1) IDLE pages recompression is activated by `idle` mode echo idle > /sys/block/zram0/recompress 2) Since there may be many idle pages user-space may pass a size watermark value and we will recompress IDLE pages only of equal or greater size: echo 888 > /sys/block/zram0/recompress 3) HUGE pages recompression is activated by `huge` mode echo huge > /sys/block/zram0/recompress 4) HUGE_IDLE pages recompression is activated by `huge_idle` mode echo huge_idle > /sys/block/zram0/recompress Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 12 +++ drivers/block/zram/zram_drv.c | 194 +++++++++++++++++++++++++++++++++- drivers/block/zram/zram_drv.h | 2 + 3 files changed, 205 insertions(+), 3 deletions(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index d4100b0c083e..7febf36e93eb 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -78,3 +78,15 @@ config ZRAM_MEMORY_TRACKING /sys/kernel/debug/zram/zramX/block_state. See Documentation/admin-guide/blockdev/zram.rst for more information. + +config ZRAM_MULTI_COMP + bool "Enable multiple per-CPU compression streams" + depends on ZRAM + help + This will enable per-CPU multi-compression streams, so that ZRAM + can re-compress IDLE/huge pages, using a potentially slower but + more effective compression algorithm. Note, that IDLE page support + requires ZRAM_MEMORY_TRACKING. + + echo TIMEOUT > /sys/block/zramX/idle + echo SIZE > /sys/block/zramX/recompress diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 94c62d7ea818..12368e773f3d 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1282,6 +1282,12 @@ static void zram_free_page(struct zram *zram, size_t index) atomic64_dec(&zram->stats.huge_pages); } + if (zram_test_flag(zram, index, ZRAM_RECOMP)) + zram_clear_flag(zram, index, ZRAM_RECOMP); + + if (zram_test_flag(zram, index, ZRAM_RECOMP_SKIP)) + zram_clear_flag(zram, index, ZRAM_RECOMP_SKIP); + if (zram_test_flag(zram, index, ZRAM_WB)) { zram_clear_flag(zram, index, ZRAM_WB); free_block_bdev(zram, zram_get_element(zram, index)); @@ -1343,6 +1349,7 @@ static int zram_read_from_zspool(struct zram *zram, struct page *page, unsigned long handle; unsigned int size; void *src, *dst; + u32 idx; int ret; handle = zram_get_handle(zram, index); @@ -1359,8 +1366,13 @@ static int zram_read_from_zspool(struct zram *zram, struct page *page, size = zram_get_obj_size(zram, index); - if (size != PAGE_SIZE) - zstrm = zcomp_stream_get(zram->comps[ZRAM_PRIMARY_ZCOMP]); + if (size != PAGE_SIZE) { + idx = ZRAM_PRIMARY_ZCOMP; + if (zram_test_flag(zram, index, ZRAM_RECOMP)) + idx = ZRAM_SECONDARY_ZCOMP; + + zstrm = zcomp_stream_get(zram->comps[idx]); + } src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); if (size == PAGE_SIZE) { @@ -1372,7 +1384,7 @@ static int zram_read_from_zspool(struct zram *zram, struct page *page, dst = kmap_atomic(page); ret = zcomp_decompress(zstrm, src, size, dst); kunmap_atomic(dst); - zcomp_stream_put(zram->comps[ZRAM_PRIMARY_ZCOMP]); + zcomp_stream_put(zram->comps[idx]); } zs_unmap_object(zram->mem_pool, handle); return ret; @@ -1603,6 +1615,180 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, return ret; } +#ifdef CONFIG_ZRAM_MULTI_COMP +/* + * This function will decompress (unless it's ZRAM_HUGE) the page and then + * attempt to compress it using secondary compression algorithm (which is + * potentially more effective). + * + * Corresponding ZRAM slot should be locked. + */ +static int zram_recompress(struct zram *zram, + u32 index, + struct page *page, + int size_watermark) +{ + unsigned long handle_prev; + unsigned long handle_next; + unsigned int comp_len_next; + unsigned int comp_len_prev; + struct zcomp_strm *zstrm; + void *src, *dst; + int ret; + + handle_prev = zram_get_handle(zram, index); + if (!handle_prev) + return -EINVAL; + + comp_len_prev = zram_get_obj_size(zram, index); + /* + * Do not recompress objects that are already "small enough". + */ + if (comp_len_prev < size_watermark) + return 0; + + ret = zram_read_from_zspool(zram, page, index); + if (ret) + return ret; + + zstrm = zcomp_stream_get(zram->comps[ZRAM_SECONDARY_ZCOMP]); + src = kmap_atomic(page); + ret = zcomp_compress(zstrm, src, &comp_len_next); + kunmap_atomic(src); + + /* + * Either a compression error or we failed to compressed the object + * in a way that will save us memory. Mark the object so that we + * don't attemp to re-compress it again (RECOMP_SKIP). + */ + if (comp_len_next >= huge_class_size || + comp_len_next >= comp_len_prev || + ret) { + zram_set_flag(zram, index, ZRAM_RECOMP_SKIP); + zram_clear_flag(zram, index, ZRAM_IDLE); + zcomp_stream_put(zram->comps[ZRAM_SECONDARY_ZCOMP]); + return ret; + } + + /* + * No direct reclaim (slow path) for handle allocation and no + * re-compression attempt (unlike in __zram_bvec_write()) since + * we already stored that object in zsmalloc. If we cannot alloc + * memory then me bail out. + */ + handle_next = zs_malloc(zram->mem_pool, comp_len_next, + __GFP_KSWAPD_RECLAIM | + __GFP_NOWARN | + __GFP_HIGHMEM | + __GFP_MOVABLE); + if (IS_ERR((void *)handle_next)) { + zcomp_stream_put(zram->comps[ZRAM_SECONDARY_ZCOMP]); + return -ENOMEM; + } + + dst = zs_map_object(zram->mem_pool, handle_next, ZS_MM_WO); + memcpy(dst, zstrm->buffer, comp_len_next); + zcomp_stream_put(zram->comps[ZRAM_SECONDARY_ZCOMP]); + + zs_unmap_object(zram->mem_pool, handle_next); + + zram_free_page(zram, index); + zram_set_handle(zram, index, handle_next); + zram_set_obj_size(zram, index, comp_len_next); + + zram_set_flag(zram, index, ZRAM_RECOMP); + atomic64_add(comp_len_next, &zram->stats.compr_data_size); + atomic64_inc(&zram->stats.pages_stored); + + return 0; +} + +#define RECOMPRESS_IDLE (1 << 0) +#define RECOMPRESS_HUGE (1 << 1) + +static ssize_t recompress_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct zram *zram = dev_to_zram(dev); + unsigned long nr_pages = zram->disksize >> PAGE_SHIFT; + unsigned long index; + struct page *page; + ssize_t ret = 0; + int mode, size_watermark = 0; + + if (sysfs_streq(buf, "idle")) { + mode = RECOMPRESS_IDLE; + } else if (sysfs_streq(buf, "huge")) { + mode = RECOMPRESS_HUGE; + } else if (sysfs_streq(buf, "huge_idle")) { + mode = RECOMPRESS_IDLE | RECOMPRESS_HUGE; + } else { + /* + * We will re-compress only idle objects equal or greater + * in size than watermark. + */ + ret = kstrtoint(buf, 10, &size_watermark); + if (ret) + return ret; + mode = RECOMPRESS_IDLE; + } + + if (size_watermark > PAGE_SIZE) + return ret; + + down_read(&zram->init_lock); + if (!init_done(zram)) { + ret = -EINVAL; + goto release_init_lock; + } + + page = alloc_page(GFP_KERNEL); + if (!page) { + ret = -ENOMEM; + goto release_init_lock; + } + + for (index = 0; index < nr_pages; index++) { + zram_slot_lock(zram, index); + + if (!zram_allocated(zram, index)) + goto next; + + if (mode & RECOMPRESS_IDLE && + !zram_test_flag(zram, index, ZRAM_IDLE)) + goto next; + + if (mode & RECOMPRESS_HUGE && + !zram_test_flag(zram, index, ZRAM_HUGE)) + goto next; + + if (zram_test_flag(zram, index, ZRAM_WB) || + zram_test_flag(zram, index, ZRAM_UNDER_WB) || + zram_test_flag(zram, index, ZRAM_SAME) || + zram_test_flag(zram, index, ZRAM_RECOMP) || + zram_test_flag(zram, index, ZRAM_RECOMP_SKIP)) + goto next; + + ret = zram_recompress(zram, index, page, size_watermark); +next: + zram_slot_unlock(zram, index); + if (ret) + break; + + cond_resched(); + } + + ret = len; + __free_page(page); + +release_init_lock: + up_read(&zram->init_lock); + return ret; +} +#endif + /* * zram_bio_discard - handler on discard request * @index: physical block index in PAGE_SIZE units @@ -1983,6 +2169,7 @@ static DEVICE_ATTR_RW(writeback_limit_enable); #endif #ifdef CONFIG_ZRAM_MULTI_COMP static DEVICE_ATTR_RW(recomp_algorithm); +static DEVICE_ATTR_WO(recompress); #endif static struct attribute *zram_disk_attrs[] = { @@ -2009,6 +2196,7 @@ static struct attribute *zram_disk_attrs[] = { &dev_attr_debug_stat.attr, #ifdef CONFIG_ZRAM_MULTI_COMP &dev_attr_recomp_algorithm.attr, + &dev_attr_recompress.attr, #endif NULL, }; diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 4044ddbb2326..09b9ceb5dfa3 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -49,6 +49,8 @@ enum zram_pageflags { ZRAM_UNDER_WB, /* page is under writeback */ ZRAM_HUGE, /* Incompressible page */ ZRAM_IDLE, /* not accessed page since last idle marking */ + ZRAM_RECOMP, /* page was recompressed */ + ZRAM_RECOMP_SKIP, /* secondary algorithm cannot compress this page */ __NR_ZRAM_PAGEFLAGS, }; From patchwork Sun Oct 9 09:07:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001948 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 67E5BC433F5 for ; Sun, 9 Oct 2022 09:07:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E818F6B0078; Sun, 9 Oct 2022 05:07:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E34CA6B007B; Sun, 9 Oct 2022 05:07:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CD2CC6B007D; Sun, 9 Oct 2022 05:07:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id B6BFE6B0078 for ; Sun, 9 Oct 2022 05:07:40 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 7AA6DC0998 for ; Sun, 9 Oct 2022 09:07:40 +0000 (UTC) X-FDA: 80000833080.12.001B9F8 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by imf25.hostedemail.com (Postfix) with ESMTP id EE44BA0017 for ; Sun, 9 Oct 2022 09:07:39 +0000 (UTC) Received: by mail-pf1-f173.google.com with SMTP id p14so4110625pfq.5 for ; Sun, 09 Oct 2022 02:07:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OqM9mWTVfbPsXUXKnKUtd3WdYMNua/MWINqYRXykEKs=; b=RKbrhKqsTOg+IHSg3cwCrTY4ZG/+LpdneXqRPTBTZgcz5VO3HHb+9AxHDxUZ3Jb2gQ W9+FolOVoU5RPYyTNGMx8TF2g/qhCoAGnRJ1xhcEuqFdZ+9luHiMWlVruTmUYFSKhdIu PYKfmU+qpJwUkcvfrhZk58dMiWNXxIm3cM5kU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OqM9mWTVfbPsXUXKnKUtd3WdYMNua/MWINqYRXykEKs=; b=P0TdbG4FcnCjq7aU/wXCU8UQWrW5KeaimTVkgzArvoRmx2PkrkyuUlEwQADbUJRswa r9rUo1yj/M4QEpHI8uqaVFLUoURFdMMY6WruE45bcihAvqy/0jrwo+e/98J3Ri5qAizA mI5Wjr4ks1DKyiaXgWJ9GETgiGwLeUaGUOwK6i424kO3vic2kOfvSngl6BvbW+SzgVFe f8DYkgIZDpqUaU3UxYiLVnynvRSHOObQmtCoALtykXCmKJIPV4BmewAV4WCFI5h9gF9W zBEnyVNDllztyMbr22lP1RuTuzjbk+dreJJoC0HuxYw5Fsd1Bk5DWq71V48xVLaaIfbt nxLA== X-Gm-Message-State: ACrzQf0VVA/WtWdJMoq6DyeGz40Zb4cdVuP1As8iW7gNZPDGbqIgzG/V IXaMSFAPxd8LiXDtDx4BNkitdGtdHFxTRA== X-Google-Smtp-Source: AMsMyM67guaiwP/QYUJO3S8X8Xt6xiCerRRailhF+6FA6YUQCxdLbbWRbAwLSAGadIpcgCrGmDFfEA== X-Received: by 2002:a63:90ca:0:b0:458:f28d:917e with SMTP id a193-20020a6390ca000000b00458f28d917emr11934116pge.201.1665306458975; Sun, 09 Oct 2022 02:07:38 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:38 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 5/8] documentation: Add recompression documentation Date: Sun, 9 Oct 2022 18:07:17 +0900 Message-Id: <20221009090720.1040633-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=RKbrhKqs; spf=pass (imf25.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.173 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306460; a=rsa-sha256; cv=none; b=OLBXP5L8srvheb/QKvgdMlmc2WcPGjWf2CB9a2SHblqpNfNgR/QLshTnAbY4Dw9Wgex77J AwTX6yOrSILWTpOTSNXSQPUZY24HEov/n3F0rn6vPt1M6ycX6eMaEzOefQ82Gcp9NAMJm/ ptevaT5XPH4C7DWLl/qNkKEPVcjApCA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306460; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=OqM9mWTVfbPsXUXKnKUtd3WdYMNua/MWINqYRXykEKs=; b=lpquKpSm0lQW4QMZ6jE1InR9ljF8OmK7BskRdvx+FLw4K586m5c+yhucecpO6O/UwTvKa4 ZCWiX1HSKX1TRm/KkDbtSNTwIDO/GOBifFaPGKzhzwQ5NcOuEyS1rfTJD0lfflECne+Zjy xaZin5LjulDAPrB1R5FjSQM1h381wFQ= X-Rspamd-Queue-Id: EE44BA0017 X-Rspam-User: Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=RKbrhKqs; spf=pass (imf25.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.210.173 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org; dmarc=pass (policy=none) header.from=chromium.org X-Rspamd-Server: rspam10 X-Stat-Signature: wdaauem1i8ijsxjh7bxrm53ep8oczx8c X-HE-Tag: 1665306459-744150 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Document user-space visible device attributes that are enabled by ZRAM_MULTI_COMP. Signed-off-by: Sergey Senozhatsky Signed-off-by: Sergey Senozhatsky --- Documentation/admin-guide/blockdev/zram.rst | 55 +++++++++++++++++++++ drivers/block/zram/zram_drv.c | 7 +-- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/admin-guide/blockdev/zram.rst index c73b16930449..88957fcb6ad7 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -401,6 +401,61 @@ budget in next setting is user's job. If admin wants to measure writeback count in a certain period, they could know it via /sys/block/zram0/bd_stat's 3rd column. +recompression +------------- + +With CONFIG_ZRAM_MULTI_COMP, zram can recompress idle/huge pages using +alternative (secondary) compression algorithm. The basic idea is that +alternative compression algorithm can provide better compression ratio +at a price of (potentially) slower compression/decompression speeds. +Alternative compression algorithm can, for example, be more successful +compressing huge pages (those that default algorithm failed to compress). +Another application is idle pages recompression - pages that are cold and +sit in the memory can be recompressed using more effective algorithm and, +hence, reduce zsmalloc memory usage. + +With CONFIG_ZRAM_MULTI_COMP, zram will setup two compression algorithms +per-CPU: primary and secondary ones. Primary zram compressor is explained +in "3) Select compression algorithm", the secondary algorithm is configured +in a similar way, using recomp_algorithm device attribute: + +Examples:: + + #show supported recompression algorithms + cat /sys/block/zramX/recomp_algorithm + zstd [lzo] + + #select zstd recompression algorithm + echo zstd > /sys/block/zramX/recomp_algorithm + +Another device attribute that CONFIG_ZRAM_MULTI_COMP enables is recompress, +which controls recompression: + +Examples:: + + #IDLE pages recompression is activated by `idle` mode + echo idle > /sys/block/zramX/recompress + + #HUGE pages recompression is activated by `huge` mode + echo huge > /sys/block/zram0/recompress + + #HUGE_IDLE pages recompression is activated by `huge_idle` mode + echo huge_idle > /sys/block/zramX/recompress + +The number of idle pages can be significant, so user-space can pass a size +watermark value to the recompress knob, to filter out idle pages for +recompression: zram will recompress only idle pages of equal or greater +size::: + + #recompress idle pages larger than 3000 bytes + echo 3000 > /sys/block/zramX/recompress + + #recompress idle pages larger than 2000 bytes + echo 2000 > /sys/block/zramX/recompress + +Recompression is mostly focused on idle pages (except for huge pages +recompression), so it works better in conjunction with memory tracking. + memory tracking =============== diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 12368e773f3d..143c33bd6783 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1623,9 +1623,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, * * Corresponding ZRAM slot should be locked. */ -static int zram_recompress(struct zram *zram, - u32 index, - struct page *page, +static int zram_recompress(struct zram *zram, u32 index, struct page *page, int size_watermark) { unsigned long handle_prev; @@ -1708,8 +1706,7 @@ static int zram_recompress(struct zram *zram, static ssize_t recompress_store(struct device *dev, struct device_attribute *attr, - const char *buf, - size_t len) + const char *buf, size_t len) { struct zram *zram = dev_to_zram(dev); unsigned long nr_pages = zram->disksize >> PAGE_SHIFT; From patchwork Sun Oct 9 09:07:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001949 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B0687C433FE for ; Sun, 9 Oct 2022 09:07:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4BEE66B007B; Sun, 9 Oct 2022 05:07:43 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 46E1D6B007D; Sun, 9 Oct 2022 05:07:43 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 30F19900002; Sun, 9 Oct 2022 05:07:43 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 214B96B007B for ; Sun, 9 Oct 2022 05:07:43 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id E685BAB271 for ; Sun, 9 Oct 2022 09:07:42 +0000 (UTC) X-FDA: 80000833164.13.104D63A Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by imf13.hostedemail.com (Postfix) with ESMTP id 4F19E20020 for ; Sun, 9 Oct 2022 09:07:42 +0000 (UTC) Received: by mail-pl1-f176.google.com with SMTP id n7so8087192plp.1 for ; Sun, 09 Oct 2022 02:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4cZ+puyQMSIB+n8E0d97j6XHSOdtq59YpKkyki1VJU8=; b=EgKwRSilPm7p4CO1u8/fIzwBKtIVXSWTmIsbJOKy4/04UduO4fKhE+2bWFSK6PWTy7 MUs1CmVg66IhdIP7LBiQ3/atcqWn26lPXRjdKFSnnEXRcmOc+F9INsSAneuaKX1eiKEB 7yEG45dA0ijTgitSeK72Gyqzf24vDXZ6hjyLY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4cZ+puyQMSIB+n8E0d97j6XHSOdtq59YpKkyki1VJU8=; b=zokGAAREs7iYz+XRgdn3NExKSaw0uswmIV/miCYVNrs5CW8PHEFnw1kzjxa29cNd04 X2I0ePDdFJOfxGtdJKUw6gOzFvPkT9wUpX077mXoOOEnq5MNtN/EDqr967UWfe2Bh3zl dx/OSkxG6hez8FlkanQPpezAoOwBTX4LNwyhqhpw27W+DOJQ119YX2YRj+k7USAG5ejl gskCiUttQ8INFHZWs0sMSoc1KL9QfhQX77vzlTGE9Y4hR4vm68bpNO0rb73Qi/h6fs+X MtGvE6UogP4sZcQpiKS6VebjzlI8Kh1fzoEqDfWVx71xS+RoViZdbYt4FTe1fHJuuII8 iKgQ== X-Gm-Message-State: ACrzQf1FsdRKG2Smi99Kg8SH3HGJaYZHi6mei1U4dqZ8sB8TK0MkOkYA mSxnFMbHfVFY+M2jNJ9GLjPDOA== X-Google-Smtp-Source: AMsMyM6wBamnMbzu7YlLUOWaIL8i996NZuN+u1yUYf1GbwAo3RpqMwn47tLv84VDFkbJMphI+eG9ag== X-Received: by 2002:a17:902:ec83:b0:17c:afb3:d1ec with SMTP id x3-20020a170902ec8300b0017cafb3d1ecmr13185807plg.172.1665306461306; Sun, 09 Oct 2022 02:07:41 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:41 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 6/8] zram: Add recompression algorithm choice to Kconfig Date: Sun, 9 Oct 2022 18:07:18 +0900 Message-Id: <20221009090720.1040633-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306462; a=rsa-sha256; cv=none; b=ZpL/6GDlyLi/XTFatlb1U3RXWEoTRx7A5SU89xpGX6nHCjDhqEPSSedo1ICSdiMOJUBjUK I3jf5H1mjuD4cEtRgbOt9AYn3AGDtsmJ18uBHOK1A/Q3wAO8xBsBEKwv5t6g9VFfH3XcUv HL7nGnOErVv3rwpB+/lOFk8TJehW058= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=EgKwRSil; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf13.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.214.176 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306462; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=4cZ+puyQMSIB+n8E0d97j6XHSOdtq59YpKkyki1VJU8=; b=Pf1C237W0Z6JTn+XxG7SgYpncoEfBP9nxiYYs+1qXeS1yuuIVvCY7/ZrigQ6eM6B+SjBcb G204Y9S0w2CHdTelbzruuix4NdS4VXl6s9LMBVotbeiwIn0jpybv0WYW71SSmE1lk02Z5A KpuEtMDozAPdqpuKBUqLN3KTt4xP6iI= X-Stat-Signature: hxpmgnnsihpaskw6eataqxf7hjt9h344 X-Rspamd-Queue-Id: 4F19E20020 Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=EgKwRSil; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf13.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.214.176 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org X-Rspam-User: X-Rspamd-Server: rspam03 X-HE-Tag: 1665306462-476119 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Make (secondary) recompression algorithm selectable just like we do it for the (primary) default one. Signed-off-by: Sergey Senozhatsky Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/Kconfig | 40 +++++++++++++++++++++++++++++++++++ drivers/block/zram/zram_drv.c | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 7febf36e93eb..442885ac72ca 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -90,3 +90,43 @@ config ZRAM_MULTI_COMP echo TIMEOUT > /sys/block/zramX/idle echo SIZE > /sys/block/zramX/recompress + +choice + prompt "Default zram recompression algorithm" + default ZRAM_DEF_RECOMP_ZSTD + depends on ZRAM && ZRAM_MULTI_COMP + +config ZRAM_DEF_RECOMP_LZORLE + bool "lzo-rle" + depends on CRYPTO_LZO + +config ZRAM_DEF_RECOMP_ZSTD + bool "zstd" + depends on CRYPTO_ZSTD + +config ZRAM_DEF_RECOMP_LZ4 + bool "lz4" + depends on CRYPTO_LZ4 + +config ZRAM_DEF_RECOMP_LZO + bool "lzo" + depends on CRYPTO_LZO + +config ZRAM_DEF_RECOMP_LZ4HC + bool "lz4hc" + depends on CRYPTO_LZ4HC + +config ZRAM_DEF_RECOMP_842 + bool "842" + depends on CRYPTO_842 + +endchoice + +config ZRAM_DEF_RECOMP + string + default "lzo-rle" if ZRAM_DEF_RECOMP_LZORLE + default "zstd" if ZRAM_DEF_RECOMP_ZSTD + default "lz4" if ZRAM_DEF_RECOMP_LZ4 + default "lzo" if ZRAM_DEF_RECOMP_LZO + default "lz4hc" if ZRAM_DEF_RECOMP_LZ4HC + default "842" if ZRAM_DEF_RECOMP_842 diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 143c33bd6783..7285a85b4054 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -44,7 +44,7 @@ static int zram_major; static const char *default_comp_algs[ZRAM_MAX_ZCOMPS] = { CONFIG_ZRAM_DEF_COMP, #ifdef CONFIG_ZRAM_MULTI_COMP - "zstd", + CONFIG_ZRAM_DEF_RECOMP, #endif }; From patchwork Sun Oct 9 09:07:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001950 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 000E3C43217 for ; Sun, 9 Oct 2022 09:07:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7086F6B007D; Sun, 9 Oct 2022 05:07:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6B91C6B007E; Sun, 9 Oct 2022 05:07:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 55952900002; Sun, 9 Oct 2022 05:07:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 429EC6B007D for ; Sun, 9 Oct 2022 05:07:45 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 1BC15160723 for ; Sun, 9 Oct 2022 09:07:45 +0000 (UTC) X-FDA: 80000833290.19.95198BD Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) by imf11.hostedemail.com (Postfix) with ESMTP id BB9164001A for ; Sun, 9 Oct 2022 09:07:44 +0000 (UTC) Received: by mail-pj1-f44.google.com with SMTP id o9-20020a17090a0a0900b0020ad4e758b3so8080819pjo.4 for ; Sun, 09 Oct 2022 02:07:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5N+idb9Meu8bPgxV55r58/HUuOBKJs8gG9ElyKqtXIc=; b=Y9iTT0+zRaa4UXFiqtUyNe+GZMNhwGfWFvD2qw8EcyhN30/JkANHqh6exb6Tvly/D2 ozVLLGVefoQfieaWnBXFVKNSFSvVNfgcfNpFVTyp0JuWTvz3d6lhQytCAr0PB0S/K1Gr xjkMHUwZuSW9W4NSn0+pi1i4T6+rRDN/i8bH4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5N+idb9Meu8bPgxV55r58/HUuOBKJs8gG9ElyKqtXIc=; b=hnxfhumZGCkHmryG+yMkTLRr5hRpu6wn5jFFMKN4QvCn4nUozjiJitdm0X4InlXe0l BOmvURV3mrY0fXqYdEV9l2o9tJWoYXwHKVNoAdFbvxaDlrCi2e0HjWuvqZQDHN9rT//O SN4DOQrrhY88PqtY0nzZS4WFKWdpvXRzYraXBNsJFzervSF/3ipqu8bCbjdZRajae88Z 6h3qkldTmCJWD5tauMrSA3jFA/GAkwoqx9Ls+ZN61ogGs/1g/ixsD6AjGQKsZtEZ6O+3 MmR2XGo6o59DkKWWadBM54Rktd/KqRKxjbJhEOa3cGNfHXIb8bTYaoJXId0gkUEcNpSy o0Dw== X-Gm-Message-State: ACrzQf0yYG8z6YbyDLfZBB3Z/lf0L+WPtqYY4uTbBQ+HIQx/6cSo5nFX GAOoPANi9r6/XDdmMVmAKJv8h1DL2j6V6g== X-Google-Smtp-Source: AMsMyM4wsiBlX1NkUhAfcaouRhXX8PAS3oIjVVHLWLI0PncP5Tf5uAod8RAj/q7gd5Nan0SlLp2qHg== X-Received: by 2002:a17:902:ec8d:b0:178:2914:b5a0 with SMTP id x13-20020a170902ec8d00b001782914b5a0mr13430611plg.17.1665306463751; Sun, 09 Oct 2022 02:07:43 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:43 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 7/8] zram: Add recompress flag to read_block_state() Date: Sun, 9 Oct 2022 18:07:19 +0900 Message-Id: <20221009090720.1040633-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306464; a=rsa-sha256; cv=none; b=UeXiTtHMZjGjmleLT/9ZXWopWZvlPjh3waPYiUsebxgQ++wOAGWMIkBG3Dv3u/5pOpeGhX oJk4ndzMGO1OFwj5LnCtnsO7jXqssJN9RHobQaZzW99Xq4yO56O2Xgmx5m1qmgpwWyelXS Ys3H9fTGlaTMlb6fqLEVtx8qLlO6IWc= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=Y9iTT0+z; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf11.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.216.44 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306464; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=5N+idb9Meu8bPgxV55r58/HUuOBKJs8gG9ElyKqtXIc=; b=cQ/PEucDGlTRE54SX9XQWvPHuXKg7RrwVmFHFpHVZ1j53aBtBoTJ2cXI7ALpB584ZltaYR cpZ7ajKjLC4WLxGakeBgUFagbNCHndYfB++W5yuV/7yHkfaQr0foGy8RG4CJzNFq/Zt7Ut j1AJz+wvyyfk60UJiCK2A0IraudFFSg= X-Stat-Signature: zwfnjphccaqqha54imc58yrbtzbdeqzj X-Rspamd-Queue-Id: BB9164001A Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=Y9iTT0+z; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf11.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.216.44 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org X-Rspam-User: X-Rspamd-Server: rspam02 X-HE-Tag: 1665306464-917642 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a new flag to zram block state that shows if the page was recompressed (using alternative compression algorithm). Signed-off-by: Sergey Senozhatsky --- Documentation/admin-guide/blockdev/zram.rst | 9 ++++++--- drivers/block/zram/zram_drv.c | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/admin-guide/blockdev/zram.rst index 88957fcb6ad7..70a3d0243b45 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -466,9 +466,10 @@ pages of the process with*pagemap. If you enable the feature, you could see block state via /sys/kernel/debug/zram/zram0/block_state". The output is as follows:: - 300 75.033841 .wh. - 301 63.806904 s... - 302 63.806919 ..hi + 300 75.033841 .wh.. + 301 63.806904 s.... + 302 63.806919 ..hi. + 303 62.801919 ....r First column zram's block index. @@ -485,6 +486,8 @@ Third column huge page i: idle page + r: + recompressed page (secondary compression algorithm) First line of above example says 300th block is accessed at 75.033841sec and the block's state is huge so it is written back to the backing diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 7285a85b4054..34bb21691cee 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -925,13 +925,14 @@ static ssize_t read_block_state(struct file *file, char __user *buf, ts = ktime_to_timespec64(zram->table[index].ac_time); copied = snprintf(kbuf + written, count, - "%12zd %12lld.%06lu %c%c%c%c\n", + "%12zd %12lld.%06lu %c%c%c%c%c\n", index, (s64)ts.tv_sec, ts.tv_nsec / NSEC_PER_USEC, zram_test_flag(zram, index, ZRAM_SAME) ? 's' : '.', zram_test_flag(zram, index, ZRAM_WB) ? 'w' : '.', zram_test_flag(zram, index, ZRAM_HUGE) ? 'h' : '.', - zram_test_flag(zram, index, ZRAM_IDLE) ? 'i' : '.'); + zram_test_flag(zram, index, ZRAM_IDLE) ? 'i' : '.', + zram_test_flag(zram, index, ZRAM_RECOMP) ? 'r' : '.'); if (count <= copied) { zram_slot_unlock(zram, index); From patchwork Sun Oct 9 09:07:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 13001951 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 48995C433FE for ; Sun, 9 Oct 2022 09:07:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D72936B007E; Sun, 9 Oct 2022 05:07:47 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D209B6B0080; Sun, 9 Oct 2022 05:07:47 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B9B68900002; Sun, 9 Oct 2022 05:07:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id A9AE16B007E for ; Sun, 9 Oct 2022 05:07:47 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 7F30B1603E6 for ; Sun, 9 Oct 2022 09:07:47 +0000 (UTC) X-FDA: 80000833374.28.35EF8B7 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by imf24.hostedemail.com (Postfix) with ESMTP id 15AB0180027 for ; Sun, 9 Oct 2022 09:07:46 +0000 (UTC) Received: by mail-pg1-f180.google.com with SMTP id q9so8093819pgq.8 for ; Sun, 09 Oct 2022 02:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=yuRbPyGZZsBm+5IGqHamjUR/zxD3kPUYp8Ab64laoNc=; b=oOmLwkPegZkRA22IheBP7jpj4rmN4FNV+6EnSr8jIB4n5RzMMUBb94GoepCq8HsBWc wToGz+fobeVepMARste1oDCCsKjfC5vJ3MkWqQukaYD4qtrGqrEZq3tH6F+DfrHOdfHb kPbYtXBxq2sTBcE0H0EKh7MhwrpKsuyWl3O88= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yuRbPyGZZsBm+5IGqHamjUR/zxD3kPUYp8Ab64laoNc=; b=AScRsptMFmm2GtopW3qxAlkXzPVj9S/4O15wbnqG5DRwQPwiw40bOOJQQAxQK1fVCw CzxFaXl5lbHZvz++mRw7TiSWGVmGpb0IF7YZkFo0YIKO1Er1PMXPMK9sdOcfzZYM4hxS cNZUzxXMMZGw8ylNs4h4SXRuE575iH1PJWlIIM0659pIZa9N49TgmbUkKifmj9rmPZPT 10f+8fjXXzAazyug4kyZQ71nMwNWFiV3+EWoFsYs5fMmcPljscX4YWhB/97iSbAklOLb UQx9nA2wDP5ZGtHGUZnfXo3mO0UVG6NuMj9wLfbtmSklsH2xtbK/+DP3MHWQ05oI5BYW cujw== X-Gm-Message-State: ACrzQf3/RC2ziHOd/DQe5HugXxLpTxYi+jingo8sDdsmlPlJ2FvdIvzU RyLy7ZG43FuPADPa6/vHLd7DpQ== X-Google-Smtp-Source: AMsMyM7emD3Idi1m55hr8/6YiYa0jBoU5n5s7t3oFzxQwBHDrOMjbsnZwwXmfSQt4BFw/i9VJmJBOQ== X-Received: by 2002:a63:6905:0:b0:43c:d4:eef4 with SMTP id e5-20020a636905000000b0043c00d4eef4mr11578195pgc.126.1665306466139; Sun, 09 Oct 2022 02:07:46 -0700 (PDT) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:8517:d51e:5fe9:9be7]) by smtp.gmail.com with ESMTPSA id q194-20020a632acb000000b00439d071c110sm4335148pgq.43.2022.10.09.02.07.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Oct 2022 02:07:45 -0700 (PDT) From: Sergey Senozhatsky To: Minchan Kim , Andrew Morton Cc: Nitin Gupta , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Sergey Senozhatsky Subject: [PATCHv3 8/8] zram: correct typos Date: Sun, 9 Oct 2022 18:07:20 +0900 Message-Id: <20221009090720.1040633-9-senozhatsky@chromium.org> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog In-Reply-To: <20221009090720.1040633-1-senozhatsky@chromium.org> References: <20221009090720.1040633-1-senozhatsky@chromium.org> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1665306467; a=rsa-sha256; cv=none; b=qF9kph1uDTTpwVEJ2GRvJSK4j34/HL0uhfgaBD09xv+BAEAkEVQ8h1he8UyARkr7UtNxuO rCdUIT9LMnYtukqznk75s/b4bFVJmydP9ea1cRDQKuVqDB/Lr4jLOOS+ENE9iHJkZGTa6u ThEugBg05edmYa+clkDuUjsWJxZKUqo= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oOmLwkPe; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf24.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.180 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1665306467; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=yuRbPyGZZsBm+5IGqHamjUR/zxD3kPUYp8Ab64laoNc=; b=C656WrgBvXchC9B8w6I2BNEyA7uXdFYbUUHaBlYH5ENlx11GThzKlEb7hFKZWnKi8Yf35H YbHgXGJwzWB14ztCNmIgagIGMKv/fOCggpIkXJUVC7w0ELuk/m6OcktQ+tpz231TvWDLHS OwPD2TsYCXi0ALhBi7W4MSPGhxvxSqU= X-Stat-Signature: 4on6wq9tnci7q157ath6a6urwi5ad3nz X-Rspamd-Queue-Id: 15AB0180027 Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=chromium.org header.s=google header.b=oOmLwkPe; dmarc=pass (policy=none) header.from=chromium.org; spf=pass (imf24.hostedemail.com: domain of senozhatsky@chromium.org designates 209.85.215.180 as permitted sender) smtp.mailfrom=senozhatsky@chromium.org X-Rspam-User: X-Rspamd-Server: rspam03 X-HE-Tag: 1665306466-701643 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Trivial comment typos fixes. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 34bb21691cee..ecbc5963b5b8 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -759,7 +759,7 @@ static ssize_t writeback_store(struct device *dev, zram_slot_unlock(zram, index); /* * Return last IO error unless every IO were - * not suceeded. + * not succeeded. */ ret = err; continue; @@ -1658,7 +1658,7 @@ static int zram_recompress(struct zram *zram, u32 index, struct page *page, /* * Either a compression error or we failed to compressed the object * in a way that will save us memory. Mark the object so that we - * don't attemp to re-compress it again (RECOMP_SKIP). + * don't attempt to re-compress it again (RECOMP_SKIP). */ if (comp_len_next >= huge_class_size || comp_len_next >= comp_len_prev ||