From nobody Tue Apr 7 18:51:21 2026 Received: from mail-oi1-f178.google.com (mail-oi1-f178.google.com [209.85.167.178]) (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 23BD9314D18 for ; Wed, 11 Mar 2026 19:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773258724; cv=none; b=k3DPeR6Uii8dyRDrLOUj/m9VJnY6R8GHxI7RCVJvY62ilzcquUsWyeRZtsc92x9VxRZOrphRpmM0ya4oaszX4QnOeQpgBaXVExxHEGCrl7cR6LJIjUe1csUW2BJ2696C/J0W2YGY+93GtVRoJijqnwrcKhp6nOrHc7tmcbX7h3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773258724; c=relaxed/simple; bh=FlX1JxtGQ4L9YMM6+aD5mJkMLFZBnO5Nl+spgsSmm9o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hN2istWOdLpKLC9FAhTnpSQ/xhU0coL0z14uROVxTqfAxBC+y0RsLdg5X2oX24ByP22tUsLDzFX4/IP/+wQtORBpahi60hkzZm4f2udYeKp7dWwPMcc6BJVeJG2zAaTxKSAPe1grQ7SDdZCZR5uUD2yHlFqDbJX1CPhytLH2XM4= 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=YbPANPoy; arc=none smtp.client-ip=209.85.167.178 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="YbPANPoy" Received: by mail-oi1-f178.google.com with SMTP id 5614622812f47-463f00cda04so192182b6e.2 for ; Wed, 11 Mar 2026 12:52:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773258719; x=1773863519; 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=mnVFn/QWUod1peerD4NOctgVgrZtb1oHuY7D76awS8Y=; b=YbPANPoyXW0LwO6glEfUA2Fpx9mVsjufWa/85vXlALMXac8oAWxKTspdMrtCR9gc5J CktD1x7RR/vjNVCGXyFDo1tjYh21yvl8rpXqKNhQf4LSdhJzlNaRVyPZDK2QHzM8lljj 9yw++01j1o3GYGLxic4jo9kNZE7WLN4AGht3IH+Rj2UfbTaCfZKFzvSPD+GCstaKoUji +cHjUCNBpNmuBShzEEF2OPvnGf7tgRJggFO006DwtCJnUUX9KBRpYzQQ4iX0bjCssiVf 59stEfMDFLUS6HtZsbL/i+wItGXOVUVsiKrQMX6r3c/Csdfv+2WrBLRl0n7TZAvdR26R WKwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773258719; x=1773863519; 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=mnVFn/QWUod1peerD4NOctgVgrZtb1oHuY7D76awS8Y=; b=iMHPG6eBZnhGdMXuBVbYI5zEUP9xm7ibtuKxvO/eupHGukVMq9Epdea3awTpDYgwOx 89g9KpxEEQggm+vjB1F5zaicW208+dxlNiY0DC+aLGKtZxd9GCTwzfAkLW+/E9MdSE7U c7qxCmln1G9zTOLZnuwuAIq8ysyqNDOUtYBX+g4XqZIhC63YwqaBzDIhHCytRNa3WLNA tH+I3hwS7DZg8TNENPli/Ke6LBZmpFo4nyBhwXjpoEq/OrLUGId9er2bgpIlJPUDbTGj bzRh/VArNo89EZQRBpqFbWFxsuWQx3k6gDHp9zETbHL64NvSI8ow2KfWGf1PWY69mBM/ wHKg== X-Forwarded-Encrypted: i=1; AJvYcCVhzbwCEw8BoTJK3WA7Tjg6RefqejPLM/bI7tRY++DUB/ibRluplIwzoHz7cOPtNbkLs0CMmsxkzU6S1yU=@vger.kernel.org X-Gm-Message-State: AOJu0YzGMsrf+KU3Mrx4kK9K3/4vwLfLC/bx0bmqOVDHzINiyBpeEss2 W9a4Z6Tgg7V3bkFb06MvIMAvZX+WgMyEI97ISJsA78yuvjn5qbko4bIS X-Gm-Gg: ATEYQzzqb2zQAJG1dGWoAxf6vy7McSKo3M7BrY3lBOwKGAyHyFdzOVlyvZk6wqgX7gf nSFwFZa+mURHDKP7Z/OY31LY74f4yjkpHdt3l7w8YYvxxLxZ2xNS2g2Wofb4s+mz3XMKXy0jmkX V7yvTFXcMAkvh371ME7dvC8EztpFZn17i0oFlY74LQglczc1XUiXUW3ws8zop0YG+skumimiExF JDi34k4XS6jj6PUCJaV4MFtzccVgIdBs0stI0pXZhTFJphlEQS6X6mmXkSYXi8+rXNHb6VYcxf9 XNYxzPq39Z5I9ZBp+mcXU+TOsxHfCWZlwcsECVD2Xpd4fktY1wheUKa99h3Sdp1bYq9jQLBcOAt sBcv9xh+JkDo1LnyIyx0zoQTzdUSv9TdMLALVwweVIoBHhcv57Ea07XGUBYNTLCqT6aqplqipga 2vdSXSzBhuQ4spt3IGu17nFg== X-Received: by 2002:a05:6808:6a83:b0:462:d09a:cdca with SMTP id 5614622812f47-46733545ca6mr2042383b6e.32.1773258719499; Wed, 11 Mar 2026 12:51:59 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:4d::]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-4177e5e94b4sm2862488fac.11.2026.03.11.12.51.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Mar 2026 12:51:59 -0700 (PDT) From: Joshua Hahn To: Minchan Kim , Sergey Senozhatsky Cc: Johannes Weiner , Harry Yoo , Yosry Ahmed , Nhat Pham , Nhat Pham , Chengming Zhou , Andrew Morton , linux-mm@kvack.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: [PATCH 04/11] mm/zsmalloc: Introduce objcgs pointer in struct zspage Date: Wed, 11 Mar 2026 12:51:41 -0700 Message-ID: <20260311195153.4013476-5-joshua.hahnjy@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260311195153.4013476-1-joshua.hahnjy@gmail.com> References: <20260311195153.4013476-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" Introduce an array of struct obj_cgroup pointers to zspage to keep track of compressed objects' memcg ownership, if the zs_pool has been made to be memcg-aware at creation time. Move the error path for alloc_zspage to a jump label to simplify the growing error handling path for a failed zpdesc allocation. Suggested-by: Johannes Weiner Suggested-by: Harry Yoo Signed-off-by: Joshua Hahn --- mm/zsmalloc.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 3f0f42b78314..dcf99516227c 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "zpdesc.h" =20 #define ZSPAGE_MAGIC 0x58 @@ -273,6 +274,7 @@ struct zspage { struct zpdesc *first_zpdesc; struct list_head list; /* fullness list */ struct zs_pool *pool; + struct obj_cgroup **objcgs; struct zspage_lock zsl; }; =20 @@ -825,6 +827,8 @@ static void __free_zspage(struct zs_pool *pool, struct = size_class *class, zpdesc =3D next; } while (zpdesc !=3D NULL); =20 + if (pool->memcg_aware) + kfree(zspage->objcgs); cache_free_zspage(zspage); =20 class_stat_sub(class, ZS_OBJS_ALLOCATED, class->objs_per_zspage); @@ -946,6 +950,16 @@ static struct zspage *alloc_zspage(struct zs_pool *poo= l, if (!IS_ENABLED(CONFIG_COMPACTION)) gfp &=3D ~__GFP_MOVABLE; =20 + if (pool->memcg_aware) { + zspage->objcgs =3D kcalloc(class->objs_per_zspage, + sizeof(struct obj_cgroup *), + gfp & ~__GFP_HIGHMEM); + if (!zspage->objcgs) { + cache_free_zspage(zspage); + return NULL; + } + } + zspage->magic =3D ZSPAGE_MAGIC; zspage->pool =3D pool; zspage->class =3D class->index; @@ -955,14 +969,8 @@ static struct zspage *alloc_zspage(struct zs_pool *poo= l, struct zpdesc *zpdesc; =20 zpdesc =3D alloc_zpdesc(gfp, nid); - if (!zpdesc) { - while (--i >=3D 0) { - zpdesc_dec_zone_page_state(zpdescs[i]); - free_zpdesc(zpdescs[i]); - } - cache_free_zspage(zspage); - return NULL; - } + if (!zpdesc) + goto err; __zpdesc_set_zsmalloc(zpdesc); =20 zpdesc_inc_zone_page_state(zpdesc); @@ -973,6 +981,16 @@ static struct zspage *alloc_zspage(struct zs_pool *poo= l, init_zspage(class, zspage); =20 return zspage; + +err: + while (--i >=3D 0) { + zpdesc_dec_zone_page_state(zpdescs[i]); + free_zpdesc(zpdescs[i]); + } + if (pool->memcg_aware) + kfree(zspage->objcgs); + cache_free_zspage(zspage); + return NULL; } =20 static struct zspage *find_get_zspage(struct size_class *class) --=20 2.52.0