From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 218AA3016FD for ; Mon, 1 Dec 2025 09:48:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582492; cv=none; b=RiwsFLXvZBhLHE9QjzCJaBzDswb2RCIbTi5V4q7VWfjhgTAVLb2toQ2vd7WlgVZCES5BybSct6qOxnJ5tiX0TQLFffnDxmxt6KWtw3QaZ0/Ji053YAyNmMG6Di2uMWoLG9crWa38TwM0/Njztnfeq2pV/v2l3AUlMPNxjI5rx/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582492; c=relaxed/simple; bh=gJjRJgokMBBuKpP/pYHkY9trICF6nRm1R9+3OXfaNsE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DKGh2eb7PnsLlMjuFsIf0FAwnhdJ6fxQTtXmgbniLvJ6+uN3qmkVU5e+cI06Q+fUnAwk7JVIQurka6Q17jHSU9lA5JcuLT0NM0Ak/TLJhEkGxRfnDTPgHksMT4MSkBTLsPKpGaKLmDGyu4mhyuatM2hkXeudvQnxuOt8CT02UN4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=a4p+8Npn; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="a4p+8Npn" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-7bb3092e4d7so4026818b3a.0 for ; Mon, 01 Dec 2025 01:48:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582489; x=1765187289; darn=vger.kernel.org; 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=fnhNR+agQ932W+14bFvb5ZmmvFAQtUwOKUgk6jRlfpU=; b=a4p+8Npn4AxOImUyEOyhtvgWlh4NgfOMdNFsD2zkN/Uu9HcXBTZRfV/+le68KRfuCG 4pEoyxeU2hCR6mQZlIdmTbdgwAsmfzYGqCeGQYFPtU9PqyVIRKceNguGdzjlHS3prE2T 3ldI4LCrbXSKZ6xRoZ8L8ipnuADw2piAH1JIU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582489; x=1765187289; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=fnhNR+agQ932W+14bFvb5ZmmvFAQtUwOKUgk6jRlfpU=; b=hbLQs5e8N17Yn33M8O9Ngi0ZP6W0bnmFgwjPeTr2yZ//84Mnt0tyFbFRT4JsVClyjY GW9c8aUb2SFbxM4Y5Sr6JZ1dDs5IfOT4xckzUv3I1BGMksrAqwGXxrwtJUKnewwIFFJI qX2z+sJ3/ae67dDQ45UlenmBGT+kOxhoLlecSVv27loL3rfq77r478+4EORjS4Guik4P NZwOLBl0HQ1dqCKt8D9SvgN0Y5KZixEkdIcygqlsFQjns8yHCzKXsKBCAF1YjGy4jpcQ AsSeaBcrfUo8+1KVHxhJEdndi5juqkOBpkT7A0jxOJIDCjNBCsOblMB6Ds0DqlwwVr/7 QlVw== X-Forwarded-Encrypted: i=1; AJvYcCUL3AFhF+OJBAwm/FzykuKjVBvkzKN/PlHTymsRqW7JWoF45y+7N/FCKNiY9lzS7eQifPkggFliGk4FlB0=@vger.kernel.org X-Gm-Message-State: AOJu0Ywh/Rwm5y8Wkdfvz7bI9eWZUwAGB0ngJNpvEmkeZofVQa9De3sn 5P/Bg/3lra3++cjQSkg0UiufS5OyAydBLte1wjt9pIbiUQ/GyCg99dWWLxxqILaV1w== X-Gm-Gg: ASbGnctGIUvH7pdXao4G75vi3xqUry7lHpjG9hDTSQwvGPbxesWM3Z+ONMAKCcwhKhl rtmEK/VQ0lWT1B0KeOzcAP2F1GCZCSwaVxxjmbg1VP0cgn3jsvA+iYwbeMxRlULGKzBz7XYo5j3 pVTq0K+HEhkSKk9n8lFzY4kbFUU5EyU3uImYRrXsynB3Vb/DYfjSyen8Gx7nBv7I2Q0v0EmFL3A Gc/ZGpacb0EVuy5vKv6D5u4yrn2pJDPy6EBj1WpxDTdMIb2BXZfzQMBGQs+Vxh/wrHeMZphSRk1 xUJ7cOO+i7uQj2STM9hgEHmDpKKKGHv1TfeyUEM2Y3QOd4qhTc3WYhmucMfYoMNk/7UeBz0xI5q czWQSvEC4nUaYS/FVJsoY1Kza1djjmDXow3jOcIWc3EmdfEXHgOtibvl0i5UZRgW5HVATImBW12 3VFzWcohbjk0BP4efcijw5UztDQpeetiE8l0Fx9sFqy3xlqpqI4QS4+ATcUGvD3k3Y4LeQcU5rx A== X-Google-Smtp-Source: AGHT+IHKSmALbuKSgE06X0oPsRvPSiRabvdVpp7WYRIWzuOcPk/FALFSBZoiw65yQsKAfcJNqwyM2A== X-Received: by 2002:aa7:989d:0:b0:7aa:ac12:2c33 with SMTP id d2e1a72fcca58-7c58c2a7354mr29267009b3a.1.1764582489249; Mon, 01 Dec 2025 01:48:09 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:08 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky , Minchan Kim Subject: [PATCHv2 1/7] zram: introduce compressed data writeback Date: Mon, 1 Dec 2025 18:47:48 +0900 Message-ID: <20251201094754.4149975-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Richard Chang zram stores all written back slots raw, which implies that during writeback zram first has to decompress slots (except for ZRAM_HUGE slots, which are raw already). The problem with this approach is that not every written back page gets read back (either via read() or via page-fault), which means that zram basically wastes CPU cycles and battery decompressing such slots. This changes with introduction of decompression on demand, in other words decompression on read()/page-fault. One caveat of decompression on demand is that async read is completed in IRQ context, while zram decompression is sleepable. To workaround this, read-back decompression is offloaded to a preemptible context - system high-prio work-queue. At this point compressed writeback is still disabled, a follow up patch will introduce a new device attribute which will make it possible to toggle compressed writeback per-device. [senozhatsky: rewrote original implementation] Signed-off-by: Richard Chang Co-developed-by: Sergey Senozhatsky Suggested-by: Minchan Kim Suggested-by: Brian Geffon --- drivers/block/zram/zram_drv.c | 279 +++++++++++++++++++++++++++------- drivers/block/zram/zram_drv.h | 1 + 2 files changed, 227 insertions(+), 53 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 5759823d6314..6263d300312e 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -57,9 +57,6 @@ static size_t huge_class_size; static const struct block_device_operations zram_devops; =20 static void zram_free_page(struct zram *zram, size_t index); -static int zram_read_from_zspool(struct zram *zram, struct page *page, - u32 index); - #define slot_dep_map(zram, index) (&(zram)->table[(index)].dep_map) =20 static void zram_slot_lock_init(struct zram *zram, u32 index) @@ -502,6 +499,10 @@ static ssize_t idle_store(struct device *dev, #ifdef CONFIG_ZRAM_WRITEBACK #define INVALID_BDEV_BLOCK (~0UL) =20 +static int read_from_zspool_raw(struct zram *zram, struct page *page, + u32 index); +static int read_from_zspool(struct zram *zram, struct page *page, u32 inde= x); + struct zram_wb_ctl { /* idle list is accessed only by the writeback task, no concurency */ struct list_head idle_reqs; @@ -522,6 +523,22 @@ struct zram_wb_req { struct list_head entry; }; =20 +struct zram_rb_req { + struct work_struct work; + struct zram *zram; + struct page *page; + /* The read bio for backing device */ + struct bio *bio; + unsigned long blk_idx; + union { + /* The original bio to complete (async read) */ + struct bio *parent; + /* error status (sync read) */ + int error; + }; + u32 index; +}; + static ssize_t writeback_limit_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) @@ -780,18 +797,6 @@ static void zram_release_bdev_block(struct zram *zram,= unsigned long blk_idx) atomic64_dec(&zram->stats.bd_count); } =20 -static void read_from_bdev_async(struct zram *zram, struct page *page, - unsigned long entry, struct bio *parent) -{ - struct bio *bio; - - bio =3D bio_alloc(zram->bdev, 1, parent->bi_opf, GFP_NOIO); - bio->bi_iter.bi_sector =3D entry * (PAGE_SIZE >> 9); - __bio_add_page(bio, page, PAGE_SIZE, 0); - bio_chain(bio, parent); - submit_bio(bio); -} - static void release_wb_req(struct zram_wb_req *req) { __free_page(req->page); @@ -886,8 +891,9 @@ static void zram_account_writeback_submit(struct zram *= zram) =20 static int zram_writeback_complete(struct zram *zram, struct zram_wb_req *= req) { - u32 index =3D req->pps->index; - int err; + u32 size, index =3D req->pps->index; + int err, prio; + bool huge; =20 err =3D blk_status_to_errno(req->bio.bi_status); if (err) { @@ -914,9 +920,27 @@ static int zram_writeback_complete(struct zram *zram, = struct zram_wb_req *req) goto out; } =20 + if (zram->wb_compressed) { + /* + * ZRAM_WB slots get freed, we need to preserve data required + * for read decompression. + */ + size =3D zram_get_obj_size(zram, index); + prio =3D zram_get_priority(zram, index); + huge =3D zram_test_flag(zram, index, ZRAM_HUGE); + } + zram_free_page(zram, index); zram_set_flag(zram, index, ZRAM_WB); zram_set_handle(zram, index, req->blk_idx); + + if (zram->wb_compressed) { + if (huge) + zram_set_flag(zram, index, ZRAM_HUGE); + zram_set_obj_size(zram, index, size); + zram_set_priority(zram, index, prio); + } + atomic64_inc(&zram->stats.pages_stored); =20 out: @@ -1050,7 +1074,11 @@ static int zram_writeback_slots(struct zram *zram, */ if (!zram_test_flag(zram, index, ZRAM_PP_SLOT)) goto next; - if (zram_read_from_zspool(zram, req->page, index)) + if (zram->wb_compressed) + err =3D read_from_zspool_raw(zram, req->page, index); + else + err =3D read_from_zspool(zram, req->page, index); + if (err) goto next; zram_slot_unlock(zram, index); =20 @@ -1313,24 +1341,140 @@ static ssize_t writeback_store(struct device *dev, return ret; } =20 -struct zram_work { - struct work_struct work; - struct zram *zram; - unsigned long entry; - struct page *page; - int error; -}; +static int decompress_bdev_page(struct zram *zram, struct page *page, u32 = index) +{ + struct zcomp_strm *zstrm; + unsigned int size; + int ret, prio; + void *src; + + zram_slot_lock(zram, index); + /* Since slot was unlocked we need to make sure it's still ZRAM_WB */ + if (!zram_test_flag(zram, index, ZRAM_WB)) { + zram_slot_unlock(zram, index); + /* We read some stale data, zero it out */ + memset_page(page, 0, 0, PAGE_SIZE); + return -EIO; + } + + if (zram_test_flag(zram, index, ZRAM_HUGE)) { + zram_slot_unlock(zram, index); + return 0; + } + + size =3D zram_get_obj_size(zram, index); + prio =3D zram_get_priority(zram, index); =20 -static void zram_sync_read(struct work_struct *work) + zstrm =3D zcomp_stream_get(zram->comps[prio]); + src =3D kmap_local_page(page); + ret =3D zcomp_decompress(zram->comps[prio], zstrm, src, size, + zstrm->local_copy); + if (!ret) + copy_page(src, zstrm->local_copy); + kunmap_local(src); + zcomp_stream_put(zstrm); + zram_slot_unlock(zram, index); + + return ret; +} + +static void zram_deferred_decompress(struct work_struct *w) { - struct zram_work *zw =3D container_of(work, struct zram_work, work); + struct zram_rb_req *req =3D container_of(w, struct zram_rb_req, work); + struct page *page =3D bio_first_page_all(req->bio); + struct zram *zram =3D req->zram; + u32 index =3D req->index; + int ret; + + ret =3D decompress_bdev_page(zram, page, index); + if (ret) + req->parent->bi_status =3D BLK_STS_IOERR; + + /* Decrement parent's ->remaining */ + bio_endio(req->parent); + bio_put(req->bio); + kfree(req); +} + +static void zram_async_read_endio(struct bio *bio) +{ + struct zram_rb_req *req =3D bio->bi_private; + struct zram *zram =3D req->zram; + + if (bio->bi_status) { + req->parent->bi_status =3D bio->bi_status; + bio_endio(req->parent); + bio_put(bio); + kfree(req); + return; + } + + /* + * NOTE: zram_async_read_endio() is not exactly right place for this. + * Ideally, we need to do it after ZRAM_WB check, but this requires + * us to use wq path even on systems that don't enable compressed + * writeback, because we cannot take slot-lock in the current context. + * + * Keep the existing behavior for now. + */ + if (zram->wb_compressed =3D=3D false) { + /* No decompression needed, complete the parent IO */ + bio_endio(req->parent); + bio_put(bio); + kfree(req); + return; + } + + /* + * zram decompression is sleepable, so we need to deffer it to + * a preemptible context. + */ + INIT_WORK(&req->work, zram_deferred_decompress); + queue_work(system_highpri_wq, &req->work); +} + +static void read_from_bdev_async(struct zram *zram, struct page *page, + u32 index, unsigned long blk_idx, + struct bio *parent) +{ + struct zram_rb_req *req; + struct bio *bio; + + req =3D kmalloc(sizeof(*req), GFP_NOIO); + if (!req) + return; + + bio =3D bio_alloc(zram->bdev, 1, parent->bi_opf, GFP_NOIO); + if (!bio) { + kfree(req); + return; + } + + req->zram =3D zram; + req->index =3D index; + req->blk_idx =3D blk_idx; + req->bio =3D bio; + req->parent =3D parent; + + bio->bi_iter.bi_sector =3D blk_idx * (PAGE_SIZE >> 9); + bio->bi_private =3D req; + bio->bi_end_io =3D zram_async_read_endio; + + __bio_add_page(bio, page, PAGE_SIZE, 0); + bio_inc_remaining(parent); + submit_bio(bio); +} + +static void zram_sync_read(struct work_struct *w) +{ + struct zram_rb_req *req =3D container_of(w, struct zram_rb_req, work); struct bio_vec bv; struct bio bio; =20 - bio_init(&bio, zw->zram->bdev, &bv, 1, REQ_OP_READ); - bio.bi_iter.bi_sector =3D zw->entry * (PAGE_SIZE >> 9); - __bio_add_page(&bio, zw->page, PAGE_SIZE, 0); - zw->error =3D submit_bio_wait(&bio); + bio_init(&bio, req->zram->bdev, &bv, 1, REQ_OP_READ); + bio.bi_iter.bi_sector =3D req->blk_idx * (PAGE_SIZE >> 9); + __bio_add_page(&bio, req->page, PAGE_SIZE, 0); + req->error =3D submit_bio_wait(&bio); } =20 /* @@ -1338,39 +1482,42 @@ static void zram_sync_read(struct work_struct *work) * chained IO with parent IO in same context, it's a deadlock. To avoid th= at, * use a worker thread context. */ -static int read_from_bdev_sync(struct zram *zram, struct page *page, - unsigned long entry) +static int read_from_bdev_sync(struct zram *zram, struct page *page, u32 i= ndex, + unsigned long blk_idx) { - struct zram_work work; + struct zram_rb_req req; =20 - work.page =3D page; - work.zram =3D zram; - work.entry =3D entry; + req.page =3D page; + req.zram =3D zram; + req.blk_idx =3D blk_idx; =20 - INIT_WORK_ONSTACK(&work.work, zram_sync_read); - queue_work(system_dfl_wq, &work.work); - flush_work(&work.work); - destroy_work_on_stack(&work.work); + INIT_WORK_ONSTACK(&req.work, zram_sync_read); + queue_work(system_dfl_wq, &req.work); + flush_work(&req.work); + destroy_work_on_stack(&req.work); =20 - return work.error; + if (req.error || zram->wb_compressed =3D=3D false) + return req.error; + + return decompress_bdev_page(zram, page, index); } =20 -static int read_from_bdev(struct zram *zram, struct page *page, - unsigned long entry, struct bio *parent) +static int read_from_bdev(struct zram *zram, struct page *page, u32 index, + unsigned long blk_idx, struct bio *parent) { atomic64_inc(&zram->stats.bd_reads); if (!parent) { if (WARN_ON_ONCE(!IS_ENABLED(ZRAM_PARTIAL_IO))) return -EIO; - return read_from_bdev_sync(zram, page, entry); + return read_from_bdev_sync(zram, page, index, blk_idx); } - read_from_bdev_async(zram, page, entry, parent); + read_from_bdev_async(zram, page, index, blk_idx, parent); return 0; } #else static inline void reset_bdev(struct zram *zram) {}; -static int read_from_bdev(struct zram *zram, struct page *page, - unsigned long entry, struct bio *parent) +static int read_from_bdev(struct zram *zram, struct page *page, u32 index, + unsigned long blk_idx, struct bio *parent) { return -EIO; } @@ -1977,12 +2124,37 @@ static int read_compressed_page(struct zram *zram, = struct page *page, u32 index) return ret; } =20 +#if defined CONFIG_ZRAM_WRITEBACK +static int read_from_zspool_raw(struct zram *zram, struct page *page, u32 = index) +{ + struct zcomp_strm *zstrm; + unsigned long handle; + unsigned int size; + void *src; + + handle =3D zram_get_handle(zram, index); + size =3D zram_get_obj_size(zram, index); + + /* + * We need to get stream just for ->local_copy buffer, in + * case if object spans two physical pages. No decompression + * takes place here, as we read raw compressed data. + */ + zstrm =3D zcomp_stream_get(zram->comps[ZRAM_PRIMARY_COMP]); + src =3D zs_obj_read_begin(zram->mem_pool, handle, zstrm->local_copy); + memcpy_to_page(page, 0, src, size); + zs_obj_read_end(zram->mem_pool, handle, src); + zcomp_stream_put(zstrm); + + return 0; +} +#endif + /* * 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) +static int read_from_zspool(struct zram *zram, struct page *page, u32 inde= x) { if (zram_test_flag(zram, index, ZRAM_SAME) || !zram_get_handle(zram, index)) @@ -2002,7 +2174,7 @@ static int zram_read_page(struct zram *zram, struct p= age *page, u32 index, zram_slot_lock(zram, index); if (!zram_test_flag(zram, index, ZRAM_WB)) { /* Slot should be locked through out the function call */ - ret =3D zram_read_from_zspool(zram, page, index); + ret =3D read_from_zspool(zram, page, index); zram_slot_unlock(zram, index); } else { unsigned long blk_idx =3D zram_get_handle(zram, index); @@ -2012,7 +2184,7 @@ static int zram_read_page(struct zram *zram, struct p= age *page, u32 index, * device. */ zram_slot_unlock(zram, index); - ret =3D read_from_bdev(zram, page, blk_idx, parent); + ret =3D read_from_bdev(zram, page, index, blk_idx, parent); } =20 /* Should NEVER happen. Return bio error if it does. */ @@ -2273,7 +2445,7 @@ static int recompress_slot(struct zram *zram, u32 ind= ex, struct page *page, if (comp_len_old < threshold) return 0; =20 - ret =3D zram_read_from_zspool(zram, page, index); + ret =3D read_from_zspool(zram, page, index); if (ret) return ret; =20 @@ -2960,6 +3132,7 @@ static int zram_add(void) init_rwsem(&zram->init_lock); #ifdef CONFIG_ZRAM_WRITEBACK zram->wb_batch_size =3D 32; + zram->wb_compressed =3D false; #endif =20 /* gendisk structure */ diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index c6d94501376c..72fdf66c78ab 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -128,6 +128,7 @@ struct zram { #ifdef CONFIG_ZRAM_WRITEBACK struct file *backing_dev; bool wb_limit_enable; + bool wb_compressed; u32 wb_batch_size; u64 bd_wb_limit; struct block_device *bdev; --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C99D3019A6 for ; Mon, 1 Dec 2025 09:48:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582494; cv=none; b=UrLWeEj8HdSZJkwXCsxjVEZQu6ajcSyGoVotsayVWDPTAUVBcVlfLVpEFtiSFnBhmTFGopJVHoCfxGmD9hxbmgkyfDQ0PwS55GiC5tCSpTBNBDEg5F6luHoXzAQtVxe5o0xvAevPTtcvDb27ghoLEY7fN/D0sYIavtn52j1wZTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582494; c=relaxed/simple; bh=pBIHL/+s3slAbUIkwhX3xs51RwCrZ2BcTqbC6s/6oF4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Iw2zqSmCTAP3PXnTXHcX2Ufy06mGkFpUJYoBHJ6Zj0XAm8O4btQBfvYxOanF9u1YgRCO4dcIJfDZlXn8rQ6trctHGAfJ2EE3dGEudncp+K8+I8dkUoUBoKd9zdJj3kZ5gRt92xvSHYD91dadmJgzi1Pz9GC32PCg2mVkbHiL1q8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=eACAm8yR; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="eACAm8yR" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-7bb3092e4d7so4026848b3a.0 for ; Mon, 01 Dec 2025 01:48:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582492; x=1765187292; darn=vger.kernel.org; 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=BqN6IsMp+xic4hsBD/TTSEY4e1QCsNoi7vBlxa2loK0=; b=eACAm8yRoPgEPZdvlasJxEfm1e1d0KxdJp4ceqjPQqEjBSMp3ZFyusLC7X9yFpwNBR OKvDo/N3y7LafNSKUVSmyGrhwepDtBE98Q4gR9JUv8xrE/hsrJecQxex8aBsaiCUlI7c 0OmIJ6rBAXQ3XW9GagYo5U70bR36dhtRPJB9o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582492; x=1765187292; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=BqN6IsMp+xic4hsBD/TTSEY4e1QCsNoi7vBlxa2loK0=; b=FoN2OgYGpvJXMCxYu9UH//hcxUG7KZVM0ehF7b0dPHJWowdfG9pDt8Cx2J/Gjh0sQ4 Rewb6n/xIv09g9J0t3D44IR+KnPklhKP5q7k8NKVYYosEKo2WV1w7YOuFmmXXaBpqfnz TQPWK8MtKO1fmATrv+2+dbLKliNZyhRpJ53EqNpK3vNN2FhDHNX+ES/MwX8d2XDFAJKh DIUYOw+R9wtfKlyAVWnQrB8R7+1vvIvx68Vk0RjYobWTzSNtooG/DoCEvTbi6NRBWbm9 XyUKuFguX6d3srjCVSGHgRV7hjSIrlU4ndwqTVnB4PAt9S6MHtfOn+g1Pu86teINBo8c BISQ== X-Forwarded-Encrypted: i=1; AJvYcCWcU7MKqoPVcOrQctMSbOh9K7XFiqVuJK5MyL7bwZipBsMacdFS2XDicoVMQntkPICfGR+8yX76Cqsg4nc=@vger.kernel.org X-Gm-Message-State: AOJu0YyAeF4gSTiTzMHfcSmBWhfOxBUk3t7hfaDGCBKsZq3547fENy8X Wg2SjPvEKEW+h47X1USipfHvvOzuSkCrv9iwjMdOGlSuIn5Jiw04WOTEVAXvM03TjA== X-Gm-Gg: ASbGnctCyk3l8IvuK7WuC9D9pmhSB0e2E7dnGG3enKQDA/CoGwJY+xL/CrpVQENJm5J 9DcWiTMBJGpxzMzfHDwTQebTrGvCZVN0A4IJW1tpMLgjL+ji6VyQzBO+cnp9vZzADfMk7oEcU+V kCrOTLEhNpCn81C7KW1al2QxoeN20z+JChqhETnWFOm02cvfBvuqwpOlCwxxtOsHID4HWTdcKF/ t+lv4/ngw9Fjfs8XFH3BosRFSmymNQcRz01IU4onaJqlmftnZN6TlBhn8xGcoXHSGaFsQ123WIf 7v3O9Gb4dXCjDgBje8fsmdhTYuia4uN4d8WwavNvOnadxWPzt/SQFvYoG1vdMLS/Kg7xAIThHcc oLXcXcImWdh6ZzBMCvSgA4e1YBe1/0X9B5LkDRJxsRoz8zjdJCmGQU1bZZu4FpJyn78dJpVFVrj EPyki7bd8n1KayxKGBmnj4zBBMNi8k47fWURIw5IDSIDo60x0V1DbUPXpjuXVatUQTeMHVHr/zn g== X-Google-Smtp-Source: AGHT+IFPOKXBPxIWlb2N5bOWQcJ4Qpt2yM3sF83+3IIpZZQ0LRK1r32xVMYgoCct611DyaOc2sndNw== X-Received: by 2002:a05:6a20:9184:b0:340:d065:c8b3 with SMTP id adf61e73a8af0-3614ed971edmr40400894637.36.1764582491688; Mon, 01 Dec 2025 01:48:11 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:11 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 2/7] zram: introduce writeback_compressed device attribute Date: Mon, 1 Dec 2025 18:47:49 +0900 Message-ID: <20251201094754.4149975-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Richard Chang Introduce witeback_compressed device attribute to toggle compressed writeback (decompression on demand) feature. [senozhatsky: rewrote original patch, added documentation] Signed-off-by: Richard Chang Co-developed-by: Sergey Senozhatsky --- Documentation/ABI/testing/sysfs-block-zram | 7 ++++ Documentation/admin-guide/blockdev/zram.rst | 13 +++++++ drivers/block/zram/zram_drv.c | 38 +++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-block-zram b/Documentation/ABI= /testing/sysfs-block-zram index 36c57de0a10a..ed10c2e4b5c2 100644 --- a/Documentation/ABI/testing/sysfs-block-zram +++ b/Documentation/ABI/testing/sysfs-block-zram @@ -150,3 +150,10 @@ Contact: Sergey Senozhatsky Description: The algorithm_params file is write-only and is used to setup compression algorithm parameters. + +What: /sys/block/zram/writeback_compressed +Date: Decemeber 2025 +Contact: Richard Chang +Description: + The writeback_compressed device atrribute toggles compressed + writeback feature. diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 3e273c1bb749..9547e4e95979 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -214,6 +214,7 @@ mem_limit WO specifies the maximum amount of m= emory ZRAM can writeback_limit WO specifies the maximum amount of write IO zram can write out to backing device as 4KB unit writeback_limit_enable RW show and set writeback_limit feature +writeback_compressed RW show and set compressed writeback feature comp_algorithm RW show and change the compression algorithm algorithm_params WO setup compression algorithm parameters compact WO trigger memory compaction @@ -434,6 +435,18 @@ system reboot, echo 1 > /sys/block/zramX/reset) so kee= ping how many of writeback happened until you reset the zram to allocate extra writeback budget in next setting is user's job. =20 +By default zram stores written back pages in decompressed (raw) form, which +means that writeback operation involves decompression of the page before +writing it to the backing device. This behavior can be changed by enabling +`writeback_compressed` feature, which causes zram to write compressed pages +to the backing device, thus avoiding decompression overhead. To enable +this feature, execute:: + + $ echo yes > /sys/block/zramX/writeback_compressed + +Note that this feature should be configured before the `zramX` device is +initialized. + If admin wants to measure writeback count in a certain period, they could know it via /sys/block/zram0/bd_stat's 3rd column. =20 diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 6263d300312e..3cc03c3f7389 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -539,6 +539,42 @@ struct zram_rb_req { u32 index; }; =20 +static ssize_t writeback_compressed_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct zram *zram =3D dev_to_zram(dev); + bool val; + + if (kstrtobool(buf, &val)) + return -EINVAL; + + down_write(&zram->init_lock); + if (init_done(zram)) { + up_write(&zram->init_lock); + return -EBUSY; + } + + zram->wb_compressed =3D val; + up_write(&zram->init_lock); + + return len; +} + +static ssize_t writeback_compressed_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + bool val; + struct zram *zram =3D dev_to_zram(dev); + + down_read(&zram->init_lock); + val =3D zram->wb_compressed; + up_read(&zram->init_lock); + + return sysfs_emit(buf, "%d\n", val); +} + static ssize_t writeback_limit_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) @@ -3048,6 +3084,7 @@ static DEVICE_ATTR_WO(writeback); static DEVICE_ATTR_RW(writeback_limit); static DEVICE_ATTR_RW(writeback_limit_enable); static DEVICE_ATTR_RW(writeback_batch_size); +static DEVICE_ATTR_RW(writeback_compressed); #endif #ifdef CONFIG_ZRAM_MULTI_COMP static DEVICE_ATTR_RW(recomp_algorithm); @@ -3070,6 +3107,7 @@ static struct attribute *zram_disk_attrs[] =3D { &dev_attr_writeback_limit.attr, &dev_attr_writeback_limit_enable.attr, &dev_attr_writeback_batch_size.attr, + &dev_attr_writeback_compressed.attr, #endif &dev_attr_io_stat.attr, &dev_attr_mm_stat.attr, --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0B6D3019C3 for ; Mon, 1 Dec 2025 09:48:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582496; cv=none; b=KjwfM1tWuJzRjEPKOfcRW8TEmk3DJYpzDNzsmmpRKB8jX+M1DgOuEJ6bmqnA9gtAZ+cE1wsTq4VOwvbml3dIE5XU25gaMataLptB9KdDR5l6Igw3NJHXYAGYVmr7OaNGSYvKIcp5o+jquaI6juMf0/73MonHbp6dVzIDvHS5q7E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582496; c=relaxed/simple; bh=fhPPnuNbDyoEke+x2rMjuYapNn/Kl3pDEdUNL8/gOpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EQjZRjI96A2UFrzNax6Jzg0nlzAfCm5BRy7trYAOjXb2jnC//4DxDXQC7KVJLKAlcc74y7Q5QBLZVysJpVp6tv9+zWAB9zLf3LclRsxWdh2TLgaMACk7fu3zrPo8NPBOppDvfwHh9++2VjTplE21GUC/Xvlrch95J18krtIFehY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=HYMayj4n; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="HYMayj4n" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-7aae5f2633dso4730326b3a.3 for ; Mon, 01 Dec 2025 01:48:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582494; x=1765187294; darn=vger.kernel.org; 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=ft2UmGA5efiA6Tnkdeu/pt2sAJb70nd3fcBnsirWxOw=; b=HYMayj4nVLxROdgZHB0EsVR2TRUEb1RrBAjeyZr1O5IZCCbCbV031hbKg1yBJdjXWx GSyK7SyqiQZlns3aJMqwLb5onsI+AAR7LLSC2I1sc1srVOxp/UCxrU0C524sULBvKeM/ 398SvwRlprK0KQsJq+DmDS7gq3K1O4NN/FpL0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582494; x=1765187294; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ft2UmGA5efiA6Tnkdeu/pt2sAJb70nd3fcBnsirWxOw=; b=CHyl3I8BbbDUECIh/1ND9iJtB275/9dedVlhCmTqV5flFAZvJNDmtOxsYlg1UlFHwz eWWQKwdo3ErBUUzqqikBJ3YGopyKlV2n7b1ymKwcTi/jAx/BIvIkNSsQu8JwTLqCTot2 siXJf2iAbLu2caoGrVOGvzp7SypJAd9LEQk5jFkhSi8Cu49TMVtRV0dOw34/GuZZrwgw cwNS0RXED1brjzPmULO0nNjfDHMQWYVk9IBAVpx0V3x13pQFA6KyKVNneNwZpVdjEj57 rSkLz+q4rww5jILpL6H//FS6aZ9MHUxelAVVxcDUoBCfVSf+n92RjlGJ/alxcnUGEpE7 dBqQ== X-Forwarded-Encrypted: i=1; AJvYcCWs9va2KEPMqNxuQxxuBOp7521lkMgmq4hE4hvREfgsUCdTyhprfBfsoX+vijlOVOVG2Tpj8jXYbnUyZmY=@vger.kernel.org X-Gm-Message-State: AOJu0Yyv//WF6OMG+ZzqDM+KkLfo1mvUjiEZkVd6EPYP2StLkJvXfqUN Iuf37je6xO2yJndpq1nLl3SyixDAGelEZWXbf2N/99TjMhETj948yVR6+k9rgrHIkw== X-Gm-Gg: ASbGncsogfUGAnvLONtaZCuofUg70Q8cOPSNTO6L9ljrdWB2Cu5t1N7jN4yTL7sSiDD 9ayA878K/X2KxGFRyoqfVcOgpJL7d6v2RYbZox/+6pUy+bkChdDZG6/ybTB/j63HdI2T6BeatX8 +6E6A75e2sic1EowZo5TtTAiHWfaU1eJ7enYawKtwcC7PYXzu6bqZqXiHNHkkvbk0GqwlNRP4Rz aL1rXs1grJ+1k52uRpIqNRGL3d0On0VsfaHTVi5OJsgYkr0uC9gn6FWgmn8awOYF0XtG3pdGqfH HJH08zl+dMDJFwDspVW8/oQ/604x8EIexr68eISfLfJjc4hFXinyPCR7tY7yMwpn3ifu9pnh99R QJK1OdjEdp7aA9rTNBu7pCUaovA1do7l+sFPJVw7wFDi5F/V/frWhEIybrdIUtF3L1lpz0ckx4d 3XNjdjTfLNOi7Ny+RwjkAjnahLCdjsRGV603w3uqy0n4t8iE9SWAtJChGqf33MsW6hlU1fkGpK/ Q== X-Google-Smtp-Source: AGHT+IFr8VXpbsnicegVCTPVhcS5UEK7jUpu+3p79wdFmEMCIo/SsUZlSBzDwoKUtRp+pBy2lth03Q== X-Received: by 2002:a05:6a20:7288:b0:361:3bec:fe28 with SMTP id adf61e73a8af0-3614ed96c9amr43808576637.37.1764582494151; Mon, 01 Dec 2025 01:48:14 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:13 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 3/7] zram: document writeback_batch_size Date: Mon, 1 Dec 2025 18:47:50 +0900 Message-ID: <20251201094754.4149975-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add missing writeback_batch_size documentation. Signed-off-by: Sergey Senozhatsky --- Documentation/ABI/testing/sysfs-block-zram | 7 +++++++ Documentation/admin-guide/blockdev/zram.rst | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-block-zram b/Documentation/ABI= /testing/sysfs-block-zram index ed10c2e4b5c2..e538d4850d61 100644 --- a/Documentation/ABI/testing/sysfs-block-zram +++ b/Documentation/ABI/testing/sysfs-block-zram @@ -157,3 +157,10 @@ Contact: Richard Chang Description: The writeback_compressed device atrribute toggles compressed writeback feature. + +What: /sys/block/zram/writeback_batch_size +Date: November 2025 +Contact: Sergey Senozhatsky +Description: + The writeback_batch_size device atrribute sets the maximum + number of in-flight writeback operations. diff --git a/Documentation/admin-guide/blockdev/zram.rst b/Documentation/ad= min-guide/blockdev/zram.rst index 9547e4e95979..94bb7f2245ee 100644 --- a/Documentation/admin-guide/blockdev/zram.rst +++ b/Documentation/admin-guide/blockdev/zram.rst @@ -214,6 +214,8 @@ mem_limit WO specifies the maximum amount of m= emory ZRAM can writeback_limit WO specifies the maximum amount of write IO zram can write out to backing device as 4KB unit writeback_limit_enable RW show and set writeback_limit feature +writeback_batch_size RW show and set maximum number of in-flight + writeback operations writeback_compressed RW show and set compressed writeback feature comp_algorithm RW show and change the compression algorithm algorithm_params WO setup compression algorithm parameters @@ -223,7 +225,6 @@ backing_dev RW set up backend storage for zram to wr= ite out idle WO mark allocated slot as idle =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D= =3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D =20 - User space is advised to use the following files to read the device statis= tics. =20 File /sys/block/zram/stat @@ -447,6 +448,14 @@ this feature, execute:: Note that this feature should be configured before the `zramX` device is initialized. =20 +Depending on backing device storage type, writeback operation may benefit +from a higher number of in-flight write requests (batched writes). The +number of maximum in-flight writeback operations can be configured via +`writeback_batch_size` attribute. To change the default value (which is 3= 2), +execute:: + + $ echo 64 > /sys/block/zramX/writeback_batch_size + If admin wants to measure writeback count in a certain period, they could know it via /sys/block/zram0/bd_stat's 3rd column. =20 --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B430302174 for ; Mon, 1 Dec 2025 09:48:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582499; cv=none; b=tRyvupgYGLKVTWnut9MXiXb53RG4uNB+8z2j5MWb8sQckVb5h3utVSl9bzYqbuQJK7VPCZU06zy3sVlsN/j1weD8gBA50xGuxj4maZknHbCm77nJB9QSuIcGcgyXkUpn7vN1/NpIAmhFRPtbHY7wifkHglC2gPzPbCIkcfhagR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582499; c=relaxed/simple; bh=+u6s6RCpy6sbmxn7iBizLf84Ie3MOO3BbWEG6PneCSE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VoX7OpeWunJzNKYhFeOu0NIU5rCbRkTiE9wt25TyLnKrYchVu3k2irvCX50etG82RD+B0KFaooupFB98rqyM1M2QvxazatqFuuP5/PdF1feJBTldZgXzlVFXI0f/dNzjynogMTv0+7pqtZYj6h6Z/OSQ00bjSBpVKSp+lt4OXII= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=DKgnL+nd; arc=none smtp.client-ip=209.85.210.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="DKgnL+nd" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-7b8eff36e3bso6409082b3a.2 for ; Mon, 01 Dec 2025 01:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582497; x=1765187297; darn=vger.kernel.org; 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=MFPCMT/DEG4vuNOqo+8qbFXraYHdGAlN+ITtNxeLbtw=; b=DKgnL+ndPxIf6emX0DmB9c8+C/C0FtPgfrHrI14urFloeYecc6SDINhZL7xKyMJcyj mrLloHHibcDXNu4WUetBndgF239ASFS6HqMrlnwr7eMKngvn89b3PXQUurHaZMPPYlKW LdoBvD1S0X2GhQPOijkaQHl0Jjy2fTwf9Z6AU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582497; x=1765187297; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MFPCMT/DEG4vuNOqo+8qbFXraYHdGAlN+ITtNxeLbtw=; b=GGAYOLwfDC9pRFtdUe8NTj05U5ioTcO95IaVvMS7ci+WCzL5bWlGE0eIr5bR76qvO4 +0pvdaq52RsGc+i9ai3cv75+3f2s8wBKYjg1xl1QJ25JC3MwuwaBjX46DPUUeC7ahaIO X5nvMOaQ76Dhyt3c4Y/X+n+OT1KFCbdOwXhZGicKK1SZ7jMZ7Qw0B/YGay/UgcZFbopN m0RsWFriVoUn9COnJ30twrHI15uJqeCUMWotnwtFb1wGatN1R5FMOL6quYBRs9AAKW3M cHaYsJP2P1BZBQ8oDgF3QIlrSU0BQ4Ft7JWBdsl9AuH+iYE8lAPU15+FvCq1sFkbX550 T3NQ== X-Forwarded-Encrypted: i=1; AJvYcCVGZr9fEEUyFk+JI0xBGbzm9xMJ+HRmrqgXyLkZNgPSqNm6ibTLx7RtWg1Uw/ce7inJghmEqtrh8FGxCHE=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/PHQeu6o7X1hT2fHjZywtPDATlQ5l6QGBcHN1gAChEPysgVr8 FwV5Zbw8zMQ6S6Ut3ZY8iZ/W+P+MWvR79iP3Hkp8mG+nx9vFnxrCZsqgWpbSB6hchg== X-Gm-Gg: ASbGncvk0Z9MhzRjnR2P8Et0JtTLPN+FUp8e0DOxJPK88FlQ+Mw1X6KyCM74Odn8Fxt fzNBhfdru2Rm4sK3QV/55sMSlH9LIUK8ZDCGenEn7+l38uSIrJktnyjujbEhZ/8sXAtYmBgqljG TtpSIFXnO0bkf95EF7RJZfwzjcD1PggbU1l8ZJU01GsoFHKmQaQGySCniTM38/Rdgdsn4/h5Dia UA/YH4weYpBqA54k1bND8okr+LzrLGtw1v54qkc9ZXSJQx7tMwZy4WEvLQcEiar1PUZ6VO14Ydy KhFRfR4VTq4XweA4dJx+Wxuj87KZBMWFM/5r8GL/GQ71kEzQlo8GHLuwpv7ehfmeJeZUieYgFXc uj7ryWwiqraW7vvv1hR4Uh5WghhNb+mbjuR9/Ku6tjp9tEABYvfitPnDQ9u5H14BWHtqzJdabzw 4xvq7f4ceIfG2K76Kq7qyToelZVVrJz8hLwQSRnKPoh4bAy6W31HskQQrmkyXWFZwph1GfBczyP A== X-Google-Smtp-Source: AGHT+IFlrnHAUO0MwvM1aa8kkuCDrVgQUWK4lsCQPDK031ojL9Sillo7MDoVjBI+gYL8H8kP47VqCA== X-Received: by 2002:a05:6a00:4b4d:b0:7a2:7a93:f8c9 with SMTP id d2e1a72fcca58-7ca89a6c1d3mr23814778b3a.27.1764582496654; Mon, 01 Dec 2025 01:48:16 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:16 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 4/7] zram: move bd_stat to writeback section Date: Mon, 1 Dec 2025 18:47:51 +0900 Message-ID: <20251201094754.4149975-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move bd_stat function and attribute declaration to existing CONFIG_WRITEBACK ifdef-sections. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 48 +++++++++++++++-------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 3cc03c3f7389..1a0f550219b1 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -539,6 +539,24 @@ struct zram_rb_req { u32 index; }; =20 +#define FOUR_K(x) ((x) * (1 << (PAGE_SHIFT - 12))) +static ssize_t bd_stat_show(struct device *dev, struct device_attribute *a= ttr, + char *buf) +{ + struct zram *zram =3D dev_to_zram(dev); + ssize_t ret; + + down_read(&zram->init_lock); + ret =3D sysfs_emit(buf, + "%8llu %8llu %8llu\n", + FOUR_K((u64)atomic64_read(&zram->stats.bd_count)), + FOUR_K((u64)atomic64_read(&zram->stats.bd_reads)), + FOUR_K((u64)atomic64_read(&zram->stats.bd_writes))); + up_read(&zram->init_lock); + + return ret; +} + static ssize_t writeback_compressed_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) @@ -1976,28 +1994,8 @@ static ssize_t mm_stat_show(struct device *dev, return ret; } =20 -#ifdef CONFIG_ZRAM_WRITEBACK -#define FOUR_K(x) ((x) * (1 << (PAGE_SHIFT - 12))) -static ssize_t bd_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct zram *zram =3D dev_to_zram(dev); - ssize_t ret; - - down_read(&zram->init_lock); - ret =3D sysfs_emit(buf, - "%8llu %8llu %8llu\n", - FOUR_K((u64)atomic64_read(&zram->stats.bd_count)), - FOUR_K((u64)atomic64_read(&zram->stats.bd_reads)), - FOUR_K((u64)atomic64_read(&zram->stats.bd_writes))); - up_read(&zram->init_lock); - - return ret; -} -#endif - static ssize_t debug_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { int version =3D 1; struct zram *zram =3D dev_to_zram(dev); @@ -2015,9 +2013,6 @@ static ssize_t debug_stat_show(struct device *dev, =20 static DEVICE_ATTR_RO(io_stat); static DEVICE_ATTR_RO(mm_stat); -#ifdef CONFIG_ZRAM_WRITEBACK -static DEVICE_ATTR_RO(bd_stat); -#endif static DEVICE_ATTR_RO(debug_stat); =20 static void zram_meta_free(struct zram *zram, u64 disksize) @@ -3079,6 +3074,7 @@ static DEVICE_ATTR_WO(mem_used_max); static DEVICE_ATTR_WO(idle); static DEVICE_ATTR_RW(comp_algorithm); #ifdef CONFIG_ZRAM_WRITEBACK +static DEVICE_ATTR_RO(bd_stat); static DEVICE_ATTR_RW(backing_dev); static DEVICE_ATTR_WO(writeback); static DEVICE_ATTR_RW(writeback_limit); @@ -3102,6 +3098,7 @@ static struct attribute *zram_disk_attrs[] =3D { &dev_attr_idle.attr, &dev_attr_comp_algorithm.attr, #ifdef CONFIG_ZRAM_WRITEBACK + &dev_attr_bd_stat.attr, &dev_attr_backing_dev.attr, &dev_attr_writeback.attr, &dev_attr_writeback_limit.attr, @@ -3111,9 +3108,6 @@ static struct attribute *zram_disk_attrs[] =3D { #endif &dev_attr_io_stat.attr, &dev_attr_mm_stat.attr, -#ifdef CONFIG_ZRAM_WRITEBACK - &dev_attr_bd_stat.attr, -#endif &dev_attr_debug_stat.attr, #ifdef CONFIG_ZRAM_MULTI_COMP &dev_attr_recomp_algorithm.attr, --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA52F302CB0 for ; Mon, 1 Dec 2025 09:48:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582501; cv=none; b=cAQ23YX9qcfn1CsCM2PF0jV79ShvDE99GNwmsxZzzT8AMxq5gRQywRjeb9e2NyvLE5z/QDOuUH2hTggF7NOaT5CP0f4lGM2BJMBYfl0qzd2d7Io4TbMXHlqmbmi6nzyKkI9PbGC2rV3wwqUKrSJAJ+sPXv7ujYmJEu9zQgvnx4E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582501; c=relaxed/simple; bh=xlsl7fcFBFTHsBmJdkpI7L599I938927GYF6kB/g+60=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tH9oGstPbmEc9pl+nvkOet1KQb6tGk0555RtFLnBoh5OpzHlTio98tdrtIgGidL3HHw41sxgM96vLqGReMCA4PzuVw4lSBsUfLdcxFnMSXwW8CaYnIf5z80NPFACoeB5KFjCSd0iVCyM50AahWe318JZKYn1PpbDV68bz+gwucM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=KCSo5w5p; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="KCSo5w5p" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-7aab061e7cbso4553023b3a.1 for ; Mon, 01 Dec 2025 01:48:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582499; x=1765187299; darn=vger.kernel.org; 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=906KZFo6t+2ci7ZTeYqhBL02BUrFYEeLcrZCiOSXlDQ=; b=KCSo5w5p2+5E3ePWRmV71XYVhEewvQuAx/iLkMdWYQNSUz4aNScRPUTkxAWUikgybT Fh9Jftr1BNnWJJctiNkIbJEJMedKjLviwz8Yhuq62nTAmdvevwin3DIYFZgwQdsfZore 2nol+eiPeGBUzAUFF5SRgBcj++wXVlqe60YWQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582499; x=1765187299; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=906KZFo6t+2ci7ZTeYqhBL02BUrFYEeLcrZCiOSXlDQ=; b=EQ4X/2NXl4ZOtBVUgIpFdGy+dYRJmR55A4WnTf3tHJHOPtswuI0ueTCp+WxnRJO+Vr RkpuHWc85uhVIEj/5jZ1M+ZgNA16e1n/R6hT4ni71OKRtL2rqaVwGSrWWtW8czc15EcF 2fY+f1hxqivULLdasiwtor+Gsjjq0S4uzQ69mma+V9mGNjS0LY72N0Ilz/R4EDl4oLpC tdRZJdA483o5gixcwihvPf7Jmbc6iZx0laqN9e9/D9hAy9WcrgYMM1mbEUvGuq2H/ZUX mpD5nWiUBfSt0diedywZTjcYqUrwDcwurFhQ58mnTpS6EYwrQGGmwjimI6cMK5Rv7yQz R0jQ== X-Forwarded-Encrypted: i=1; AJvYcCW93pWayDPf5JW7tdPZ2H6id9TqE0Nya/YXR7wXOmy23wbhR8zRBolfo9itvHcNLCRzFymq5kwizmCu/ys=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9S6buFEjpqrdB3IhQEvI2KfXYD3aXAkrl8qboP9LU0VfkSV6G ZB8XC9/y/0R5yyT3peENrnAkMutQ+9mRopiT9tM+CpGjcUXTHIq9eSTHOfJvHOUvMA== X-Gm-Gg: ASbGnctVAb3hqR/B2g7aejSIjXa91ilkLsHXNwt6k6iE2UQ74Lhc+tyzJ2frNYse610 l+6pVaUGqv+JgHh5lezPxJP27607V2w2qZutsw2zyzSprysDTn7LKWAxZT1wMOY9OQdKz3H7ZcP 3NkfThubZohnZpxg/r/v9TngThRE/+MutOM//+pQaINO+zv9wdGpl/PTT57cOhxqmBFppyYsTMk bpsz1hlvHm4ScFDWiu+dmU/dP1YyZP6Thl2r6keoNYCa/1kSAUZfuSUblRF28uh5B8GMh+xDkUg 4DaZ4dh6vAJcu56gNckLt/gft4J5GRVSlU15Zm8eNCJn/VyocNwF84+SmtlT/o34gyZj+uE7vn8 IC8r3iXTnLsu6Erd+3iOZtR1TQrasDGRPWq6zyhfLJaqPfjJCAfNEbkDB4aj/r4Mngolb1grRYy NFjdhOPuLQFnDp8CywlGq82da8XqyjLQMu+uJWO8ELQoo3GxWL9wHdYbJc1sOFVYXsvAAm5aKb2 Q== X-Google-Smtp-Source: AGHT+IG5hlJsokfKmtpNDiN4BN25b26b4ht4eT8qU8v1pYMGVVntb+93khKGuBzf5xFszcfk+RGLmg== X-Received: by 2002:a05:6a00:9508:b0:7aa:9ca5:da9c with SMTP id d2e1a72fcca58-7c58e50cc8dmr37751171b3a.22.1764582499116; Mon, 01 Dec 2025 01:48:19 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:18 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 5/7] zram: rename zram_free_page() Date: Mon, 1 Dec 2025 18:47:52 +0900 Message-ID: <20251201094754.4149975-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We don't free page in zram_free_page(), not all slots even have any memory associated with them (e.g. ZRAM_SAME). We free the slot (or reset it), rename the function accordingly. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 1a0f550219b1..615756d5d05d 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -56,7 +56,7 @@ static size_t huge_class_size; =20 static const struct block_device_operations zram_devops; =20 -static void zram_free_page(struct zram *zram, size_t index); +static void zram_slot_free(struct zram *zram, u32 index); #define slot_dep_map(zram, index) (&(zram)->table[(index)].dep_map) =20 static void zram_slot_lock_init(struct zram *zram, u32 index) @@ -984,7 +984,7 @@ static int zram_writeback_complete(struct zram *zram, s= truct zram_wb_req *req) huge =3D zram_test_flag(zram, index, ZRAM_HUGE); } =20 - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_set_flag(zram, index, ZRAM_WB); zram_set_handle(zram, index, req->blk_idx); =20 @@ -2025,7 +2025,7 @@ static void zram_meta_free(struct zram *zram, u64 dis= ksize) =20 /* Free all pages that are still in this zram device */ for (index =3D 0; index < num_pages; index++) - zram_free_page(zram, index); + zram_slot_free(zram, index); =20 zs_destroy_pool(zram->mem_pool); vfree(zram->table); @@ -2057,7 +2057,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 di= sksize) return true; } =20 -static void zram_free_page(struct zram *zram, size_t index) +static void zram_slot_free(struct zram *zram, u32 index) { unsigned long handle; =20 @@ -2256,7 +2256,7 @@ static int write_same_filled_page(struct zram *zram, = unsigned long fill, u32 index) { zram_slot_lock(zram, index); - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_set_flag(zram, index, ZRAM_SAME); zram_set_handle(zram, index, fill); zram_slot_unlock(zram, index); @@ -2294,7 +2294,7 @@ static int write_incompressible_page(struct zram *zra= m, struct page *page, kunmap_local(src); =20 zram_slot_lock(zram, index); - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_set_flag(zram, index, ZRAM_HUGE); zram_set_handle(zram, index, handle); zram_set_obj_size(zram, index, PAGE_SIZE); @@ -2359,7 +2359,7 @@ static int zram_write_page(struct zram *zram, struct = page *page, u32 index) zcomp_stream_put(zstrm); =20 zram_slot_lock(zram, index); - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_set_handle(zram, index, handle); zram_set_obj_size(zram, index, comp_len); zram_slot_unlock(zram, index); @@ -2581,7 +2581,7 @@ static int recompress_slot(struct zram *zram, u32 ind= ex, struct page *page, zs_obj_write(zram->mem_pool, handle_new, zstrm->buffer, comp_len_new); zcomp_stream_put(zstrm); =20 - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_set_handle(zram, index, handle_new); zram_set_obj_size(zram, index, comp_len_new); zram_set_priority(zram, index, prio); @@ -2784,7 +2784,7 @@ static void zram_bio_discard(struct zram *zram, struc= t bio *bio) =20 while (n >=3D PAGE_SIZE) { zram_slot_lock(zram, index); - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_slot_unlock(zram, index); atomic64_inc(&zram->stats.notify_free); index++; @@ -2892,7 +2892,7 @@ static void zram_slot_free_notify(struct block_device= *bdev, return; } =20 - zram_free_page(zram, index); + zram_slot_free(zram, index); zram_slot_unlock(zram, index); } =20 --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A10D303A05 for ; Mon, 1 Dec 2025 09:48:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582504; cv=none; b=ee/TS4xsFQKPmYQTb5zAU8eThu8d8kXvIMDmEPIoVjOo+G8XviqPdwygeaMyv8Pt90nJ2jvcoM1q/LSGHw7UgOZPPzZL4iUnVdNpFchAf6XonEtwVrDf5qNsnhpLhGnteJR23qTVsBi3LgMgGGF3NsMKccOJ80WvhemROxJ9Gus= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582504; c=relaxed/simple; bh=7qXCIDHqdgT7FPIU+RTEhnoX8AnbNjyKtf1fzEG+vFs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KPipLsGvgUoqXo59j4XMoxQMl5CUZRI8mZBIcznWmFKwkSVZ201+equ1OsLq1sK/GBj3ppxjcfogNhWnIIef2E0mujTUGXcLWlDKUMy/qB/PTcrho50hcGUnIp+2HOgCI8og4HC2vyHmUdEEuiAuYRkIiaNKKb1NyDPYG4PDRsY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=AD1YMpiO; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="AD1YMpiO" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2984dfae043so33426205ad.0 for ; Mon, 01 Dec 2025 01:48:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582502; x=1765187302; darn=vger.kernel.org; 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=zGGQx+qOtLfeHotYgQob13a3keDky1EvwEknMJtybJQ=; b=AD1YMpiOpTBHKpsFrRdqcU2X+66TymC1/+F0xybNqEifYrttALOk0o8efGPGjrjOaP LW23dQjxiw3TPRrdnjz5F1t1/05gAe+79Ggdq8/qLcO7k2zrTeeBzeLM/JfwlHrzleZb m/ySsS2Ob3eM9LDoVJhfaOWzOTyG/drfV7Zuo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582502; x=1765187302; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zGGQx+qOtLfeHotYgQob13a3keDky1EvwEknMJtybJQ=; b=aaQE9V3qSQtNJmvfUFM7ECxEC5a9ny4Lo0A99J0ti8/9CdU1yRkxZH8gmatlS9Bg/z bzsC4GZzhv4tDDMkAP5y74duxYuJz9bjS93gixWAh4juBk6j8PBl4WtST5nHGlcb28GA G00HoSjJxIa3mbMf1bavtgIsg9p5OVrZLS1a/YFysx3Aoz0HbWPd/PVCJZupJCggFPyE +W/Wmq9iDT3K17BUMhdYTtnukeqDfOz3jUFVXXZO7yaLI+dy77KLjelU5r6/BAGbxvTj zfF5Zi4kAgr0T/EtgIkUiGG+FqVeMoTiZHievsmZjzF3Ck3Udi85nS3ASHcouNGHdayC dlLQ== X-Forwarded-Encrypted: i=1; AJvYcCWFu3HxvBWykT5apOTrgiCE2ldgGw99UgqWA1PYjM3a5NUX9AohHXFzBum7LERK10kKciAagY1SzphrqYQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8OWeoXgdZIpNzuPX3leUBnz4F10bVZdb5Ry4WeRnupTS4TRqF DELC1zBOQgna9NV5KEAvn9lVkw9Ki5oKODAxOW5gDsC6FFXuZGm5zhG24KwdzGY57hC5EYNt6JQ Mk8w= X-Gm-Gg: ASbGncsjbuCYyA9A6zOaI8FHnmzc0X2L2dFFHNvLuEwQktTeQHcdC2Y5+/1bmUVZsBq MBDaUBJG+3i499aYe7kkXbxdXxM50Whi9TZ97xJ9QXaVpCsISE5eTjRKt7EVpdMIZVQ6TQRvHOd NDd8phelQoQ10C9qhJYNauh73EYLKnuNeKqEnqMwW4OplLyLDauGCmawE3bw6kRDwzBuh0n+Gf2 wgGDR66xG8hNB8n/JDUTNlwi6fwJeFedAu1D7Kqj6wfcFNpuJQSOEA/lCXKDGSLeXhWg+S6XNXu ML4xqaDeXMhMSF8wt3vV1y9ZP2pp6vQthj43qVFr4X9vbQwKE1lFvZP3lnTuInJLDWqJKvD1cYP aEQd60mN/wKH+p9B3vmJ+PUQWtZZBJvEFmdeoiCeiqo6XsaV5/CHHsRhNkwRYAQBfGc5IbEWvmK kwiOlEtAjEeQLHaQg6CWyV+x1S0SD2BALJlFIQYOGlqN49fsgT+Kjl2xGkVtaCPci4suE7BxrKM w== X-Google-Smtp-Source: AGHT+IEzr1LmXf2akybR4rLvRjsBVPFFnsEwkrcH3PNwkg+h/J6THTd6DV4nubMDanWdKz8r84hW/Q== X-Received: by 2002:a17:90b:17d2:b0:32e:1b1c:f8b8 with SMTP id 98e67ed59e1d1-34733f49b25mr41314766a91.26.1764582501612; Mon, 01 Dec 2025 01:48:21 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:21 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 6/7] zram: switch to guard() for init_lock Date: Mon, 1 Dec 2025 18:47:53 +0900 Message-ID: <20251201094754.4149975-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use init_lock guard() in sysfs store/show handlers, in order to simplify and, more importantly, to modernize the code. While at it, fix up more coding styles. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 211 +++++++++++++--------------------- 1 file changed, 77 insertions(+), 134 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 615756d5d05d..4b8a26c60539 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -360,15 +360,14 @@ static bool page_same_filled(void *ptr, unsigned long= *element) return true; } =20 -static ssize_t initstate_show(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t initstate_show(struct device *dev, struct device_attribute = *attr, + char *buf) { u32 val; struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); val =3D init_done(zram); - up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%u\n", val); } @@ -382,7 +381,8 @@ static ssize_t disksize_show(struct device *dev, } =20 static ssize_t mem_limit_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) + struct device_attribute *attr, const char *buf, + size_t len) { u64 limit; char *tmp; @@ -392,15 +392,15 @@ static ssize_t mem_limit_store(struct device *dev, if (buf =3D=3D tmp) /* no chars parsed, invalid input */ return -EINVAL; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); zram->limit_pages =3D PAGE_ALIGN(limit) >> PAGE_SHIFT; - up_write(&zram->init_lock); =20 return len; } =20 static ssize_t mem_used_max_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 err; unsigned long val; @@ -410,12 +410,11 @@ static ssize_t mem_used_max_store(struct device *dev, if (err || val !=3D 0) return -EINVAL; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); if (init_done(zram)) { atomic_long_set(&zram->stats.max_used_pages, zs_get_total_pages(zram->mem_pool)); } - up_read(&zram->init_lock); =20 return len; } @@ -458,12 +457,11 @@ static void mark_idle(struct zram *zram, ktime_t cuto= ff) } } =20 -static ssize_t idle_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static ssize_t idle_store(struct device *dev, struct device_attribute *att= r, + const char *buf, size_t len) { struct zram *zram =3D dev_to_zram(dev); ktime_t cutoff_time =3D 0; - ssize_t rv =3D -EINVAL; =20 if (!sysfs_streq(buf, "all")) { /* @@ -476,24 +474,19 @@ static ssize_t idle_store(struct device *dev, cutoff_time =3D ktime_sub(ktime_get_boottime(), ns_to_ktime(age_sec * NSEC_PER_SEC)); else - goto out; + return -EINVAL; } =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); if (!init_done(zram)) - goto out_unlock; + return -EINVAL; =20 /* * A cutoff_time of 0 marks everything as idle, this is the * "all" behavior. */ mark_idle(zram, cutoff_time); - rv =3D len; - -out_unlock: - up_read(&zram->init_lock); -out: - return rv; + return len; } =20 #ifdef CONFIG_ZRAM_WRITEBACK @@ -546,13 +539,12 @@ static ssize_t bd_stat_show(struct device *dev, struc= t device_attribute *attr, struct zram *zram =3D dev_to_zram(dev); ssize_t ret; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); ret =3D sysfs_emit(buf, "%8llu %8llu %8llu\n", FOUR_K((u64)atomic64_read(&zram->stats.bd_count)), FOUR_K((u64)atomic64_read(&zram->stats.bd_reads)), FOUR_K((u64)atomic64_read(&zram->stats.bd_writes))); - up_read(&zram->init_lock); =20 return ret; } @@ -567,14 +559,12 @@ static ssize_t writeback_compressed_store(struct devi= ce *dev, if (kstrtobool(buf, &val)) return -EINVAL; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); if (init_done(zram)) { - up_write(&zram->init_lock); return -EBUSY; } =20 zram->wb_compressed =3D val; - up_write(&zram->init_lock); =20 return len; } @@ -586,9 +576,8 @@ static ssize_t writeback_compressed_show(struct device = *dev, bool val; struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); val =3D zram->wb_compressed; - up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%d\n", val); } @@ -599,17 +588,14 @@ static ssize_t writeback_limit_enable_store(struct de= vice *dev, { struct zram *zram =3D dev_to_zram(dev); u64 val; - ssize_t ret =3D -EINVAL; =20 if (kstrtoull(buf, 10, &val)) - return ret; + return -EINVAL; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); zram->wb_limit_enable =3D val; - up_write(&zram->init_lock); - ret =3D len; =20 - return ret; + return len; } =20 static ssize_t writeback_limit_enable_show(struct device *dev, @@ -619,9 +605,8 @@ static ssize_t writeback_limit_enable_show(struct devic= e *dev, bool val; struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); val =3D zram->wb_limit_enable; - up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%d\n", val); } @@ -632,10 +617,9 @@ static ssize_t writeback_limit_store(struct device *de= v, { struct zram *zram =3D dev_to_zram(dev); u64 val; - ssize_t ret =3D -EINVAL; =20 if (kstrtoull(buf, 10, &val)) - return ret; + return -EINVAL; =20 /* * When the page size is greater than 4KB, if bd_wb_limit is set to @@ -647,12 +631,10 @@ static ssize_t writeback_limit_store(struct device *d= ev, */ val =3D rounddown(val, PAGE_SIZE / 4096); =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); zram->bd_wb_limit =3D val; - up_write(&zram->init_lock); - ret =3D len; =20 - return ret; + return len; } =20 static ssize_t writeback_limit_show(struct device *dev, @@ -661,9 +643,8 @@ static ssize_t writeback_limit_show(struct device *dev, u64 val; struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); val =3D zram->bd_wb_limit; - up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%llu\n", val); } @@ -681,9 +662,8 @@ static ssize_t writeback_batch_size_store(struct device= *dev, if (!val) return -EINVAL; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); zram->wb_batch_size =3D val; - up_write(&zram->init_lock); =20 return len; } @@ -695,9 +675,8 @@ static ssize_t writeback_batch_size_show(struct device = *dev, u32 val; struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); val =3D zram->wb_batch_size; - up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%u\n", val); } @@ -717,37 +696,33 @@ static void reset_bdev(struct zram *zram) } =20 static ssize_t backing_dev_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { struct file *file; struct zram *zram =3D dev_to_zram(dev); char *p; ssize_t ret; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); file =3D zram->backing_dev; if (!file) { memcpy(buf, "none\n", 5); - up_read(&zram->init_lock); return 5; } =20 p =3D file_path(file, buf, PAGE_SIZE - 1); - if (IS_ERR(p)) { - ret =3D PTR_ERR(p); - goto out; - } + if (IS_ERR(p)) + return PTR_ERR(p); =20 ret =3D strlen(p); memmove(buf, p, ret); buf[ret++] =3D '\n'; -out: - up_read(&zram->init_lock); return ret; } =20 static ssize_t backing_dev_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) + struct device_attribute *attr, const char *buf, + size_t len) { char *file_name; size_t sz; @@ -762,7 +737,7 @@ static ssize_t backing_dev_store(struct device *dev, if (!file_name) return -ENOMEM; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); if (init_done(zram)) { pr_info("Can't setup backing device for initialized device\n"); err =3D -EBUSY; @@ -810,7 +785,6 @@ static ssize_t backing_dev_store(struct device *dev, zram->backing_dev =3D backing_dev; zram->bitmap =3D bitmap; zram->nr_pages =3D nr_pages; - up_write(&zram->init_lock); =20 pr_info("setup backing device %s\n", file_name); kfree(file_name); @@ -822,8 +796,6 @@ static ssize_t backing_dev_store(struct device *dev, if (backing_dev) filp_close(backing_dev, NULL); =20 - up_write(&zram->init_lock); - kfree(file_name); =20 return err; @@ -1291,33 +1263,29 @@ static ssize_t writeback_store(struct device *dev, ssize_t ret =3D len; int err, mode =3D 0; =20 - down_read(&zram->init_lock); - if (!init_done(zram)) { - up_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); + if (!init_done(zram)) return -EINVAL; - } =20 /* Do not permit concurrent post-processing actions. */ - if (atomic_xchg(&zram->pp_in_progress, 1)) { - up_read(&zram->init_lock); + if (atomic_xchg(&zram->pp_in_progress, 1)) return -EAGAIN; - } =20 if (!zram->backing_dev) { ret =3D -ENODEV; - goto release_init_lock; + goto out; } =20 pp_ctl =3D init_pp_ctl(); if (!pp_ctl) { ret =3D -ENOMEM; - goto release_init_lock; + goto out; } =20 wb_ctl =3D init_wb_ctl(zram); if (!wb_ctl) { ret =3D -ENOMEM; - goto release_init_lock; + goto out; } =20 args =3D skip_spaces(buf); @@ -1341,7 +1309,7 @@ static ssize_t writeback_store(struct device *dev, err =3D parse_mode(param, &mode); if (err) { ret =3D err; - goto release_init_lock; + goto out; } =20 scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); @@ -1352,7 +1320,7 @@ static ssize_t writeback_store(struct device *dev, err =3D parse_mode(val, &mode); if (err) { ret =3D err; - goto release_init_lock; + goto out; } =20 scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); @@ -1363,7 +1331,7 @@ static ssize_t writeback_store(struct device *dev, err =3D parse_page_index(val, nr_pages, &lo, &hi); if (err) { ret =3D err; - goto release_init_lock; + goto out; } =20 scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); @@ -1374,7 +1342,7 @@ static ssize_t writeback_store(struct device *dev, err =3D parse_page_indexes(val, nr_pages, &lo, &hi); if (err) { ret =3D err; - goto release_init_lock; + goto out; } =20 scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); @@ -1386,11 +1354,10 @@ static ssize_t writeback_store(struct device *dev, if (err) ret =3D err; =20 -release_init_lock: +out: release_pp_ctl(zram, pp_ctl); release_wb_ctl(wb_ctl); atomic_set(&zram->pp_in_progress, 0); - up_read(&zram->init_lock); =20 return ret; } @@ -1608,9 +1575,8 @@ static ssize_t read_block_state(struct file *file, ch= ar __user *buf, if (!kbuf) return -ENOMEM; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); if (!init_done(zram)) { - up_read(&zram->init_lock); kvfree(kbuf); return -EINVAL; } @@ -1646,7 +1612,6 @@ static ssize_t read_block_state(struct file *file, ch= ar __user *buf, *ppos +=3D 1; } =20 - up_read(&zram->init_lock); if (copy_to_user(buf, kbuf, written)) written =3D -EFAULT; kvfree(kbuf); @@ -1713,16 +1678,14 @@ static int __comp_algorithm_store(struct zram *zram= , u32 prio, const char *buf) return -EINVAL; } =20 - down_write(&zram->init_lock); + guard(rwsem_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; } =20 comp_algorithm_set(zram, prio, compressor); - up_write(&zram->init_lock); return 0; } =20 @@ -1843,9 +1806,8 @@ static ssize_t comp_algorithm_show(struct device *dev, struct zram *zram =3D dev_to_zram(dev); ssize_t sz; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); sz =3D zcomp_available_show(zram->comp_algs[ZRAM_PRIMARY_COMP], buf, 0); - up_read(&zram->init_lock); return sz; } =20 @@ -1870,7 +1832,7 @@ static ssize_t recomp_algorithm_show(struct device *d= ev, ssize_t sz =3D 0; u32 prio; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); for (prio =3D ZRAM_SECONDARY_COMP; prio < ZRAM_MAX_COMPS; prio++) { if (!zram->comp_algs[prio]) continue; @@ -1878,7 +1840,6 @@ static ssize_t recomp_algorithm_show(struct device *d= ev, sz +=3D sysfs_emit_at(buf, sz, "#%d: ", prio); sz +=3D zcomp_available_show(zram->comp_algs[prio], buf, sz); } - up_read(&zram->init_lock); return sz; } =20 @@ -1924,42 +1885,38 @@ static ssize_t recomp_algorithm_store(struct device= *dev, } #endif =20 -static ssize_t compact_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static ssize_t compact_store(struct device *dev, struct device_attribute *= attr, + const char *buf, size_t len) { struct zram *zram =3D dev_to_zram(dev); =20 - down_read(&zram->init_lock); - if (!init_done(zram)) { - up_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); + if (!init_done(zram)) return -EINVAL; - } =20 zs_compact(zram->mem_pool); - up_read(&zram->init_lock); =20 return len; } =20 -static ssize_t io_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t io_stat_show(struct device *dev, struct device_attribute *a= ttr, + char *buf) { struct zram *zram =3D dev_to_zram(dev); ssize_t ret; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); ret =3D sysfs_emit(buf, "%8llu %8llu 0 %8llu\n", (u64)atomic64_read(&zram->stats.failed_reads), (u64)atomic64_read(&zram->stats.failed_writes), (u64)atomic64_read(&zram->stats.notify_free)); - up_read(&zram->init_lock); =20 return ret; } =20 -static ssize_t mm_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t mm_stat_show(struct device *dev, struct device_attribute *a= ttr, + char *buf) { struct zram *zram =3D dev_to_zram(dev); struct zs_pool_stats pool_stats; @@ -1969,7 +1926,7 @@ static ssize_t mm_stat_show(struct device *dev, =20 memset(&pool_stats, 0x00, sizeof(struct zs_pool_stats)); =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); if (init_done(zram)) { mem_used =3D zs_get_total_pages(zram->mem_pool); zs_pool_stats(zram->mem_pool, &pool_stats); @@ -1989,7 +1946,6 @@ static ssize_t mm_stat_show(struct device *dev, atomic_long_read(&pool_stats.pages_compacted), (u64)atomic64_read(&zram->stats.huge_pages), (u64)atomic64_read(&zram->stats.huge_pages_since)); - up_read(&zram->init_lock); =20 return ret; } @@ -2001,12 +1957,11 @@ static ssize_t debug_stat_show(struct device *dev, struct zram *zram =3D dev_to_zram(dev); ssize_t ret; =20 - down_read(&zram->init_lock); + guard(rwsem_read)(&zram->init_lock); ret =3D sysfs_emit(buf, "version: %d\n0 %8llu\n", version, (u64)atomic64_read(&zram->stats.miss_free)); - up_read(&zram->init_lock); =20 return ret; } @@ -2669,17 +2624,13 @@ static ssize_t recompress_store(struct device *dev, if (threshold >=3D huge_class_size) return -EINVAL; =20 - down_read(&zram->init_lock); - if (!init_done(zram)) { - ret =3D -EINVAL; - goto release_init_lock; - } + guard(rwsem_read)(&zram->init_lock); + if (!init_done(zram)) + return -EINVAL; =20 /* Do not permit concurrent post-processing actions. */ - if (atomic_xchg(&zram->pp_in_progress, 1)) { - up_read(&zram->init_lock); + if (atomic_xchg(&zram->pp_in_progress, 1)) return -EAGAIN; - } =20 if (algo) { bool found =3D false; @@ -2697,26 +2648,26 @@ static ssize_t recompress_store(struct device *dev, =20 if (!found) { ret =3D -EINVAL; - goto release_init_lock; + goto out; } } =20 prio_max =3D min(prio_max, (u32)zram->num_active_comps); if (prio >=3D prio_max) { ret =3D -EINVAL; - goto release_init_lock; + goto out; } =20 page =3D alloc_page(GFP_KERNEL); if (!page) { ret =3D -ENOMEM; - goto release_init_lock; + goto out; } =20 ctl =3D init_pp_ctl(); if (!ctl) { ret =3D -ENOMEM; - goto release_init_lock; + goto out; } =20 scan_slots_for_recompress(zram, mode, prio_max, ctl); @@ -2747,12 +2698,11 @@ static ssize_t recompress_store(struct device *dev, cond_resched(); } =20 -release_init_lock: +out: if (page) __free_page(page); release_pp_ctl(zram, ctl); atomic_set(&zram->pp_in_progress, 0); - up_read(&zram->init_lock); return ret; } #endif @@ -2931,7 +2881,7 @@ static void zram_destroy_comps(struct zram *zram) =20 static void zram_reset_device(struct zram *zram) { - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); =20 zram->limit_pages =3D 0; =20 @@ -2947,11 +2897,10 @@ static void zram_reset_device(struct zram *zram) reset_bdev(zram); =20 comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor); - up_write(&zram->init_lock); } =20 -static ssize_t disksize_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static ssize_t disksize_store(struct device *dev, struct device_attribute = *attr, + const char *buf, size_t len) { u64 disksize; struct zcomp *comp; @@ -2963,18 +2912,15 @@ static ssize_t disksize_store(struct device *dev, if (!disksize) return -EINVAL; =20 - down_write(&zram->init_lock); + guard(rwsem_write)(&zram->init_lock); if (init_done(zram)) { pr_info("Cannot change disksize for initialized device\n"); - err =3D -EBUSY; - goto out_unlock; + return -EBUSY; } =20 disksize =3D PAGE_ALIGN(disksize); - if (!zram_meta_alloc(zram, disksize)) { - err =3D -ENOMEM; - goto out_unlock; - } + if (!zram_meta_alloc(zram, disksize)) + return -ENOMEM; =20 for (prio =3D ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) { if (!zram->comp_algs[prio]) @@ -2994,15 +2940,12 @@ static ssize_t disksize_store(struct device *dev, } zram->disksize =3D disksize; set_capacity_and_notify(zram->disk, zram->disksize >> SECTOR_SHIFT); - up_write(&zram->init_lock); =20 return len; =20 out_free_comps: zram_destroy_comps(zram); zram_meta_free(zram, disksize); -out_unlock: - up_write(&zram->init_lock); return err; } =20 --=20 2.52.0.487.g5c8c507ade-goog From nobody Mon Dec 1 21:33:24 2025 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B61E1303A24 for ; Mon, 1 Dec 2025 09:48:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582506; cv=none; b=jyKm+ZBUt+SWXubcmVBShf8Xn3L5GylJiZL9vESxykFpAnS43uGzWPHrxgGPAlLs+wsnYcMcyEqAkOlOpmh1JjMFLGu9ORZjTXPuXijz5fHfAPJpt/D419fnEg1nPE0eXWYGUdRtI6YRgpIBxWNXnHDNzjvoZh11+LAvjaTUugg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764582506; c=relaxed/simple; bh=3WR+Hz4p20TODNgOXzqUGBkhXgJIsLJmME/K+r23E+Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H16IUFdKRcBJA/C6ZlwlZvDCqSN3AIM74rgQEXBqNun38YdLcR7ZTfGjD5Hq3c/NMbFck3BUVrmtD6HQLOF2JK/KOeC8tim0Ooc+NNTm4UVd9PqYZ5dQgGwS75+bDp7hgwk9Hdom/zqf6kMa4IA6ZgquPx4gsqyXkgsns1NNy/s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=ZOsBqfxy; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="ZOsBqfxy" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-7aa9be9f03aso3382371b3a.2 for ; Mon, 01 Dec 2025 01:48:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1764582504; x=1765187304; darn=vger.kernel.org; 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=D55crJZWYW5y22wme+Q0xHtiGm3WaMjTuTpUN/z/uDQ=; b=ZOsBqfxyGRzpN5uyih/SwwwP6QZDS0ib3tJwnPIAJSinx75pwvsNaI7PSJq/46JJ9j ycw29Vteoy3ykn9Sj1JEZqDd2Qfj6mBRXk13ipbbkx9Z0eCDGaePaXweRLduluyllK6l UmyD+AdNEnT4lSz7vg2JSNcxm4CuMzFEgDuhk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764582504; x=1765187304; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=D55crJZWYW5y22wme+Q0xHtiGm3WaMjTuTpUN/z/uDQ=; b=gd+yKxNAyADUNS+XyPdYQnqFlzQ0cZxl7BypsYFLk+y3WSJ2HIqe2EgKXXBqDkkuMU 7rOqj3Rgv3kjJr1C+a6iJzlvvWiQ0jZ0Z7awafKOSsjW+HvhiykDcK6dTWl5Hp5bxbwI L8KFX1I/+PfNiqyJbcUEsjQcEFwUJ+f5GUxgXtdcBi/V+x5W5zy3BAPeZ9ITqg7ezQ2T 8pGOR//mhYei127sZBs8wjP0KaZ7s0ZAyvp5Vx1BbJVtwMgTeBWhT5RZjEA/Wfr0CJKb ZBwveD+AmMEpV25XP3a3JzEUNDShIFexMYCmdwygGhMmatU2wURd6Zt8OjrXTCvq0MQZ ytLg== X-Forwarded-Encrypted: i=1; AJvYcCW0x2cbJA2QGzGLbRBXMhrbb/LO8jiJ/l2g6bFuPAhxGZzeXUrd412gMOJLxWPf7ojPix3kVoLi6WKVfhE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+gTUckA57bkaj9+qb+iAkhgrddwkI8Nuw0XqyR7+cehn4cbEl gv54iGh37IOuXbXPV1kBI3logWxJik73V9XodrzND/jy8chy5W3ItVG50gaab1cZRw== X-Gm-Gg: ASbGncvUUNcO+LRjgThcRYLPT0jc0cOh6cfr3p6G8Sv8/VF9y3cnyRYJYyRGc3+lSVt t2srQ3haVl0m22Fx2GfKJlbQIQXRXHiR6eJGG4o9/J4M4VIGldSvSLuwEnVMYvsZTwUX6Pgmu86 CUt55oaqc9vPc/Zz/QwY4QXMifHp956b9H4MjP5m+tzHNAJ6HYEofWDCJD8VxwXAyO7VzGfHZKL nWRfJANaMnMGjQBAfrL5s/CGkAky7+myH77K/X4Z0ITBtp/hF7/TGyTA13Sq5ccaQIH8MuNnlLJ FE6jZz6g42zUbpLqu6XdduyYBXt8ruNuhc1yJS9GDISpHQ58w+Y/+gxNb5rglAN3NGdORuo4Dik /Hbvk6y1YkmIPscn6ZzArsQfahDG4gNTr0cHkDqU6sK2OEtslZiLJeiLOSsRpx72B7o0w9Fqr2s Ho7iMYqj9XBXqzeGJK6UmMj9jsbeXEKQaM5+rVfiLO7AgPsmkAoue+VmYrSVQb5my7u2B2d+Orr Q== X-Google-Smtp-Source: AGHT+IEl7N/dM1tmzBzSc8w5jctWzUot+nqnpPOQiY3QXNdxfFy7u3OLp9wLsDD2vN5+NSzPEqYx5A== X-Received: by 2002:a05:6a00:8d6:b0:7ab:e844:1e76 with SMTP id d2e1a72fcca58-7c58c2b20b5mr34419865b3a.5.1764582504112; Mon, 01 Dec 2025 01:48:24 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:943c:f651:f00f:2459]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7d15e7db577sm12882074b3a.31.2025.12.01.01.48.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 01:48:23 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton , Richard Chang , Minchan Kim Cc: Brian Geffon , David Stevens , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv2 7/7] zram: consolidate device-attr declarations Date: Mon, 1 Dec 2025 18:47:54 +0900 Message-ID: <20251201094754.4149975-8-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.487.g5c8c507ade-goog In-Reply-To: <20251201094754.4149975-1-senozhatsky@chromium.org> References: <20251201094754.4149975-1-senozhatsky@chromium.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Do not spread device attributes declarations across the file, move io_stat, mm_stat, debug_stat to a common device-attr section. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 4b8a26c60539..67a9e7c005c3 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1966,10 +1966,6 @@ static ssize_t debug_stat_show(struct device *dev, return ret; } =20 -static DEVICE_ATTR_RO(io_stat); -static DEVICE_ATTR_RO(mm_stat); -static DEVICE_ATTR_RO(debug_stat); - static void zram_meta_free(struct zram *zram, u64 disksize) { size_t num_pages =3D disksize >> PAGE_SHIFT; @@ -3008,6 +3004,9 @@ static const struct block_device_operations zram_devo= ps =3D { .owner =3D THIS_MODULE }; =20 +static DEVICE_ATTR_RO(io_stat); +static DEVICE_ATTR_RO(mm_stat); +static DEVICE_ATTR_RO(debug_stat); static DEVICE_ATTR_WO(compact); static DEVICE_ATTR_RW(disksize); static DEVICE_ATTR_RO(initstate); --=20 2.52.0.487.g5c8c507ade-goog