From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 6A2A02FFF86 for ; Tue, 18 Nov 2025 07:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451018; cv=none; b=JqfMm4ufP5V4X/GVKiYHHIGvr+I4FwZX2dGaGZg0MLkSB2sQNrop5riZvG1HxAcOq6YfvxJ4Bp5z4/1SngP8AmqsqkEJOudPopxX1pKXxNwQUZHde10DwtEjBAbzn7l1WTQ31KxLFgDZovzWu4/Q84vbfk20qwpwLhYRsqDn6gM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451018; c=relaxed/simple; bh=X/iVWdZ9TbkTwhtmktCCVZq2pdLQnheIVxidL4YIXtQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E8WjpNWOdVVVpufKu61/OXAvQYrWrCxx0yDfxcNcBbNOvn3sVokWrCmt2NCexoSD4hUCtoYyZMwnkfDgA9ZqDm2TfKdHszMY29lyMAEWH7uCSyOgP9lrRGzM6cqqXbfz3jUiqotTXfvCdS3TRjBc3cHjd5OFWJKzlK0v/xBC/tg= 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=HcFERjF9; arc=none smtp.client-ip=209.85.214.181 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="HcFERjF9" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-29516a36affso60955525ad.3 for ; Mon, 17 Nov 2025 23:30:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451016; x=1764055816; 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=5u1M/RNJpcZCCpiReIhVBJ0yK+614L9bZ4KnDOH5PIM=; b=HcFERjF9i3ij6xiopoQjbH2PFuspjKSdlifFLHeWjQb3nI97NfLd9sS5WdKXYxP5q9 dQxItv2j4TuIkSs2bETaI5zqkP4DZLrmxB+mxNsIQnGeUvvfwFsAoZ8ndy9XDDNpEDtz JapLR96UnuEvx13xcgaSHEAvClFvXfoRSvrUY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451016; x=1764055816; 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=5u1M/RNJpcZCCpiReIhVBJ0yK+614L9bZ4KnDOH5PIM=; b=hY9UXoi2FFsGtH0Um/qYP/clx4VXcwmyCNqq3Ai2xIVnJIxAhSZZhZ1WqA2gCEgkng rhEKUJZuyzzHtTR3lEMLIIK6LsgNkpGJyce7L98ApoTPXV1VFm3T3Vvo6b/8NgUWT0qv 1T5zkvA5Q3h5qNApsU+EkqG93kbKjQoQFxmT74j/sOLyT+etawu5qFg50Z7fbTqMFJbU E+dQN8xFX0BTSnKXKugYbIXSgAHD5Nl0I9rg/hNY9rOonlSwlgngoRo8FYgSguiApJ0K csuo262ZIZ6r8MVN86Vw4xNlgCXEYp2dVnyvy2bQyyOn+lFEhqh868oPIEWfpswkJKot TqDg== X-Forwarded-Encrypted: i=1; AJvYcCWZwedGOOVXL+jAiemY2bwV2ruHyMPr1WQBO8Oq1S1w6QhuKrJPHPHHPrDViYixKportZKMtSv+FOFAYOY=@vger.kernel.org X-Gm-Message-State: AOJu0YxiDeG+qQ/JJ0YRI4VBG7wYHwl29CQA5jw9+/bLCO9rvGl/b4Xc vNrUkGfQHQlY1BLMKmxgh+DIx6v4O15ORPbaE3+nYYiUJHjWtSHj91tldPfHhISVFQ== X-Gm-Gg: ASbGncv8J8QP78KSSsrk2F4D95f8iLQdApiai4aey40tXhnAvqG31fcsrDwPn6s21IB EE7Z3OCMFV+ribL23+H+XUtMn7fZu/5kdwr7dKTv68C+N9ouQzAu/+GyXIHdoZQEihJR+g7Zf12 yGtlPgfrDZQs25VENIA6tgY9GFr29PSgFDlRsUMPPJlmlZ8zjLIDFMlYOVKKAQxo421wxjbxoWt DeGybWksvVlo4FkU2Squi46HeI6/apQ4Gh/okb0Iv/nWKtrfpLTrtXtXZk+MhsqPTKI3/7OW1qa r2iK6w80hVwFhWTOxKCuV0/GCCu7+PeWu73ApTu6imv+b6MKgREun0yL26K9L1JGucQ35CmOfDD RfSu45GHdONYE759r0jq6OJRoGX98hFzXqC1WPO8zvS0u6NNoyTupc42dvJLv06lJe0MWeCZF8n Sz1mIEWtMReZCtYuwmtF4t+D0dRuVEdot5C3bVIA== X-Google-Smtp-Source: AGHT+IE2nS4O+t0c13YVruIc3FV/xNqE1bbo8AUtB4eocoaK5GqSzVHPBqEVxhfLx/QcNvlT8HcnUw== X-Received: by 2002:a17:903:94f:b0:294:cc8d:c0c2 with SMTP id d9443c01a7336-2986a6d6d75mr172478765ad.27.1763451015679; Mon, 17 Nov 2025 23:30:15 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:15 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky , Minchan Kim Subject: [PATCHv4 1/6] zram: introduce writeback bio batching support Date: Tue, 18 Nov 2025 16:29:55 +0900 Message-ID: <20251118073000.1928107-2-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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: Yuwen Chen Currently, zram writeback supports only a single bio writeback operation, waiting for bio completion before post-processing next pp-slot. This works, in general, but has certain throughput limitations. Implement batched (multiple) bio writeback support to take advantage of parallel requests processing and better requests scheduling. For the time being the writeback batch size (maximum number of in-flight bio requests) is set to 32 for all devices. A follow up patch adds a writeback_batch_size device attribute, so the batch size becomes run-time configurable. Please refer to [1] and [2] for benchmarks. [1] https://lore.kernel.org/linux-block/tencent_B2DC37E3A2AED0E7F179365FCB5= D82455B08@qq.com [2] https://lore.kernel.org/linux-block/tencent_0FBBFC8AE0B97BC63B5D47CE1FF= 2BABFDA09@qq.com [senozhatsky: significantly reworked the initial patch so that the approach and implementation resemble current zram post-processing code] Signed-off-by: Yuwen Chen Signed-off-by: Sergey Senozhatsky Co-developed-by: Richard Chang Suggested-by: Minchan Kim --- drivers/block/zram/zram_drv.c | 348 +++++++++++++++++++++++++++------- 1 file changed, 282 insertions(+), 66 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index a43074657531..ea06f4d7b623 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -500,6 +500,24 @@ static ssize_t idle_store(struct device *dev, } =20 #ifdef CONFIG_ZRAM_WRITEBACK +struct zram_wb_ctl { + struct list_head idle_reqs; + struct list_head inflight_reqs; + + atomic_t num_inflight; + struct completion done; +}; + +struct zram_wb_req { + unsigned long blk_idx; + struct page *page; + struct zram_pp_slot *pps; + struct bio_vec bio_vec; + struct bio bio; + + struct list_head entry; +}; + static ssize_t writeback_limit_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { @@ -734,20 +752,209 @@ static void read_from_bdev_async(struct zram *zram, = struct page *page, submit_bio(bio); } =20 -static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl) +static void release_wb_req(struct zram_wb_req *req) +{ + __free_page(req->page); + kfree(req); +} + +static void release_wb_ctl(struct zram_wb_ctl *wb_ctl) +{ + /* We should never have inflight requests at this point */ + WARN_ON(!list_empty(&wb_ctl->inflight_reqs)); + + while (!list_empty(&wb_ctl->idle_reqs)) { + struct zram_wb_req *req; + + req =3D list_first_entry(&wb_ctl->idle_reqs, + struct zram_wb_req, entry); + list_del(&req->entry); + release_wb_req(req); + } + + kfree(wb_ctl); +} + +/* XXX: should be a per-device sysfs attr */ +#define ZRAM_WB_REQ_CNT 32 + +static struct zram_wb_ctl *init_wb_ctl(void) +{ + struct zram_wb_ctl *wb_ctl; + int i; + + wb_ctl =3D kmalloc(sizeof(*wb_ctl), GFP_KERNEL); + if (!wb_ctl) + return NULL; + + INIT_LIST_HEAD(&wb_ctl->idle_reqs); + INIT_LIST_HEAD(&wb_ctl->inflight_reqs); + atomic_set(&wb_ctl->num_inflight, 0); + init_completion(&wb_ctl->done); + + for (i =3D 0; i < ZRAM_WB_REQ_CNT; i++) { + struct zram_wb_req *req; + + /* + * This is fatal condition only if we couldn't allocate + * any requests at all. Otherwise we just work with the + * requests that we have successfully allocated, so that + * writeback can still proceed, even if there is only one + * request on the idle list. + */ + req =3D kzalloc(sizeof(*req), GFP_KERNEL | __GFP_NOWARN); + if (!req) + break; + + req->page =3D alloc_page(GFP_KERNEL | __GFP_NOWARN); + if (!req->page) { + kfree(req); + break; + } + + list_add(&req->entry, &wb_ctl->idle_reqs); + } + + /* We couldn't allocate any requests, so writeabck is not possible */ + if (list_empty(&wb_ctl->idle_reqs)) + goto release_wb_ctl; + + return wb_ctl; + +release_wb_ctl: + release_wb_ctl(wb_ctl); + return NULL; +} + +static void zram_account_writeback_rollback(struct zram *zram) +{ + spin_lock(&zram->wb_limit_lock); + if (zram->wb_limit_enable) + zram->bd_wb_limit +=3D 1UL << (PAGE_SHIFT - 12); + spin_unlock(&zram->wb_limit_lock); +} + +static void zram_account_writeback_submit(struct zram *zram) +{ + spin_lock(&zram->wb_limit_lock); + if (zram->wb_limit_enable && zram->bd_wb_limit > 0) + zram->bd_wb_limit -=3D 1UL << (PAGE_SHIFT - 12); + spin_unlock(&zram->wb_limit_lock); +} + +static int zram_writeback_complete(struct zram *zram, struct zram_wb_req *= req) +{ + u32 index =3D req->pps->index; + int err; + + err =3D blk_status_to_errno(req->bio.bi_status); + if (err) { + /* + * Failed wb requests should not be accounted in wb_limit + * (if enabled). + */ + zram_account_writeback_rollback(zram); + free_block_bdev(zram, req->blk_idx); + return err; + } + + atomic64_inc(&zram->stats.bd_writes); + zram_slot_lock(zram, index); + /* + * We release slot lock during writeback so slot can change under us: + * slot_free() or slot_free() and zram_write_page(). In both cases + * slot loses ZRAM_PP_SLOT flag. No concurrent post-processing can + * set ZRAM_PP_SLOT on such slots until current post-processing + * finishes. + */ + if (!zram_test_flag(zram, index, ZRAM_PP_SLOT)) { + free_block_bdev(zram, req->blk_idx); + goto out; + } + + zram_free_page(zram, index); + zram_set_flag(zram, index, ZRAM_WB); + zram_set_handle(zram, index, req->blk_idx); + atomic64_inc(&zram->stats.pages_stored); + +out: + zram_slot_unlock(zram, index); + return 0; +} + +static void zram_writeback_endio(struct bio *bio) +{ + struct zram_wb_ctl *wb_ctl =3D bio->bi_private; + + if (atomic_dec_return(&wb_ctl->num_inflight) =3D=3D 0) + complete(&wb_ctl->done); +} + +static void zram_submit_wb_request(struct zram *zram, + struct zram_wb_ctl *wb_ctl, + struct zram_wb_req *req) +{ + /* + * wb_limit (if enabled) should be adjusted before submission, + * so that we don't over-submit. + */ + zram_account_writeback_submit(zram); + atomic_inc(&wb_ctl->num_inflight); + list_add_tail(&req->entry, &wb_ctl->inflight_reqs); + submit_bio(&req->bio); +} + +static struct zram_wb_req *select_idle_req(struct zram_wb_ctl *wb_ctl) { + struct zram_wb_req *req; + + req =3D list_first_entry_or_null(&wb_ctl->idle_reqs, + struct zram_wb_req, entry); + if (req) + list_del(&req->entry); + return req; +} + +static int zram_wb_wait_for_completion(struct zram *zram, + struct zram_wb_ctl *wb_ctl) +{ + int ret =3D 0; + + if (atomic_read(&wb_ctl->num_inflight)) + wait_for_completion_io(&wb_ctl->done); + + reinit_completion(&wb_ctl->done); + while (!list_empty(&wb_ctl->inflight_reqs)) { + struct zram_wb_req *req; + int err; + + req =3D list_first_entry(&wb_ctl->inflight_reqs, + struct zram_wb_req, entry); + list_move(&req->entry, &wb_ctl->idle_reqs); + + err =3D zram_writeback_complete(zram, req); + if (err) + ret =3D err; + + release_pp_slot(zram, req->pps); + req->pps =3D NULL; + } + + return ret; +} + +static int zram_writeback_slots(struct zram *zram, + struct zram_pp_ctl *ctl, + struct zram_wb_ctl *wb_ctl) +{ + struct zram_wb_req *req =3D NULL; unsigned long blk_idx =3D 0; - struct page *page =3D NULL; struct zram_pp_slot *pps; - struct bio_vec bio_vec; - struct bio bio; + struct blk_plug io_plug; int ret =3D 0, err; - u32 index; - - page =3D alloc_page(GFP_KERNEL); - if (!page) - return -ENOMEM; + u32 index =3D 0; =20 + blk_start_plug(&io_plug); while ((pps =3D select_pp_slot(ctl))) { spin_lock(&zram->wb_limit_lock); if (zram->wb_limit_enable && !zram->bd_wb_limit) { @@ -757,6 +964,26 @@ static int zram_writeback_slots(struct zram *zram, str= uct zram_pp_ctl *ctl) } spin_unlock(&zram->wb_limit_lock); =20 + while (!req) { + req =3D select_idle_req(wb_ctl); + if (req) + break; + + blk_finish_plug(&io_plug); + err =3D zram_wb_wait_for_completion(zram, wb_ctl); + blk_start_plug(&io_plug); + /* + * BIO errors are not fatal, we continue and simply + * attempt to writeback the remaining objects (pages). + * At the same time we need to signal user-space that + * some writes (at least one, but also could be all of + * them) were not successful and we do so by returning + * the most recent BIO error. + */ + if (err) + ret =3D err; + } + if (!blk_idx) { blk_idx =3D alloc_block_bdev(zram); if (!blk_idx) { @@ -775,67 +1002,46 @@ static int zram_writeback_slots(struct zram *zram, s= truct zram_pp_ctl *ctl) */ if (!zram_test_flag(zram, index, ZRAM_PP_SLOT)) goto next; - if (zram_read_from_zspool(zram, page, index)) + if (zram_read_from_zspool(zram, req->page, index)) goto next; zram_slot_unlock(zram, index); =20 - bio_init(&bio, zram->bdev, &bio_vec, 1, - REQ_OP_WRITE | REQ_SYNC); - bio.bi_iter.bi_sector =3D blk_idx * (PAGE_SIZE >> 9); - __bio_add_page(&bio, page, PAGE_SIZE, 0); - /* - * XXX: A single page IO would be inefficient for write - * but it would be not bad as starter. + * From now on pp-slot is owned by the req, remove it from + * its pp bucket. */ - err =3D submit_bio_wait(&bio); - if (err) { - release_pp_slot(zram, pps); - /* - * BIO errors are not fatal, we continue and simply - * attempt to writeback the remaining objects (pages). - * At the same time we need to signal user-space that - * some writes (at least one, but also could be all of - * them) were not successful and we do so by returning - * the most recent BIO error. - */ - ret =3D err; - continue; - } + list_del_init(&pps->entry); =20 - atomic64_inc(&zram->stats.bd_writes); - zram_slot_lock(zram, index); - /* - * Same as above, we release slot lock during writeback so - * slot can change under us: slot_free() or slot_free() and - * reallocation (zram_write_page()). In both cases slot loses - * ZRAM_PP_SLOT flag. No concurrent post-processing can set - * ZRAM_PP_SLOT on such slots until current post-processing - * finishes. - */ - if (!zram_test_flag(zram, index, ZRAM_PP_SLOT)) - goto next; + req->blk_idx =3D blk_idx; + req->pps =3D pps; + bio_init(&req->bio, zram->bdev, &req->bio_vec, 1, REQ_OP_WRITE); + req->bio.bi_iter.bi_sector =3D req->blk_idx * (PAGE_SIZE >> 9); + req->bio.bi_end_io =3D zram_writeback_endio; + req->bio.bi_private =3D wb_ctl; + __bio_add_page(&req->bio, req->page, PAGE_SIZE, 0); =20 - zram_free_page(zram, index); - zram_set_flag(zram, index, ZRAM_WB); - zram_set_handle(zram, index, blk_idx); + zram_submit_wb_request(zram, wb_ctl, req); blk_idx =3D 0; - atomic64_inc(&zram->stats.pages_stored); - spin_lock(&zram->wb_limit_lock); - if (zram->wb_limit_enable && zram->bd_wb_limit > 0) - zram->bd_wb_limit -=3D 1UL << (PAGE_SHIFT - 12); - spin_unlock(&zram->wb_limit_lock); + req =3D NULL; + continue; + next: zram_slot_unlock(zram, index); release_pp_slot(zram, pps); - cond_resched(); } =20 - if (blk_idx) - free_block_bdev(zram, blk_idx); - if (page) - __free_page(page); + /* + * Selected idle req, but never submitted it due to some error or + * wb limit. + */ + if (req) + release_wb_req(req); + + blk_finish_plug(&io_plug); + err =3D zram_wb_wait_for_completion(zram, wb_ctl); + if (err) + ret =3D err; =20 return ret; } @@ -948,7 +1154,8 @@ static ssize_t writeback_store(struct device *dev, struct zram *zram =3D dev_to_zram(dev); u64 nr_pages =3D zram->disksize >> PAGE_SHIFT; unsigned long lo =3D 0, hi =3D nr_pages; - struct zram_pp_ctl *ctl =3D NULL; + struct zram_pp_ctl *pp_ctl =3D NULL; + struct zram_wb_ctl *wb_ctl =3D NULL; char *args, *param, *val; ssize_t ret =3D len; int err, mode =3D 0; @@ -970,8 +1177,14 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - ctl =3D init_pp_ctl(); - if (!ctl) { + pp_ctl =3D init_pp_ctl(); + if (!pp_ctl) { + ret =3D -ENOMEM; + goto release_init_lock; + } + + wb_ctl =3D init_wb_ctl(); + if (!wb_ctl) { ret =3D -ENOMEM; goto release_init_lock; } @@ -1000,7 +1213,7 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - scan_slots_for_writeback(zram, mode, lo, hi, ctl); + scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); break; } =20 @@ -1011,7 +1224,7 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - scan_slots_for_writeback(zram, mode, lo, hi, ctl); + scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); break; } =20 @@ -1022,7 +1235,7 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - scan_slots_for_writeback(zram, mode, lo, hi, ctl); + scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); continue; } =20 @@ -1033,17 +1246,18 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - scan_slots_for_writeback(zram, mode, lo, hi, ctl); + scan_slots_for_writeback(zram, mode, lo, hi, pp_ctl); continue; } } =20 - err =3D zram_writeback_slots(zram, ctl); + err =3D zram_writeback_slots(zram, pp_ctl, wb_ctl); if (err) ret =3D err; =20 release_init_lock: - release_pp_ctl(zram, ctl); + release_pp_ctl(zram, pp_ctl); + release_wb_ctl(wb_ctl); atomic_set(&zram->pp_in_progress, 0); up_read(&zram->init_lock); =20 @@ -1112,7 +1326,9 @@ static int read_from_bdev(struct zram *zram, struct p= age *page, return -EIO; } =20 -static void free_block_bdev(struct zram *zram, unsigned long blk_idx) {}; +static void free_block_bdev(struct zram *zram, unsigned long blk_idx) +{ +} #endif =20 #ifdef CONFIG_ZRAM_MEMORY_TRACKING --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 852C230277D for ; Tue, 18 Nov 2025 07:30:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451021; cv=none; b=A/yPN4RJXbp0vTL3ICVrUbQK0E3nWYCvVE3dsSX/9+V4b06Pk2aRLeIgmk5rLXnfIKe5Lu6maa0YpFuigh6djP6MM7C1Nwft0z/WvIR5xwfwHJvW+WlhMJeWwKmQxDxFbgBpJd05YuR6v+hetFV/B0qhI8UnGcmFH3mTAYGZoyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451021; c=relaxed/simple; bh=w/1Ykm2PaEu512nWzHzi9guwWnDK5t0d+FGYYp2oDdI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=czug50GvjKW1DRVV8Jy+uqTZf2tbisj9kdwySolMTVGhP1S/x/qr2pZ9KXIgme5Gc2Y2NOkxtcfBVwQqS/tnsk8P8pj5P+/q1BVBDpolscsXTgaL58BhGQZrU8JbAq7huK6gLO+4Z0Ua3RyRJbAikqjSe5wcRUdBX7hePLqUJSI= 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=deCx3Mch; arc=none smtp.client-ip=209.85.214.170 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="deCx3Mch" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-297e239baecso56446495ad.1 for ; Mon, 17 Nov 2025 23:30:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451019; x=1764055819; 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=AVrPRt4Q28dKav7HserS19FijFvKacb/VGjhgi5CQXo=; b=deCx3MchO7mgYrDZI1mhAcIrSoKdpGiTran1spccuunGKD9iSdoTbgmlno+FCpM867 bl4dwK5Dfou2HzR5nxcFJjK25DbM1SkqAHDsTfz7+E9bDF/SaxzAP81AjTBcDV0oRe19 CWxrZ0QjxhuekPPBXNrxB0KTDIlC0yU0S1mTA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451019; x=1764055819; 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=AVrPRt4Q28dKav7HserS19FijFvKacb/VGjhgi5CQXo=; b=qaz/+M0hLEpM13m3O664+MO3pzMee5DSpvKnyU7zyB8fvDRPRfC6G3SzuDxN54mEZN LZKufufc054/JHijRJY8uCNb11BSTBNlMnriMWlMv9nhY5zOiJDubJYFIaWgbVdQEMpF l2SQZMLWzV1Cdl73c7/fGspnTs4cO3qM/PoI01GsfWsxBI+cAbxEnX9LtEfltwavuYeJ 4Sz/W+bHtuW+6YH9t0yVubDPOSw0E88mt85Vbcwnals4HXfMnywwQCjPSNCZxB65+D8v WlHHLqaTWQVsEi9qVYV+NBiCao6fOP1LPALSsGDN1J/sD77QPc8kbXw8cbgVbeCd1zDD vZhQ== X-Forwarded-Encrypted: i=1; AJvYcCUaXe0ifC6hhNtwKYzJGvpH5JPVv8nGC2LOibw1w7ybZkB8y0DuTmHSb2k1VGN4OU50J2873lemMMUBsQM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/34FgqWEiTW6jZ8Wg642LpLE6R6midng1P8IVnAE5plbSoqFz qrzMY2T1Rq7fIdy/s2jKkdVkIHDAWrQb5JJvQ4aLkxypgUXXZlHfNEUIGiFagaUjNsYgNQI27Rd DeY0= X-Gm-Gg: ASbGnct3Motng8rVjG8jptnntJ/oWiyEYK7tJN1XoI30bYYnpZg/+4tY2dSEcPmNMJv Vb6n9yTKP3/8qnM9r6E+9LKoj/EfzBwL+/XrwBzoQxyXcXTRjGQV7UST0lXspFqfKSYSlpnwibl W5Muvtpi8BnuAJNtKhVjasgwUmE8em+ep2FR3am42Po7E/x7kNRZIrmMu6M2eFmT6UJ9Dx5DYa4 qL4HTZT+uAI7Gk2S21vbqHbxg+mhe1Epx32+M451qGZiHjvZ6hHgq6vD1b9uj73b7PDlsZbSJW2 kw13RDZ66isRDTSQm2mlw9ui7r3Gvpi29cWu8XOQf+YIUy1yMvRRlLjGInPdS6D45kM8GNCisWm 4KO8+fUQ4R9KzBEfPtbt1mZmNK6OXvX/hn9s8h5OXTlntZDnzjcUM9bZmMBjI5IC+Kmgo626LsR wYzY1qztZA2I7gt/wpTd5VyJXM7j+qAJmW2qH1zw== X-Google-Smtp-Source: AGHT+IH8beW/w0lcFBPafVCSixbqD2wiZbB5SYmhJXK7ukSZHGhJTLatf743/ai6p9Zl//4nec99vQ== X-Received: by 2002:a17:903:38c7:b0:299:dc97:a694 with SMTP id d9443c01a7336-299f55a1d97mr25472885ad.24.1763451018460; Mon, 17 Nov 2025 23:30:18 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:18 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 2/6] zram: add writeback batch size device attr Date: Tue, 18 Nov 2025 16:29:56 +0900 Message-ID: <20251118073000.1928107-3-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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" Introduce writeback_batch_size device attribute so that the maximum number of in-flight writeback bio requests can be configured at run-time per-device. This essentially enables batched bio writeback. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 48 ++++++++++++++++++++++++++++++----- drivers/block/zram/zram_drv.h | 1 + 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index ea06f4d7b623..be39fe04b9b1 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -588,6 +588,42 @@ static ssize_t writeback_limit_show(struct device *dev, return sysfs_emit(buf, "%llu\n", val); } =20 +static ssize_t writeback_batch_size_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct zram *zram =3D dev_to_zram(dev); + u32 val; + ssize_t ret =3D -EINVAL; + + if (kstrtouint(buf, 10, &val)) + return ret; + + if (!val) + val =3D 1; + + down_read(&zram->init_lock); + zram->wb_batch_size =3D val; + up_read(&zram->init_lock); + ret =3D len; + + return ret; +} + +static ssize_t writeback_batch_size_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + u32 val; + struct zram *zram =3D dev_to_zram(dev); + + down_read(&zram->init_lock); + val =3D zram->wb_batch_size; + up_read(&zram->init_lock); + + return sysfs_emit(buf, "%u\n", val); +} + static void reset_bdev(struct zram *zram) { if (!zram->backing_dev) @@ -775,10 +811,7 @@ static void release_wb_ctl(struct zram_wb_ctl *wb_ctl) kfree(wb_ctl); } =20 -/* XXX: should be a per-device sysfs attr */ -#define ZRAM_WB_REQ_CNT 32 - -static struct zram_wb_ctl *init_wb_ctl(void) +static struct zram_wb_ctl *init_wb_ctl(struct zram *zram) { struct zram_wb_ctl *wb_ctl; int i; @@ -792,7 +825,7 @@ static struct zram_wb_ctl *init_wb_ctl(void) atomic_set(&wb_ctl->num_inflight, 0); init_completion(&wb_ctl->done); =20 - for (i =3D 0; i < ZRAM_WB_REQ_CNT; i++) { + for (i =3D 0; i < zram->wb_batch_size; i++) { struct zram_wb_req *req; =20 /* @@ -1183,7 +1216,7 @@ static ssize_t writeback_store(struct device *dev, goto release_init_lock; } =20 - wb_ctl =3D init_wb_ctl(); + wb_ctl =3D init_wb_ctl(zram); if (!wb_ctl) { ret =3D -ENOMEM; goto release_init_lock; @@ -2826,6 +2859,7 @@ static DEVICE_ATTR_RW(backing_dev); 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); #endif #ifdef CONFIG_ZRAM_MULTI_COMP static DEVICE_ATTR_RW(recomp_algorithm); @@ -2847,6 +2881,7 @@ static struct attribute *zram_disk_attrs[] =3D { &dev_attr_writeback.attr, &dev_attr_writeback_limit.attr, &dev_attr_writeback_limit_enable.attr, + &dev_attr_writeback_batch_size.attr, #endif &dev_attr_io_stat.attr, &dev_attr_mm_stat.attr, @@ -2908,6 +2943,7 @@ static int zram_add(void) =20 init_rwsem(&zram->init_lock); #ifdef CONFIG_ZRAM_WRITEBACK + zram->wb_batch_size =3D 32; spin_lock_init(&zram->wb_limit_lock); #endif =20 diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 6cee93f9c0d0..1a647f42c1a4 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -129,6 +129,7 @@ struct zram { struct file *backing_dev; spinlock_t wb_limit_lock; bool wb_limit_enable; + u32 wb_batch_size; u64 bd_wb_limit; struct block_device *bdev; unsigned long *bitmap; --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 29B0B301499 for ; Tue, 18 Nov 2025 07:30:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451023; cv=none; b=mxWxvrWnBn5rfWud0HNEe8VjXrQ7qG5C9Y73Q9ipV+dR6T0yCAsk9CZgiwqsZ8Ef7XfgFrKII1DwaqcViwfp5nEsFAzuybtq7skZR15+oz3QFFjDYr75/VYsKA7sTQzTGGSiK9hUBE+grUEgEkfoo5B6ntnSEmi3mYh8G0DTtN4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451023; c=relaxed/simple; bh=nwoSFbvg2ufteXXIxITw7M1VYLp8Ig+96/yh4XFs01c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ulDFPsGJm3JktFNDWvikcmLNKR/8SPkyQ03X65qHDwhmGTiz9oOhbS4XUtFRxKN3xcSDfgKNczwR9j/ORW2jO0XQh6OaGwDb8pKKhjHrQ9veSg9Q/LNePW8SJKYuWxwvrR3gpTQ3GrspyVc6ASL3nsbW/N0Irx779+9dgtxjxLk= 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=nemYsUte; arc=none smtp.client-ip=209.85.214.173 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="nemYsUte" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-29555415c5fso59310515ad.1 for ; Mon, 17 Nov 2025 23:30:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451021; x=1764055821; 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=oLeikw5PJ/qN7DZHExYRK+yLqtuCtzgt/wbA4Xek4OA=; b=nemYsUteqpz0D21I+F9lJ/fGGDu4C2K6QdJi89Ao4tfILBNwg7kcKHCr4EZi6TKggD jjqJY8If/0fMJsy5gNay7RL53HIK5Ejn7bDxko5EzKZ+i7mSw+EMR+GpKxBu9xT8A+cr IVHb/s2JhdFfbYNS2M3kl2GP4OOTiZpJu/5Qk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451021; x=1764055821; 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=oLeikw5PJ/qN7DZHExYRK+yLqtuCtzgt/wbA4Xek4OA=; b=JJbpZj+5Ui2HWN//24YzoOjrqxqCNddVjRC/KMXFPYRG4wZskKLVPXgl/K6cxmIJFE hC8Nsig8M1JEL3e/kDQ2IW8EAWen4wSNyqEJYmzJDvXbHMNfLvbASsQcDRW/5y4hXRaT kaumpzJ1RWrV0QwwxedlpAnIje5oLm+kuNk8LNBcc6PJ11+prqeiOJtiLbqrscCPvNGa +RGMptY0p9PLzz98tTL2ZkiEkU8RS/+qjnLbU/zrMXOTSptEpmDxJGBBGoREtfprQCgO kF/D72B2zOdM9iACwmXzYC2JCdpW8iMLgOmfeLZONi2To/fZTVN5VqKMNFhqCWp5RkP6 Tlcg== X-Forwarded-Encrypted: i=1; AJvYcCWae4EMoQqWCFfmUuO6tJeO0/BzFe+Ez5vZKPYAfuozSVMb2v21QWg4B9vXG5VGBAN/LvuHRJHrD7jETEk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw48duoV5FhNmWQGDHsn3wCUWAeoAdkLW49Ll/kbe7OO4yOh08j KKs2N2CUiZrftGpUNtkFew8Zok9MF7rdMFHlR3XLWz9MNcIK064moAQNeR1GtQb+EA== X-Gm-Gg: ASbGncsJCmJNaqy2dpTdmepjTB1Qije3T1Pif1rHEQF+U4gOI4Lrbcm6ILMMqccfTU4 WEcH8L9ir1z2edeTesRzPdT5um5rjyh/zkedgEYPyZhdBz6+Bw0dU7hNxqmNy2MmIkdZkYgt/1G bpCIRasImFz6NBAHPGiKzCEEF8hbax1xM90qGdooHYXFnbxRDyNC9X50GfQ3+Cc02coHdYKaQOH 3t5aU3lK4VsZHP3gc1I2Rl5BzD/sEHxqjBZQOqWr06XkdSPlG/KO6LxhLHovprAVNDlBWOk+D6C dwmemCY0/Ext+dY7He6OTMvJypkRVp2LbJxsXpywKOh7whPJWwF6deySbcs/T+vh9/r1WuFUszO MqGh6/8vqDdFpmRwP8AfDsmsDBda4dPNxyftuBmVhktt8u8RTGsmAmfnpGGPVkNMISmOydKrCre m1j6XXYcQL0Mj7h1XRQmXda7hRs/RqfRUOIhqcNw== X-Google-Smtp-Source: AGHT+IFPr244P47pEFismSmInv5GHAI8P7iTWZDuNYFcomfeTvjtA6iKN1AEqAASeGrUa+CcERTWXw== X-Received: by 2002:a17:903:41d1:b0:295:7f1d:b02d with SMTP id d9443c01a7336-2986a6da8a4mr198877365ad.22.1763451021561; Mon, 17 Nov 2025 23:30:21 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:21 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 3/6] zram: take write lock in wb limit store handlers Date: Tue, 18 Nov 2025 16:29:57 +0900 Message-ID: <20251118073000.1928107-4-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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" Write device attrs handlers should take write zram init_lock. While at it, fixup coding styles. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index be39fe04b9b1..073a12132cb3 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -519,7 +519,8 @@ struct zram_wb_req { }; =20 static ssize_t writeback_limit_enable_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { struct zram *zram =3D dev_to_zram(dev); u64 val; @@ -528,18 +529,19 @@ static ssize_t writeback_limit_enable_store(struct de= vice *dev, if (kstrtoull(buf, 10, &val)) return ret; =20 - down_read(&zram->init_lock); + down_write(&zram->init_lock); spin_lock(&zram->wb_limit_lock); zram->wb_limit_enable =3D val; spin_unlock(&zram->wb_limit_lock); - up_read(&zram->init_lock); + up_write(&zram->init_lock); ret =3D len; =20 return ret; } =20 static ssize_t writeback_limit_enable_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { bool val; struct zram *zram =3D dev_to_zram(dev); @@ -554,7 +556,8 @@ static ssize_t writeback_limit_enable_show(struct devic= e *dev, } =20 static ssize_t writeback_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) { struct zram *zram =3D dev_to_zram(dev); u64 val; @@ -563,11 +566,11 @@ static ssize_t writeback_limit_store(struct device *d= ev, if (kstrtoull(buf, 10, &val)) return ret; =20 - down_read(&zram->init_lock); + down_write(&zram->init_lock); spin_lock(&zram->wb_limit_lock); zram->bd_wb_limit =3D val; spin_unlock(&zram->wb_limit_lock); - up_read(&zram->init_lock); + up_write(&zram->init_lock); ret =3D len; =20 return ret; --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 DA396303CBF for ; Tue, 18 Nov 2025 07:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451028; cv=none; b=Q3rSN4/pnpegxITnWSru9GF1jKLXkkLUwwtaJfInboFEpfc448IcRgpT6QvnvyeLDQzJOVGbNdx2S05+PSkC7PiR2gwDk3WdptEvXlsW0xk3tnadtTITniq3lK3X70j9AXdSTstKZDowpJoUijFFFd7/eyuZ+aoO0zIK2sal3Vs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451028; c=relaxed/simple; bh=wmywxqnED32HJVGKR47kqa9PyXCMZnodT2U0NloKWRc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=e3Kr0hn3+81cTz7t1o5b26lRnasY/HOHRDSAZLl0YJ4ynOmj7Ab6q/IjslR+7wZtOopVQ0OE+fKqwmPnF//vixbLshj9uW2sHu4kyHeo/EmBUjK+hNKFljy3u9veQaSgrX98yjTsHn9jpTpFUXVdxnlkEyn18rRL88lUgAtWmW0= 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=f7RCcnS4; arc=none smtp.client-ip=209.85.214.170 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="f7RCcnS4" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2981f9ce15cso65662685ad.1 for ; Mon, 17 Nov 2025 23:30:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451024; x=1764055824; 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=Y5s1n8emEbRVEeKrAhj4AgcEk08attFm4KUuCDQvhIk=; b=f7RCcnS4P6QkDgw7nfv/kpyvweLcO8vDcLA2AQn+BALqyCgL7y//6SiQAV9D6DyMAU dIHrrhl2bzQeHfZt0p8MHed04UhoxZiFBT1zcdkOdToxQ8o52yyP8nSAkxPHAc/lOBba ry/IR2hdG8zuRdiqvcafdt+8E9YBanBAbdRb0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451024; x=1764055824; 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=Y5s1n8emEbRVEeKrAhj4AgcEk08attFm4KUuCDQvhIk=; b=nUAw46x8RPmTYQpBHltd7JaSvKlz3/HfFZZQP/Y1AqderoHXqW6qhfX73JXw8WCGZh t6SihEGy8CPeldAUd9gAg0vdiLRS/yxLVpsJpe7lUfjfCDVGZvMXWukceIT1oY4m0uLv th62xubJ0TepSthWxLVVOG8Wrq7wOKogZDqnR817SWk6oE+1HOR11ruPmRw4Buhdwccd ySB63Q9VjfnKmj8ETmSVMACTARrq4d3JiNqsnIuYYcd60Xn2m6jgMXqN6LrJMCCFKOF4 lnGM1ffHsD103mZ0OJDzeJopg/aYxMGWl8E3qPdo6W8Q3UWH2YpEsvt2juOVTELyljo/ G/aQ== X-Forwarded-Encrypted: i=1; AJvYcCW1gl3QrWFDJj6+taX38jdGeyi0WqKFecMjDFxV0mXtxdP5ICH8+wTLt0loZsCV84bM4E4EW+Unla9hWeE=@vger.kernel.org X-Gm-Message-State: AOJu0Yzk0eIXN5QNrKusfZv7opHlnrJEDFlpxS49gm05e4vTSOwFzRdQ ujRbzqKBMOMMKFlaItwi8ofp9Ad3tDjGPKJKv0s+aSowhHHorkYEIrRr5Si6SyVLaQ== X-Gm-Gg: ASbGnctVecSz/L/I44tXyZR12+6x7wXYMlDfAYKQ9DoaxVcgpGbolrYK2uV5pDJqQdi VXVfKac4xbgVz090izp2sCd1i3rk6CUshfK5pPelCg4AMYCoPo5yJJHY5Xu33k3Gg7wKp9/JCTf yGWlYZvWHWWiWxKlVB0I+EaPkXhqog+3q47oOgappxR2H7WwF20Qhz7p6EkrBRdbgXV5VuGYxTi UX5L5ZWHIrqlfbAHxMfjjzobzsI3eV21PhHTWIl+X9hmqgiEUjetls7eKnnKwy6PnY8ci9pQqkA 54ZhRvoNSxOkD39JpAs4Ukv+93V5AfacE9c/JixlPr+UNvHPyM59D9uYdxauybjUJRkKl5h9O2K d4tC21ySlys5uBgeh2u6KzeSubgBB6vV9AjF+A3tEeTe+Vplp+rvEoeEWuSnwPVby9zOIkM98Mw 2LcIjlvU0rmkgqtJbyTNFpGz1L6Ps= X-Google-Smtp-Source: AGHT+IEFUxpDM4RZB/8QnapGp2d+TGrwoXbvzGp7l35DJ9jW3FWtnGNox8kM6z3lPxn7O64J6J5u/w== X-Received: by 2002:a17:902:f64b:b0:297:c638:d7ca with SMTP id d9443c01a7336-2986a6bf2damr172314225ad.14.1763451024123; Mon, 17 Nov 2025 23:30:24 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:23 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 4/6] zram: drop wb_limit_lock Date: Tue, 18 Nov 2025 16:29:58 +0900 Message-ID: <20251118073000.1928107-5-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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 need wb_limit_lock. Writeback limit setters take an exclusive write zram init_lock, while wb_limit modifications happen only from a single task and under zram read init_lock. No concurrent wb_limit modifications are possible (we permit only one post-processing task at a time). Add lockdep assertions to wb_limit mutators. While at it, fixup coding styles. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 22 +++++----------------- drivers/block/zram/zram_drv.h | 1 - 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 073a12132cb3..1cfb58516a8e 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -530,9 +530,7 @@ static ssize_t writeback_limit_enable_store(struct devi= ce *dev, return ret; =20 down_write(&zram->init_lock); - spin_lock(&zram->wb_limit_lock); zram->wb_limit_enable =3D val; - spin_unlock(&zram->wb_limit_lock); up_write(&zram->init_lock); ret =3D len; =20 @@ -547,9 +545,7 @@ static ssize_t writeback_limit_enable_show(struct devic= e *dev, struct zram *zram =3D dev_to_zram(dev); =20 down_read(&zram->init_lock); - spin_lock(&zram->wb_limit_lock); val =3D zram->wb_limit_enable; - spin_unlock(&zram->wb_limit_lock); up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%d\n", val); @@ -567,9 +563,7 @@ static ssize_t writeback_limit_store(struct device *dev, return ret; =20 down_write(&zram->init_lock); - spin_lock(&zram->wb_limit_lock); zram->bd_wb_limit =3D val; - spin_unlock(&zram->wb_limit_lock); up_write(&zram->init_lock); ret =3D len; =20 @@ -577,15 +571,13 @@ static ssize_t writeback_limit_store(struct device *d= ev, } =20 static ssize_t writeback_limit_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { u64 val; struct zram *zram =3D dev_to_zram(dev); =20 down_read(&zram->init_lock); - spin_lock(&zram->wb_limit_lock); val =3D zram->bd_wb_limit; - spin_unlock(&zram->wb_limit_lock); up_read(&zram->init_lock); =20 return sysfs_emit(buf, "%llu\n", val); @@ -864,18 +856,18 @@ static struct zram_wb_ctl *init_wb_ctl(struct zram *z= ram) =20 static void zram_account_writeback_rollback(struct zram *zram) { - spin_lock(&zram->wb_limit_lock); + lockdep_assert_held_read(&zram->init_lock); + if (zram->wb_limit_enable) zram->bd_wb_limit +=3D 1UL << (PAGE_SHIFT - 12); - spin_unlock(&zram->wb_limit_lock); } =20 static void zram_account_writeback_submit(struct zram *zram) { - spin_lock(&zram->wb_limit_lock); + lockdep_assert_held_read(&zram->init_lock); + if (zram->wb_limit_enable && zram->bd_wb_limit > 0) zram->bd_wb_limit -=3D 1UL << (PAGE_SHIFT - 12); - spin_unlock(&zram->wb_limit_lock); } =20 static int zram_writeback_complete(struct zram *zram, struct zram_wb_req *= req) @@ -992,13 +984,10 @@ static int zram_writeback_slots(struct zram *zram, =20 blk_start_plug(&io_plug); while ((pps =3D select_pp_slot(ctl))) { - spin_lock(&zram->wb_limit_lock); if (zram->wb_limit_enable && !zram->bd_wb_limit) { - spin_unlock(&zram->wb_limit_lock); ret =3D -EIO; break; } - spin_unlock(&zram->wb_limit_lock); =20 while (!req) { req =3D select_idle_req(wb_ctl); @@ -2947,7 +2936,6 @@ static int zram_add(void) init_rwsem(&zram->init_lock); #ifdef CONFIG_ZRAM_WRITEBACK zram->wb_batch_size =3D 32; - spin_lock_init(&zram->wb_limit_lock); #endif =20 /* gendisk structure */ diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 1a647f42c1a4..c6d94501376c 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -127,7 +127,6 @@ struct zram { bool claim; /* Protected by disk->open_mutex */ #ifdef CONFIG_ZRAM_WRITEBACK struct file *backing_dev; - spinlock_t wb_limit_lock; bool wb_limit_enable; u32 wb_batch_size; u64 bd_wb_limit; --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (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 91BB3304BBC for ; Tue, 18 Nov 2025 07:30:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451029; cv=none; b=CN9KU7buEu7Oiat7VriV0hoDz0AeCp73xcujUj0vmx52n/MachEND9vWsQtpPTTi4O3BM74SConPHjeBfDuSOzEm1ZlC9fCmJyjTeqp6eHulODtJXtec0DqzfWTYZYI4YZOFoS8Z0UILsOwOklmGRE9WDTrtRL/vfbiq1X+y03M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451029; c=relaxed/simple; bh=/5XXh+y6wWNZuJJspQ2Rz5x3DVKLEU5OZgWNXe2QjQw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fawgFxTrLYcZvDCJujVsudpvGRaIlRSbKwdwGNDvWnEGkEUriaRGKSMZ7mK/oZG62Ysjd2psRD/s2zrnVq8AKUbj/WS/nxnlTmS/HG6r7UDCgZPxgtZf8C2R7ORSiJr/P1dAwa2Sio+SFq749yWIU0+cghIU4UjI3u1ff0B9qEk= 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=AuSfcpR+; arc=none smtp.client-ip=209.85.214.169 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="AuSfcpR+" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-295548467c7so60700705ad.2 for ; Mon, 17 Nov 2025 23:30:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451027; x=1764055827; 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=jutJ+oFjCEnvR38mjyioMxG346Cjl5qLDOdOQPQB++s=; b=AuSfcpR+zOFox3TIqpAOXVxcBSDxD4vobis/BN/fjE9nNI5SIEWL5uPNq9p0sf0oLP ZcWr64hJ60e1Q+/nPIb661C6qlx8Z63r7b8Rbn3EEmUF+SwtFOkhNWbJ3/tASZFdvJrm pCb8PIgAJEG8HtTkINNwuIKr1NWjRas9Uop9M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451027; x=1764055827; 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=jutJ+oFjCEnvR38mjyioMxG346Cjl5qLDOdOQPQB++s=; b=gkpWohR7NBmXYJQNTZ8cvlv0/9oL73FtnMa4PGXUsmuutr7QQUTCkfiNVTnp5HiIH+ 0GL7phmmyP0OSNKzZUHIQNwTOxl6G3BskIrPqjGQOzToEm3gQ/HHy1X8JTWtRJW8wY67 6HfNEgAvx7K6fMVXSagI5ZD/x1xOedwrNa4ovUi/vbWEfGXRUdHjjb7QU6JDKUVXN4+S sN8nn+mj+NGZyrAtqYIT4QF/OBgd7+3tyRg7srxSf403pw3CS7nSmA6vB3wJl3V/Pef6 Og0s5OnKldCccGxv3JpQJAGNkGnHP7d5pCiSNpOVdgT73CiL/JTfCmXFyN0ymSxFfWKJ tPbA== X-Forwarded-Encrypted: i=1; AJvYcCV0E4r1T4QsRmxjZqXrXWnuEn9i6fBGWfRiS8Jm28CamGIc9zI/u1bwkjOy7t6Z/uGzeV3wTxRgn96KbsY=@vger.kernel.org X-Gm-Message-State: AOJu0YxqCBRzFUTN27IdskyJJUnnN+fwAnnjIZ4DIWtc4iDfOdKF3B6G HSJzz5bQT//xQcGLO1zo5eeXT4x7DGZPPZdtlx5/cXMSY2w6qTAKuUu0dRqKM0dcMg== X-Gm-Gg: ASbGnctNifhqjHdrdO97dqx4pa46ZnJEx8MXZKo+pzLaMeIKqSArF3rrjSXHzqVzWHs p28B7j5Ghf8WqZ4MxKFV/PQDofBJNCjzlpALYLP+mEQwCRjCkQmp8+RexRQCCzxCRugjn4uAXvm eFog7+FrX38jIXa9gst3q6KKfI5C33cNWS9SKARU15YuNJMZk/vsFWzA6Chm+lkD7sFzEr9DzVc tn2HzlcokhVqXlwJ3dlYH4oFHBubJnJ4/LQdgen0vgg8cQ9lQuFfERxe5+Du2xTuAu+7XIDP2vd ThdKS4nJnd391Ri8CYqHfsMU9rXxk0LGxe4FH4noeDbT27LBuRclFF7fEW2f2/hX1Y1BiA3DBy3 1c595SH1Gpf8H2lmedBisbu7mAF/EWfZeMu8+YdPeaxa0YiTnlqz5XTSFQcVttQwyEGApOdLtAa jfXzwNd5kKfY2Guq7z3yJiMZ94mz/cvxKgR0SqQ0goLaLOTzh6 X-Google-Smtp-Source: AGHT+IGTrSIAYxiYWQprs64AyT1Eid4jFJ2RFXxHbIDaASHF+bW10DGkq3qZf/woCLFk2DJb10FTEw== X-Received: by 2002:a17:903:384c:b0:298:68e:4057 with SMTP id d9443c01a7336-2986a759838mr194649485ad.59.1763451026976; Mon, 17 Nov 2025 23:30:26 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:26 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 5/6] zram: rework bdev block allocation Date: Tue, 18 Nov 2025 16:29:59 +0900 Message-ID: <20251118073000.1928107-6-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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" First, writeback bdev ->bitmap bits are set only from one context, as we can have only one single task performing writeback, so we cannot race with anything else. Remove retry path. Second, we always check ZRAM_WB flag to distinguish writtenback slots, so we should not confuse 0 bdev block index and 0 handle. We can use first bdev block (0 bit) for writeback as well. While at it, give functions slightly more accurate names, as we don't alloc/free anything there, we reserve a block for async writeback or release the block. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 37 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 1cfb58516a8e..93365811781b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -500,6 +500,8 @@ static ssize_t idle_store(struct device *dev, } =20 #ifdef CONFIG_ZRAM_WRITEBACK +#define INVALID_BDEV_BLOCK (~0UL) + struct zram_wb_ctl { struct list_head idle_reqs; struct list_head inflight_reqs; @@ -746,23 +748,20 @@ static ssize_t backing_dev_store(struct device *dev, return err; } =20 -static unsigned long alloc_block_bdev(struct zram *zram) +static unsigned long zram_reserve_bdev_block(struct zram *zram) { - unsigned long blk_idx =3D 1; -retry: - /* skip 0 bit to confuse zram.handle =3D 0 */ - blk_idx =3D find_next_zero_bit(zram->bitmap, zram->nr_pages, blk_idx); - if (blk_idx =3D=3D zram->nr_pages) - return 0; + unsigned long blk_idx; =20 - if (test_and_set_bit(blk_idx, zram->bitmap)) - goto retry; + blk_idx =3D find_next_zero_bit(zram->bitmap, zram->nr_pages, 0); + if (blk_idx =3D=3D zram->nr_pages) + return INVALID_BDEV_BLOCK; =20 + set_bit(blk_idx, zram->bitmap); atomic64_inc(&zram->stats.bd_count); return blk_idx; } =20 -static void free_block_bdev(struct zram *zram, unsigned long blk_idx) +static void zram_release_bdev_block(struct zram *zram, unsigned long blk_i= dx) { int was_set; =20 @@ -882,7 +881,7 @@ static int zram_writeback_complete(struct zram *zram, s= truct zram_wb_req *req) * (if enabled). */ zram_account_writeback_rollback(zram); - free_block_bdev(zram, req->blk_idx); + zram_release_bdev_block(zram, req->blk_idx); return err; } =20 @@ -896,7 +895,7 @@ static int zram_writeback_complete(struct zram *zram, s= truct zram_wb_req *req) * finishes. */ if (!zram_test_flag(zram, index, ZRAM_PP_SLOT)) { - free_block_bdev(zram, req->blk_idx); + zram_release_bdev_block(zram, req->blk_idx); goto out; } =20 @@ -975,8 +974,8 @@ static int zram_writeback_slots(struct zram *zram, struct zram_pp_ctl *ctl, struct zram_wb_ctl *wb_ctl) { + unsigned long blk_idx =3D INVALID_BDEV_BLOCK; struct zram_wb_req *req =3D NULL; - unsigned long blk_idx =3D 0; struct zram_pp_slot *pps; struct blk_plug io_plug; int ret =3D 0, err; @@ -1009,9 +1008,9 @@ static int zram_writeback_slots(struct zram *zram, ret =3D err; } =20 - if (!blk_idx) { - blk_idx =3D alloc_block_bdev(zram); - if (!blk_idx) { + if (blk_idx =3D=3D INVALID_BDEV_BLOCK) { + blk_idx =3D zram_reserve_bdev_block(zram); + if (blk_idx =3D=3D INVALID_BDEV_BLOCK) { ret =3D -ENOSPC; break; } @@ -1046,7 +1045,7 @@ static int zram_writeback_slots(struct zram *zram, __bio_add_page(&req->bio, req->page, PAGE_SIZE, 0); =20 zram_submit_wb_request(zram, wb_ctl, req); - blk_idx =3D 0; + blk_idx =3D INVALID_BDEV_BLOCK; req =3D NULL; continue; =20 @@ -1351,7 +1350,7 @@ static int read_from_bdev(struct zram *zram, struct p= age *page, return -EIO; } =20 -static void free_block_bdev(struct zram *zram, unsigned long blk_idx) +static void zram_release_bdev_block(struct zram *zram, unsigned long blk_i= dx) { } #endif @@ -1875,7 +1874,7 @@ static void zram_free_page(struct zram *zram, size_t = index) =20 if (zram_test_flag(zram, index, ZRAM_WB)) { zram_clear_flag(zram, index, ZRAM_WB); - free_block_bdev(zram, zram_get_handle(zram, index)); + zram_release_bdev_block(zram, zram_get_handle(zram, index)); goto out; } =20 --=20 2.52.0.rc1.455.g30608eb744-goog From nobody Tue Dec 2 02:49:47 2025 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 4CFCF3054D1 for ; Tue, 18 Nov 2025 07:30:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451032; cv=none; b=hahhzjhooLe6yfjhQ56dzd7B/sXosKEsorZPZdyAOEgfArnLvNuiv0eccBkfcA39VKbXP9UaPbhA2I8WsE6Lo1JaHmeCnQyjn9Zq6hddmtMdV9g4kyS4qQ6BfALsXbHH/Py3ZfOwJESoGzlrlo8TdPDu40zcj/u4mMeV622CBf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763451032; c=relaxed/simple; bh=83Tb0fnS8qFAanAr2oHDxC3ExyzkwPCMehzRY3O07yw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tybMualBC3bah4MhJVe2OSDyCDzx6wfb5eMMiUURTN/WCixvLdyznY8bBXOdPCpNu9fWB/I2UtSFxziafswsbf1eHhY8qu5P7GM6a2qdZhxnB60291bqg+dwpaXLoaU09buMZqlgC+2bJmToyu/53fAIaCW05TKawmHBrgkKzdI= 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=QLhmx3tl; arc=none smtp.client-ip=209.85.214.181 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="QLhmx3tl" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-29844c68068so52341475ad.2 for ; Mon, 17 Nov 2025 23:30:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1763451030; x=1764055830; 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=spTZ0mW8CsK7UvPfRSf8MeqzEHevliS4YgLZ2IGrH9o=; b=QLhmx3tlk+Ugapp+9raLzh8dW82alag814+KEwq10D/r7kel7p+0ghoRvjiIddv3rg t68W7Z3SSbAFeI8oiI0sovUSBzOycA2KCNDhoWJnwUieOmxdjEM+abJlii1xXKSYs734 +b5uVCSAUkqNSbgBxoGlB6A9PTEbng4kOQbos= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763451030; x=1764055830; 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=spTZ0mW8CsK7UvPfRSf8MeqzEHevliS4YgLZ2IGrH9o=; b=lzURaiLr3YWi5xXrrNXgMFd+IEMeXt5VfP5Vzj9cE2Sl3RcRpnq7cjJD42EByfa+Qo ZsoBCggQrFEmoxS2U1O/Fo8odW7lPQcMvzqpqPWr1d1NQqidRlbL2QPscK0KSD7Fl2Rk NPGe97i0x+DTs3TSPzFRtOwjrC8KEzxLmwq7BpIOoQIykGrsTIk7RW0nG9VJbiCWO1JV AZbiK0gj+JVp+vOJVntZStgT0ZpBhR3jx+ItwPp5ZJabL8LX7JnV/Ze20wY8Nh/KlLkC 4teEiplq0zbrYrVQGyy7TVoKar388WaX5RfI7xEHJxXSZ6Ln5vfez+9Se7/jLTN2Xg/8 dNpA== X-Forwarded-Encrypted: i=1; AJvYcCXjg4PbDYaKwsFXnR8R3Wl/67lhuDgbcMRBfx9FLTTa5S/QhorHo09YtzPLwkiinSgtfhHciFRJ/yprDkw=@vger.kernel.org X-Gm-Message-State: AOJu0YwbKn0Q//ADNbPFCTMfpehxo4DGMKCDLyM9clK8YeiZ+d6x5nV7 dI113kOB4ql5HPfCsCzRsn64ZfnJtlxPxsOk2ahndyWeMSF8iBhiQpuvb46ybGvztQ== X-Gm-Gg: ASbGnctYWPZ4UwL0yN0e0zRBmAQVLYn69CxhSxYL41C4TAOSbRo9a0K2vbRETpnxFP8 WWP5Pe79hQPVtAvQPD9eGTysGainqhFJ+2V3pNCsp5L6aKRJpPsIR+/cDlG3qD210aK/h1UxepW hkLKTsIgwBlUib+lXerLfFY4+2LXDn6Eauc9hxqbLBvBDr+gt54IyKYovGyiK5pKKKDrtFHn32r L2l/vwXviBASs/2oozeD+sxsRpFnc43XogDCZr9QOXA9CYrt73yqPRvBE6boA4M2zf5+6v40zgf BxkMBJL381UlMJJ4E8YHaBi27gah7lbaYQAIqdKDsox0G9DWvrTDsuPzsz7J7WjSTgGvgGnWwGL WJGri60ILmIg63gEa/EUMujMwBnqgHInNp0stFlmWQhH1tyUMqEXxApt3bcjRYvEt0axHfgnIql QyCdalWe3n9HeyvrejstvYhlmDc7BjergnxtYRRw== X-Google-Smtp-Source: AGHT+IHfTiRsjOnMwAynan9LOvPqDmjC2nm6QOrpvZK/BiOoKhMq5MVjGe3vyD/jJGgU5d35MZnMsQ== X-Received: by 2002:a17:903:19c3:b0:295:551b:4654 with SMTP id d9443c01a7336-2986a6ec988mr179562065ad.23.1763451029659; Mon, 17 Nov 2025 23:30:29 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2401:fa00:8f:203:beba:22fc:d89b:ce14]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2985c2568ccsm163926215ad.50.2025.11.17.23.30.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Nov 2025 23:30:29 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Yuwen Chen , Richard Chang , Brian Geffon , Fengyu Lian , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky Subject: [PATCHv4 6/6] zram: read slot block idx under slot lock Date: Tue, 18 Nov 2025 16:30:00 +0900 Message-ID: <20251118073000.1928107-7-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.rc1.455.g30608eb744-goog In-Reply-To: <20251118073000.1928107-1-senozhatsky@chromium.org> References: <20251118073000.1928107-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" Read slot's block id under slot-lock. We release the slot-lock for bdev read so, technically, slot still can get freed in the meantime, but at least we will read bdev block (page) that holds previous know slot data, not from slot->handle bdev block, which can be anything at that point. Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zram_drv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 93365811781b..77d0e636e053 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1980,14 +1980,14 @@ static int zram_read_page(struct zram *zram, struct= page *page, u32 index, ret =3D zram_read_from_zspool(zram, page, index); zram_slot_unlock(zram, index); } else { + unsigned long blk_idx =3D zram_get_handle(zram, index); + /* * The slot should be unlocked before reading from the backing * device. */ zram_slot_unlock(zram, index); - - ret =3D read_from_bdev(zram, page, zram_get_handle(zram, index), - parent); + ret =3D read_from_bdev(zram, page, blk_idx, parent); } =20 /* Should NEVER happen. Return bio error if it does. */ --=20 2.52.0.rc1.455.g30608eb744-goog