From nobody Tue Dec 2 02:58:12 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