From nobody Tue Apr 7 18:51:34 2026 Received: from mail-oi1-f173.google.com (mail-oi1-f173.google.com [209.85.167.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 7512E44E023 for ; Thu, 26 Feb 2026 19:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772134199; cv=none; b=E4pJ1CAylJJBHrD2yXrfFRUW17ST+BURu1B+mOpBCAwOA8zqgW7fVYXxOuDuMI/KRo5VxI4r5HmkUbXM6WHJGwZAIkUxyGTAHKhiWfhF7+DX/DAc//3Uiqcb5uH95fxw8JoH4hJgHvbtDDydRDnAP7qhwqJcFlaQvadi4t1ISZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772134199; c=relaxed/simple; bh=I/6VfJFxIb4g0o8KWA7c8Glu4mFHW8x/F43F+Sqs7Rw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KvD2DhPUgiNMXf6lyT2b9mKoRHD/Uc7OU/T5MU567//Drw2SCptKxSgo3ltRXGgNjKqVAKkjmQDRSCgA8hXR8SgmXdCmTvjWlO6h5HLvpcu+sh50CB2of4fnRbjniuDxHsOrmMKpbwUqfuZSCagUm+4JZ4+te1sMJKwffFIUgZM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Le1BRfQ7; arc=none smtp.client-ip=209.85.167.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Le1BRfQ7" Received: by mail-oi1-f173.google.com with SMTP id 5614622812f47-4638e238094so738476b6e.3 for ; Thu, 26 Feb 2026 11:29:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772134192; x=1772738992; 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=qPksRk4LAnsoFLQrd4UcyaPDU9XJzdmOlJT+foKyitQ=; b=Le1BRfQ7f7OzIrthjeVdUlhU6gRFJQWUrBHuMVsnV6j3mycFZ6REiUIw/BPMx1SG4/ 7EjOfvPLKpg/MzcL9CAgQ37r44Hk5Ku4mW60OwPdm+1J/0fzw7ygSI2xAlKy3jim+vL1 0alld4trryC6EEeXEr5JDHhoPSN6JF+7EmqzryDjiWEjqt6Zg+V+3qy1u+oVG5/lAZtq 7npqNj3/UR+LE0t+GMpRzExQFR/cm7tMcpRzkPbesfj2ZoICgWg8gq0clVEvgrAR8BFC AR9LOWXeMK4mgM8NyZy1a1LJgZRKAqYjtI2KussTEa1s7YdZtXimjR5ian1ziJKQkV5Q 3c9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772134192; x=1772738992; 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=qPksRk4LAnsoFLQrd4UcyaPDU9XJzdmOlJT+foKyitQ=; b=YikoW888tyZBGQY3U2fRIWozck7fc/a4piYyunZakMfzut+N+3SvShBCzx1jyPOQrk o4Gng5SZy1XOWY7mxsjwRb8pAK0HJ/dRiz1jT0Ry5zpsxNNkU3ZqxFk+/Kz1f2kLUAcv rb9DpC3rU7Pztd7nqwF74FsVppxc3TsR+k43ZxBLyuvwP27zD8olBWfGkGofstSiq7GZ 6TDKiF2Gc5qwgYp30689QvG/7dXETgVo8aLr+5qJL6P3iLytAzTgiUTVmxzYO6cIpUFK WrV7+L40oTVDhXUeNk1P5dOgroC6Bz3f9iouOKC8lV8t2cO5by4ZPzBHjps6a78X6qFJ Zr5w== X-Forwarded-Encrypted: i=1; AJvYcCV6p77l0YSwXVWThDukg2mHV3uhHo1AJSA1/Xod+Lj30tJhltMIyPVApzHpMnp3gy7m+vG0nor0FXxH4Yc=@vger.kernel.org X-Gm-Message-State: AOJu0YzvVLkyU5jmVQ3BvLUeuDjqVP2RQ4tphdPdongGz7lsKqmfzabm QUvGZKYDoICh9Nuyaj6s8YiMnl/0QUQtArhsrqMRbsCSclRUogXEwLQF X-Gm-Gg: ATEYQzzjzTFFQeklhCyH9i7Uaqeq7Tdvs11JUQCzJNxBu0ff1OvQdxzTAE3D4l7BHtm PFN4dfLuV482y6Qb+nDwY9Zz14bcg85Lntjn1gLR3cL8yofaP/mYZCE3qJllNR+XrQtfqxRY/os bIqBWvLG+Y1BlBUyDTg2DUZF26c2tZfap/E5omMQ359F1eO1SWOrfBdnBMheJ7SG1Xkap9zUNQD e3RAethgLK8rAhU2lj/k5W7cS7zHIXS6L/r86KT+8hNr3Ml3uCSsrImezwtTW/1g1/8K0LD/i/9 A3hNt8nPqCe3tuzmeRKRRD3Y603mt5gRcqG4kjLAPBR2yHz1Of2ZYTrvv+fGoAlM4qXCmWpgN9D EXPOQrIPryJWgKKy51E5qlTjxOOBTP+TBCo4VD9hcoOOQiISbi1SMWro5qptwVohlBRfCkbIin8 PXeyKSW7zpLL+GHx40JtMyGA== X-Received: by 2002:a05:6808:4707:b0:45e:f0ae:bc0f with SMTP id 5614622812f47-464be9cbef3mr147302b6e.23.1772134192235; Thu, 26 Feb 2026 11:29:52 -0800 (PST) Received: from localhost ([2a03:2880:10ff:59::]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4160cf9b24dsm2713097fac.7.2026.02.26.11.29.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Feb 2026 11:29:50 -0800 (PST) From: Joshua Hahn To: Minchan Kim , Sergey Senozhatsky Cc: Johannes Weiner , Yosry Ahmed , Nhat Pham , Nhat Pham , Chengming Zhou , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH 7/8] mm/memcontrol: Track MEMCG_ZSWAPPED in bytes Date: Thu, 26 Feb 2026 11:29:30 -0800 Message-ID: <20260226192936.3190275-8-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260226192936.3190275-1-joshua.hahnjy@gmail.com> References: <20260226192936.3190275-1-joshua.hahnjy@gmail.com> 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" Zswap compresses and uncompresses in PAGE_SIZE units, which simplifies the accounting for how much memory it has compressed. However, when a compressed object is stored at the boundary of two zspages, accounting at PAGE_SIZE units makes it difficult to fractionally charge each backing zspage with the ratio of memory it backs for the compressed object. To make sub-PAGE_SIZE granularity charging possible for MEMCG_ZSWAPPED, track the value in bytes and adjust its accounting accordingly. No functional changes intended. Signed-off-by: Joshua Hahn --- include/linux/memcontrol.h | 2 +- mm/memcontrol.c | 5 +++-- mm/zsmalloc.c | 4 ++-- mm/zswap.c | 6 ++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index dd4278b1ca35..d3952c918fd4 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -38,7 +38,7 @@ enum memcg_stat_item { MEMCG_VMALLOC, MEMCG_KMEM, MEMCG_ZSWAP_B, - MEMCG_ZSWAPPED, + MEMCG_ZSWAPPED_B, MEMCG_NR_STAT, }; =20 diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3432e1afc037..b662902d4e03 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -340,7 +340,7 @@ static const unsigned int memcg_stat_items[] =3D { MEMCG_VMALLOC, MEMCG_KMEM, MEMCG_ZSWAP_B, - MEMCG_ZSWAPPED, + MEMCG_ZSWAPPED_B, }; =20 #define NR_MEMCG_NODE_STAT_ITEMS ARRAY_SIZE(memcg_node_stat_items) @@ -1345,7 +1345,7 @@ static const struct memory_stat memory_stats[] =3D { { "shmem", NR_SHMEM }, #ifdef CONFIG_ZSWAP { "zswap", MEMCG_ZSWAP_B }, - { "zswapped", MEMCG_ZSWAPPED }, + { "zswapped", MEMCG_ZSWAPPED_B }, #endif { "file_mapped", NR_FILE_MAPPED }, { "file_dirty", NR_FILE_DIRTY }, @@ -1393,6 +1393,7 @@ static int memcg_page_state_unit(int item) switch (item) { case MEMCG_PERCPU_B: case MEMCG_ZSWAP_B: + case MEMCG_ZSWAPPED_B: case NR_SLAB_RECLAIMABLE_B: case NR_SLAB_UNRECLAIMABLE_B: return 1; diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 88c7cd399261..6794927c60fb 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -980,7 +980,7 @@ static void zs_charge_objcg(struct zpdesc *zpdesc, stru= ct obj_cgroup *objcg, rcu_read_lock(); memcg =3D obj_cgroup_memcg(objcg); mod_memcg_state(memcg, MEMCG_ZSWAP_B, size); - mod_memcg_state(memcg, MEMCG_ZSWAPPED, 1); + mod_memcg_state(memcg, MEMCG_ZSWAPPED_B, 1); rcu_read_unlock(); } =20 @@ -997,7 +997,7 @@ static void zs_uncharge_objcg(struct zpdesc *zpdesc, st= ruct obj_cgroup *objcg, rcu_read_lock(); memcg =3D obj_cgroup_memcg(objcg); mod_memcg_state(memcg, MEMCG_ZSWAP_B, -size); - mod_memcg_state(memcg, MEMCG_ZSWAPPED, -1); + mod_memcg_state(memcg, MEMCG_ZSWAPPED_B, -1); rcu_read_unlock(); } =20 diff --git a/mm/zswap.c b/mm/zswap.c index 77d3c6516ed3..97f38d0afa86 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -1214,8 +1214,10 @@ static unsigned long zswap_shrinker_count(struct shr= inker *shrinker, */ if (!mem_cgroup_disabled()) { mem_cgroup_flush_stats(memcg); - nr_backing =3D memcg_page_state(memcg, MEMCG_ZSWAP_B) >> PAGE_SHIFT; - nr_stored =3D memcg_page_state(memcg, MEMCG_ZSWAPPED); + nr_backing =3D memcg_page_state(memcg, MEMCG_ZSWAP_B); + nr_backing >>=3D PAGE_SHIFT; + nr_stored =3D memcg_page_state(memcg, MEMCG_ZSWAPPED_B); + nr_stored >>=3D PAGE_SHIFT; } else { nr_backing =3D zswap_total_pages(); nr_stored =3D atomic_long_read(&zswap_stored_pages); --=20 2.47.3