From nobody Mon Feb 9 09:53:20 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.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 8992333971D for ; Tue, 16 Dec 2025 07:14:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765869247; cv=none; b=Tr2AFFPsfu1IDC/Ye8aCPHWSdp/Kw7zkvh84W2PCsJ/LJ2AeJJPM1YzMb0h1cwNKG9TpDVQmY3gqEpAql9O9/tFTDpCFzRqZuew6HhEZCuNKXAI4ebl9lZumGqrg2N7zEzTew42duD4tCHBNMIo5kT88XR7KaB3bp3rNCq+RPLo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765869247; c=relaxed/simple; bh=DiAzDYRqTBmi+hx9n0dYlwt97SWgA3PLS4cNusI+AAU=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=A+VCyHrFabo95n37D3tL3NjMFxv7SioFR5CsyCLFbwzRvMu9YCbDy68qmxaJkCRwYTPqQ4Ee/BuidgbewFac/BJc8xXjgb1wTpotm84pFynyCqwWrVUHjuYCL7Pw9KqfQdEmddND1oeEwu4HQPxVmK52gqOPPiCyz/f7gILMm74= 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=EU/cCnUp; arc=none smtp.client-ip=209.85.214.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="EU/cCnUp" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2a1388cdac3so4749605ad.0 for ; Mon, 15 Dec 2025 23:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1765869243; x=1766474043; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=oNatl6J6BcJk/S0sXAT6q/VLY30ES4IaJnzY7IJFPDI=; b=EU/cCnUpbxAhTWb+79IXHWV5LDUCHGqEVtmzJ/SvYiL6HrjitB2L+HlFhRH/2RaTm5 mDJsa4BqKL3qyb/NtrGoOQMP2G+0q+C5GKwygyTBln/1NgwaHfNpeh7ngc5e9yZHNGLc 09bX4/WJ5EDpvVnE6H2tJrMCcmPnVK2f2k3nk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765869243; x=1766474043; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=oNatl6J6BcJk/S0sXAT6q/VLY30ES4IaJnzY7IJFPDI=; b=J37ZJ8o2ZQwLuuuFGwcmI2BCHCvwxUn/7ze12LnlHcT0O+15aRsr0IK3cH7lvBNcIz c5/hfqKIipNot6OJp7nTx8WwkllXMG3RZXDMZFMmcZe5J4TeeXsCzClXug6xthV1dgzh pGH3FmKilU/ZNBRMXeHTtcpTmgQWw2rqx5wQs7XwfNQFRMDZLk7wEEZDg2rzrPf1bJyg +k5T1Tsdjxy3INeI8RSbqfSEG485lGJmijHBL0tM10CiP2h22f+vVOX9lG7fUV2QlvSd /YQdelxzhTgapp7LGJ2cCRTukcjO+6Vpm/ZBiVC/qFKPnQHvLbvMuc7fxwVb7fUjrC0O dMXg== X-Forwarded-Encrypted: i=1; AJvYcCUTDG0YC3lXNfqkXoXioDLM+pXoemt1qHl43Hb3vT0OsIF7Sc1FhhyUcbGDm0CE7PY2p8+6XIN9O+zn91g=@vger.kernel.org X-Gm-Message-State: AOJu0Yxd3omh3t7lX3kjSJw+cCIk8Ux/pfy99bRF+CNv4Gz6m0758dEZ jot+rc0sIXv96Xm5wHpoOHtepT4Fp7Bf7lx3OTRZGzupzPybZ5sp3dy8EnS2xeFMNg== X-Gm-Gg: AY/fxX4c1bqLaPq8fVgahLXITre6TkuZxQIP9Tl3GoVJnRSrW8qcX7VmEwq02wx7sw4 bPjLf0Jn3m+Gqc2eiAG8jxH0JilqPcG7WIn3n698Mw1fjhVNGql6AHKVqUvjNZop1oosscpssd6 g1nwkk7EIY5UC2YVUMAg8a7HugBK3BZLoX3YNMYgtnpR2fRXSZXaYZErOUvZvYTL4eSiOd1KZUx V/cpZM6Dp8/mPucKLirV+pvUS6dq3jOg2OWKt4FJi/X7QChpM+ou4U06RwoUIBeP43Zj858TsaO imwQXywkBFH7G/ZFK42QzOEHnIoTXdeuawLncBqbxnwpp7ADePrmQ92Il3cHyOgx7P9TSm0DIc3 NFHhlesmaPne4oDxfJI+blkhUtCYQAiD8ZC6cVfUPcvjBHwFE1tU4RLpWPfradFakmcTYiTdk5v y+fhti2MaFEg7bIZHeTA7psaqReSbg2A+uJda5917H4NhWw3I8aCNf7DBDZQbGt/4tIbDbXDSLX g== X-Google-Smtp-Source: AGHT+IG0syAFJhjlxLN2Aw5XB+eZPhRIhKo3rCILYb8gAbNKQjHe4RCRPMTSFXN3FJZtNVG/AkOQdg== X-Received: by 2002:a17:902:cecb:b0:2a0:de4f:ca7 with SMTP id d9443c01a7336-2a0de4f122bmr54142285ad.1.1765869243447; Mon, 15 Dec 2025 23:14:03 -0800 (PST) Received: from tigerii.tok.corp.google.com ([2a00:79e0:2031:6:a48f:6b66:399d:86cc]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29f2563b116sm119253685ad.102.2025.12.15.23.14.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Dec 2025 23:14:02 -0800 (PST) From: Sergey Senozhatsky To: Andrew Morton Cc: Minchan Kim , Brian Geffon , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, Sergey Senozhatsky , Greg Kroah-Hartman Subject: [PATCHv2] zram: drop pp_in_progress Date: Tue, 16 Dec 2025 16:13:42 +0900 Message-ID: <20251216071342.687993-1-senozhatsky@chromium.org> X-Mailer: git-send-email 2.52.0.239.gd5f0c6e74e-goog 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" pp_in_progress makes sure that only one post-processing (writeback or recomrpession) is active at any given time. Functionality wise it, basically, shadows zram init_lock, when init_lock is acquired in writer mode. Switch recompress_store() and writeback_store() to take zram init_lock in writer mode, like all store() sysfs handlers should do, so that we can drop pp_in_progress. Recompression and writeback can be somewhat slow, so holding init_lock in writer mode can block zram attrs reads, but in reality the only zram attrs reads that take place are mm_stat reads, and usually it's the same process that reads mm_stat and does recompression or writeback. Suggested-by: Greg Kroah-Hartman Signed-off-by: Sergey Senozhatsky --- v1->v2: - updated lockdep assertions drivers/block/zram/zram_drv.c | 32 ++++++++------------------------ drivers/block/zram/zram_drv.h | 1 - 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 634848f45e9b..9f91eb91dc72 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -902,7 +902,7 @@ static struct zram_wb_ctl *init_wb_ctl(struct zram *zra= m) =20 static void zram_account_writeback_rollback(struct zram *zram) { - lockdep_assert_held_read(&zram->init_lock); + lockdep_assert_held_write(&zram->init_lock); =20 if (zram->wb_limit_enable) zram->bd_wb_limit +=3D 1UL << (PAGE_SHIFT - 12); @@ -910,7 +910,7 @@ static void zram_account_writeback_rollback(struct zram= *zram) =20 static void zram_account_writeback_submit(struct zram *zram) { - lockdep_assert_held_read(&zram->init_lock); + lockdep_assert_held_write(&zram->init_lock); =20 if (zram->wb_limit_enable && zram->bd_wb_limit > 0) zram->bd_wb_limit -=3D 1UL << (PAGE_SHIFT - 12); @@ -1264,24 +1264,16 @@ static ssize_t writeback_store(struct device *dev, ssize_t ret =3D len; int err, mode =3D 0; =20 - guard(rwsem_read)(&zram->init_lock); + guard(rwsem_write)(&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)) - return -EAGAIN; - - if (!zram->backing_dev) { - ret =3D -ENODEV; - goto out; - } + if (!zram->backing_dev) + return -ENODEV; =20 pp_ctl =3D init_pp_ctl(); - if (!pp_ctl) { - ret =3D -ENOMEM; - goto out; - } + if (!pp_ctl) + return -ENOMEM; =20 wb_ctl =3D init_wb_ctl(zram); if (!wb_ctl) { @@ -1358,7 +1350,6 @@ static ssize_t writeback_store(struct device *dev, out: release_pp_ctl(zram, pp_ctl); release_wb_ctl(wb_ctl); - atomic_set(&zram->pp_in_progress, 0); =20 return ret; } @@ -2622,14 +2613,10 @@ static ssize_t recompress_store(struct device *dev, if (threshold >=3D huge_class_size) return -EINVAL; =20 - guard(rwsem_read)(&zram->init_lock); + guard(rwsem_write)(&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)) - return -EAGAIN; - if (algo) { bool found =3D false; =20 @@ -2700,7 +2687,6 @@ static ssize_t recompress_store(struct device *dev, if (page) __free_page(page); release_pp_ctl(zram, ctl); - atomic_set(&zram->pp_in_progress, 0); return ret; } #endif @@ -2891,7 +2877,6 @@ static void zram_reset_device(struct zram *zram) zram->disksize =3D 0; zram_destroy_comps(zram); memset(&zram->stats, 0, sizeof(zram->stats)); - atomic_set(&zram->pp_in_progress, 0); reset_bdev(zram); =20 comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor); @@ -3127,7 +3112,6 @@ static int zram_add(void) zram->disk->fops =3D &zram_devops; zram->disk->private_data =3D zram; snprintf(zram->disk->disk_name, 16, "zram%d", device_id); - atomic_set(&zram->pp_in_progress, 0); zram_comp_params_reset(zram); comp_algorithm_set(zram, ZRAM_PRIMARY_COMP, default_compressor); =20 diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 48d6861c6647..469a3dab44ad 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -143,6 +143,5 @@ struct zram { #ifdef CONFIG_ZRAM_MEMORY_TRACKING struct dentry *debugfs_dir; #endif - atomic_t pp_in_progress; }; #endif --=20 2.52.0.239.gd5f0c6e74e-goog