From patchwork Sat Mar 29 11:02:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 14032647 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7451BC36008 for ; Sat, 29 Mar 2025 11:02:39 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 59DBE28017B; Sat, 29 Mar 2025 07:02:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4681C28017D; Sat, 29 Mar 2025 07:02:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 28E8228017B; Sat, 29 Mar 2025 07:02:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C964428017D for ; Sat, 29 Mar 2025 07:02:34 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id E84F6141378 for ; Sat, 29 Mar 2025 11:02:35 +0000 (UTC) X-FDA: 83274300270.02.859426F Received: from mail-yw1-f175.google.com (mail-yw1-f175.google.com [209.85.128.175]) by imf03.hostedemail.com (Postfix) with ESMTP id 10E362000D for ; Sat, 29 Mar 2025 11:02:32 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VixYL83u; spf=pass (imf03.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.128.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1743246153; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=kegP2Jo+VMPuo6fd4UmkQV/L75LMJeE5mnVS5qzL0Sk=; b=Hn4ll4pGkbIya0v1vm7WixIbQAmVhvuqMbA93cQ2b0Vt08I/tmpSdBoYlybLAYtfBWAiPC dvCATUD7Y3D9laJKOgDIjJUrN98asqzR3162XNicYcjvRdLnMxRjpqpOWpIuXD+laJx2sj 7TMVIK0YTO4E3IWuy5uPObpW3dV46jY= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VixYL83u; spf=pass (imf03.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.128.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1743246153; a=rsa-sha256; cv=none; b=ca04sbj+JVGnZ+bcLbhY4qxVxY44VJ4te/L86f14DdDko5KDELVBISzMCcHAgk0Tf3kvui l15qd7BxKg78ZPpuUXejcssfuDUQFo4wcAA4QQYemGTo/y4lZRkzGUbEWoowhLN1BhLRSf PKEB+WINI+4gT6379DytPlZUcKC8txA= Received: by mail-yw1-f175.google.com with SMTP id 00721157ae682-6fed0620395so27724637b3.3 for ; Sat, 29 Mar 2025 04:02:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743246152; x=1743850952; darn=kvack.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=kegP2Jo+VMPuo6fd4UmkQV/L75LMJeE5mnVS5qzL0Sk=; b=VixYL83uSEv9aFRW3mBJFpoES6kNiILOAlC4GrVdM0/KShaxcKi2MtiZUa9jblarzk N+YFGWI945VbMzLVpL3aPPSC++IRQA5HHsGzxtw0WZDiER96aULDkyUKG8ODS+9WIJSR n5CYea7AZbICkwYlu7bC3q22EzH15qoJ0qbPqrramztPYzR6UV6/mQrxSlLqqve2lpxK scb6zUzFepBGfA6SaAnglXeuIlygtKQoC0CY0XZWWVjb45b6axb4jrZBvxhqBh1hxO2t S5ecPDF3qgiagRHnvc8ExnCmeQOw6pySrYLZHmOOdyHLuGE06Z2kUIj7CkUtuGAjCLki PfBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743246152; x=1743850952; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kegP2Jo+VMPuo6fd4UmkQV/L75LMJeE5mnVS5qzL0Sk=; b=ft5f93V7LGn71y9h8APv/Wopt/BWLY6Ceab/X9tUDO92JUENJ2o8IcUw5CRQfHFehy 6hO4sSwObqAiBqb9GdTTXMuBFQlfGeUxrpvcxDBt5i9qWfbPLKGUnad/HtZ0Ketz7qmO Lf++h9I2cfo5wHgKwCXYq7jTACJWgGtlB9G85E9QGN8q57l6M3PpRHn6dEYN3jQFvN6h au4r0JzM8a3+WVyBOqFVFa55QCajXbKqwY4ydqUBxVP4MpXAhE6zb0VAjqhhDmq6+FsN LPhyNZJPBiMSMTC/6wMvbtiVqVWKbSkY/TGIQOo0CEp62pvw+7O7WgUcC+Z3v+5QH2JE NiQw== X-Gm-Message-State: AOJu0YzqdLO5iSaqWRbB7HOLQXTbqFOXNc4xWHGgaGurzpW3irGEwNlh /w1EM1J/qLPAmyvussGG29ZixowICXMkg4ZF72DGjx2dIyKAeHn3x4HBlyVP X-Gm-Gg: ASbGncveCFhEuag2ztIndMeYodFZZnAzbmK27P+eenJ0OqvdtBUFO48XSOqTvzpu1at EH13acvA+2eXGAQlIz4WZyDdvdlrlTMVZMbuMDhipxox6Vr43+xtGEFZZyuv/d+SAAR3BnM2cZu +8AE9tj/jU89op3f7AvlIbfgokikOFbpL1X/6AZccFo0UReLbGRzwX0Zf/pbgNpUQxbXXmEnkfg myoQgQbU1zUfuc6UgjyUGc5/eakQpsg2RsRQgAT7f1jou/4aNtqAAwWaeHFriYQQsOA6Hx2XCaG iR1lLqoJowcJ2oNiGnhkMwGXSPgvzWwYjJ8= X-Google-Smtp-Source: AGHT+IHikDbBrpRKSVoBBQy51oPmCJRoYjyoDV6yCD03iCJCyGOuBriJFADH30/J3Ck31T0ONMVQVw== X-Received: by 2002:a05:690c:f89:b0:6fd:a226:fb74 with SMTP id 00721157ae682-702570af283mr30024487b3.4.1743246152024; Sat, 29 Mar 2025 04:02:32 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:1::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-7023a98a230sm11888717b3.73.2025.03.29.04.02.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 04:02:31 -0700 (PDT) From: Nhat Pham To: linux-mm@kvack.org Cc: akpm@linux-foundation.org, hannes@cmpxchg.org, yosry.ahmed@linux.dev, chengming.zhou@linux.dev, sj@kernel.org, kernel-team@meta.com, linux-kernel@vger.kernel.org, gourry@gourry.net, willy@infradead.org, ying.huang@linux.alibaba.com, jonathan.cameron@huawei.com, dan.j.williams@intel.com, linux-cxl@vger.kernel.org, minchan@kernel.org, senozhatsky@chromium.org Subject: [RFC PATCH 1/2] zsmalloc: let callers select NUMA node to store the compressed objects Date: Sat, 29 Mar 2025 04:02:29 -0700 Message-ID: <20250329110230.2459730-2-nphamcs@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250329110230.2459730-1-nphamcs@gmail.com> References: <20250329110230.2459730-1-nphamcs@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: 10E362000D X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: ujasadep4z1ey586mjubuybqp5aj6sxg X-HE-Tag: 1743246152-384663 X-HE-Meta: U2FsdGVkX1/+ISvPiOe2b9ksii4m1xMiRx/K1SAZXoTehhWCzJWeTuYKoHFAgVbQyfexk/cpiPp59B57R5TngLbmUXmU13RBNfdOYbdwzotJ3o49SeX+WjtOl9zp/En1DnCi6WyAWfZyXtBHKpkVEjNCVcuJx/lcFM3QD2/1FqgcsrqWmlk9RpNGS1MmRMWayN9idxCLbuntUj3AFnUpY9YH4xOCEU7opoVabt3SsJaKvfBe/6PzmmHqDJAwfBoyt9rm8z7OB4TnsZnPLXspbNvNCu5wG6TV+2DM0AUMdVv7B+LFkmqeXrLjJxkY+WmSNxpjCONvcDhZfalv6mxOSvpiAvUKc/WnXBWIQWnjG+ZH/Px/DYx5QIuikEgjmeVXfu5ie3TkMB5BiGLxm0JlSrNtAYf1epuYiaNHOw8iQZjFBFe+mWL6wQ5LtjBh6qkFzpe/5LCDD7ws6Ph+nqM4TsUyEC/DSkFUa9wQztZAUAB0O5TOrK7g/F/Q0b82xASIMqyufiC9GK4IL/fj32XoAZpyjLsBDvy1tMm9dt7YbgNEJMj0rNwx+n6abhb7SfbuZl3eWMiUCpMVb84ubW0WiqiNPq1IfEzHjK3Bv9UB/3MMokphypW9PQpUJw1R7ZmAvQ4haSHrAm69p50jLrfaqucX3gqFcvYqyrqUVh4gfOHovmANx3XOKDk9lLbffawZnhohynDTHz4eICjPagPpAeStT5c8Pkp4D4iW5KCt17savb42qw18lPmNPZUF6+9rK1smkCagagEw8T6uCTJCnPsMNm7mUlxe/g8DupdVJz++FWtCmAFWjbSWxF/R+Zvrd6gBMjb6uMQttFtor+sgiG9HgOA2KAVCF07jj4YRJ5YLgQRAiTTiL8rr/SBEa3nl7/EVenlKDIHD+n1oj4TFP7KE6mfTZflJdbNFtB7I+XVEU0emBdDuVVkQoWO30l1CoT46AS61jZQMIR0H5aF QJBEpiBx tAUAUw8mIFZfh1SQJ/HHdisSA0IooMAsWJtyahStRRtz00C+nYMaRKkPqZBJ26gpdOjTW0GPU38dHh2pcjv9ZlA8A0PwSeXeBmusyidTaOZ6o2Rbr71JerD2SYjc/CSCR1chLrZfGGksJ20nbTkv+G8s8QObRn6uEBSxEeaFzB9yypvKh/VWJcm/TG/Hnkl7IHrMYnzBIDtZMhmYzcbA97lBtU4RT/HiviHkAAqR0AMMkQo6LlwFiOYnfyOXnvZLYJ9vYvHDox5zERF8V4ZbXGloeJH7T2DEmMhMo9UqTb9IpCZVCJ1KPi+xNF2jgHdkPwezl0B2BcDtE8f+x32I4MUhHNhF6g2pttoTb6nK6vsFMmUdT5su8m+Xx1vQNuCFDa+WdQy808m9Zdt2T/P6Acn6elgdqBRGCMuZxC6HwWS1Sie1kfQiKeSw39A== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Curerntly, zsmalloc does not specify any memory policy when it allocates memory for the compressed objects. Let users select the NUMA node for the memory allocation, through the zpool-based API. Direct callers (i.e zram) should not observe any behavioral change. Signed-off-by: Nhat Pham --- include/linux/zpool.h | 4 ++-- mm/zpool.c | 8 +++++--- mm/zsmalloc.c | 28 +++++++++++++++++++++------- mm/zswap.c | 2 +- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/include/linux/zpool.h b/include/linux/zpool.h index 52f30e526607..0df8722e13d7 100644 --- a/include/linux/zpool.h +++ b/include/linux/zpool.h @@ -22,7 +22,7 @@ const char *zpool_get_type(struct zpool *pool); void zpool_destroy_pool(struct zpool *pool); int zpool_malloc(struct zpool *pool, size_t size, gfp_t gfp, - unsigned long *handle); + unsigned long *handle, int *nid); void zpool_free(struct zpool *pool, unsigned long handle); @@ -64,7 +64,7 @@ struct zpool_driver { void (*destroy)(void *pool); int (*malloc)(void *pool, size_t size, gfp_t gfp, - unsigned long *handle); + unsigned long *handle, int *nid); void (*free)(void *pool, unsigned long handle); void *(*obj_read_begin)(void *pool, unsigned long handle, diff --git a/mm/zpool.c b/mm/zpool.c index 6d6d88930932..591a13b99755 100644 --- a/mm/zpool.c +++ b/mm/zpool.c @@ -226,20 +226,22 @@ const char *zpool_get_type(struct zpool *zpool) * @size: The amount of memory to allocate. * @gfp: The GFP flags to use when allocating memory. * @handle: Pointer to the handle to set + * @nid: Pointer to the preferred node id. * * This allocates the requested amount of memory from the pool. * The gfp flags will be used when allocating memory, if the * implementation supports it. The provided @handle will be - * set to the allocated object handle. + * set to the allocated object handle. If @nid is provided, the + * allocation will prefer the specified node. * * Implementations must guarantee this to be thread-safe. * * Returns: 0 on success, negative value on error. */ int zpool_malloc(struct zpool *zpool, size_t size, gfp_t gfp, - unsigned long *handle) + unsigned long *handle, int *nid) { - return zpool->driver->malloc(zpool->pool, size, gfp, handle); + return zpool->driver->malloc(zpool->pool, size, gfp, handle, nid); } /** diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index 961b270f023c..35f61f14c32e 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -243,9 +243,14 @@ static inline void zpdesc_dec_zone_page_state(struct zpdesc *zpdesc) dec_zone_page_state(zpdesc_page(zpdesc), NR_ZSPAGES); } -static inline struct zpdesc *alloc_zpdesc(gfp_t gfp) +static inline struct zpdesc *alloc_zpdesc(gfp_t gfp, int *nid) { - struct page *page = alloc_page(gfp); + struct page *page; + + if (nid) + page = alloc_pages_node(*nid, gfp, 0); + else + page = alloc_page(gfp); return page_zpdesc(page); } @@ -461,10 +466,13 @@ static void zs_zpool_destroy(void *pool) zs_destroy_pool(pool); } +static unsigned long zs_malloc_node(struct zs_pool *pool, size_t size, + gfp_t gfp, int *nid); + static int zs_zpool_malloc(void *pool, size_t size, gfp_t gfp, - unsigned long *handle) + unsigned long *handle, int *nid) { - *handle = zs_malloc(pool, size, gfp); + *handle = zs_malloc_node(pool, size, gfp, nid); if (IS_ERR_VALUE(*handle)) return PTR_ERR((void *)*handle); @@ -1044,7 +1052,7 @@ static void create_page_chain(struct size_class *class, struct zspage *zspage, */ static struct zspage *alloc_zspage(struct zs_pool *pool, struct size_class *class, - gfp_t gfp) + gfp_t gfp, int *nid) { int i; struct zpdesc *zpdescs[ZS_MAX_PAGES_PER_ZSPAGE]; @@ -1061,7 +1069,7 @@ static struct zspage *alloc_zspage(struct zs_pool *pool, for (i = 0; i < class->pages_per_zspage; i++) { struct zpdesc *zpdesc; - zpdesc = alloc_zpdesc(gfp); + zpdesc = alloc_zpdesc(gfp, nid); if (!zpdesc) { while (--i >= 0) { zpdesc_dec_zone_page_state(zpdescs[i]); @@ -1342,6 +1350,12 @@ static unsigned long obj_malloc(struct zs_pool *pool, * Allocation requests with size > ZS_MAX_ALLOC_SIZE will fail. */ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp) +{ + return zs_malloc_node(pool, size, gfp, NULL); +} + +static unsigned long zs_malloc_node(struct zs_pool *pool, size_t size, + gfp_t gfp, int *nid) { unsigned long handle; struct size_class *class; @@ -1376,7 +1390,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp) spin_unlock(&class->lock); - zspage = alloc_zspage(pool, class, gfp); + zspage = alloc_zspage(pool, class, gfp, nid); if (!zspage) { cache_free_handle(pool, handle); return (unsigned long)ERR_PTR(-ENOMEM); diff --git a/mm/zswap.c b/mm/zswap.c index 204fb59da33c..89b6d4ade4cd 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -981,7 +981,7 @@ static bool zswap_compress(struct page *page, struct zswap_entry *entry, zpool = pool->zpool; gfp = GFP_NOWAIT | __GFP_NORETRY | __GFP_HIGHMEM | __GFP_MOVABLE; - alloc_ret = zpool_malloc(zpool, dlen, gfp, &handle); + alloc_ret = zpool_malloc(zpool, dlen, gfp, &handle, NULL); if (alloc_ret) goto unlock; From patchwork Sat Mar 29 11:02:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 14032646 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5342CC36011 for ; Sat, 29 Mar 2025 11:02:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CCE9228017E; Sat, 29 Mar 2025 07:02:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C793728017B; Sat, 29 Mar 2025 07:02:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AF6D128017D; Sat, 29 Mar 2025 07:02:34 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 89A1C28017B for ; Sat, 29 Mar 2025 07:02:34 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 959B11A132A for ; Sat, 29 Mar 2025 11:02:35 +0000 (UTC) X-FDA: 83274300270.08.6A3046B Received: from mail-yb1-f169.google.com (mail-yb1-f169.google.com [209.85.219.169]) by imf06.hostedemail.com (Postfix) with ESMTP id BCFDB180012 for ; Sat, 29 Mar 2025 11:02:33 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=kwgOn7bA; spf=pass (imf06.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.219.169 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1743246153; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Jsq1kdQlFLn6WmPKzWPYjHoxE5hbtalWfUYgVjm4hmU=; b=UWHjKO83xGnyfC89ImYuZGrazb//uHFTRwqYtzsxxDZlamXJND2G4VhMlKYQoMUBAjF9Hx JNhrAKoP1yVpPSOu0yWzjc4XqQ2cJXoFJgws6eAe1KkX/2AhyRHE9pNFWNWToIMxtC1luV iNKLq6UfeGJRuXKMErRypcIfyGRe0iM= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1743246153; a=rsa-sha256; cv=none; b=hjejAHQPohFtxpy/HSo9hzwt0JRi9dZXkEYkx8jBrDBCSqrs/FjiRi/Uph542F5LZiOQDe hF83IpkigXicVy4ZtJG57LfKpVRfRHvztPJHFkLt/Z8tbuapRj4MMduUZjh5x1M21wIjrQ XV7hDQoLeUiFpp0Ov54yMITpd9lKwgk= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=kwgOn7bA; spf=pass (imf06.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.219.169 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-yb1-f169.google.com with SMTP id 3f1490d57ef6-e643f0933afso3294295276.1 for ; Sat, 29 Mar 2025 04:02:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743246153; x=1743850953; darn=kvack.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=Jsq1kdQlFLn6WmPKzWPYjHoxE5hbtalWfUYgVjm4hmU=; b=kwgOn7bApYDpf5FfaLkpa7n3LJahLMZTHGS5M/tOQwR0qgvlZNfT7AB1uQsImOtymO Us09o5uJJxiJdo/5TLavWw2vD40J5unEpb+UUZyiexQc+fkmYDYPLn/4GIzakRlyIUX1 QKqJyqC6pW59jMpBmTZENb42WV+Pji29a5xVKH9vWL/Ui012c+R1A+pQgxjITeRZ/XHP E4TtSpHp2yUXzReXmhk3ulKo3xTNvbCbJmXU9EMmExUBPT5wJYMwlBOKXpvdH8nLxHky rYUOqfM06LXQdDEtRnjCRyBVMsv3s0Efrv69ejhglWEkky5jU0hxsXH7UMNC/VH0f7fs 7D/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743246153; x=1743850953; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Jsq1kdQlFLn6WmPKzWPYjHoxE5hbtalWfUYgVjm4hmU=; b=LmjzYp9B2gJsStOowM6DYxpgfJ3Gt6PAizn+vI4ArVM+NkjPwagdSSohan4Bw7YO7E Dv4OKb1Fhyif5HQVKL1GwFeHaord0tnd+Op7tHTt8xj4IUB3iAAIKpI1eYu5CHqy/xEp qTtYCOvjoxe+Cy2ePHvLEyASlxIK/Kf9FL6KNezyeNLlsgfIco/DLSivhcOxRDZ2zmCW Re9tFBG4fOklrPvwvqDFcPOTFpf/sBmSVanPmRGuOa9LnrM9Om8i5M2fiegkD9sdfHmj I3ZTmSChmJFkqOTFXSgM7bdlmz+0H/WeWFjOXo25hXL+RRycBQYHcW6wYIqEcgsRCfMM jL5g== X-Gm-Message-State: AOJu0Yyhm9ryiPAx9bUOk4JdE80zT4oU9OqHdWcZ3i53U8BxPzzM8dGX p1neCXlo1k/iNLs5yWYwem21UVQqiw16cyZQeRUwbhy75GjAaDz64jBh99Qa X-Gm-Gg: ASbGncvYz4n3ztSvICEw/kQrhgarwz6/c/nNpStPH0bav6QQzYMf6nBHFiv1UKWy398 NK07pWE0Pf6HOJGe5lFnfbnbxFWDAfV5UhgAq+oWxxldxbpPgjKPogYzixMY5iIHo99p19/WAF/ 1z4wqr7Bm+zxbDlM2z2D0fpKLajtI5iqCU7QHUkaILaeWYW4U7sukSAADzI09MhmTPUwmKmsdRs noijbcHI1PRFif5B2SHUUcRC6Y9Bigk1r856WtFXmMSpBvkcVBKcXqauukX082nVd81KcwV2Sx6 rHkw9eEuvB9RtfUKk7eU+3v2HtiwMk/eySY= X-Google-Smtp-Source: AGHT+IH2l8g9eICi5VxjR50z5D2Rf7QYBYscXVtxEG4K+/DFEXhUzLsi2QX42gax29HRevowTi1+Bg== X-Received: by 2002:a05:6902:1581:b0:e6b:7e33:b637 with SMTP id 3f1490d57ef6-e6b82e2e712mr3210420276.14.1743246152740; Sat, 29 Mar 2025 04:02:32 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:2::]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e6b8473463fsm324084276.23.2025.03.29.04.02.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 04:02:32 -0700 (PDT) From: Nhat Pham To: linux-mm@kvack.org Cc: akpm@linux-foundation.org, hannes@cmpxchg.org, yosry.ahmed@linux.dev, chengming.zhou@linux.dev, sj@kernel.org, kernel-team@meta.com, linux-kernel@vger.kernel.org, gourry@gourry.net, willy@infradead.org, ying.huang@linux.alibaba.com, jonathan.cameron@huawei.com, dan.j.williams@intel.com, linux-cxl@vger.kernel.org, minchan@kernel.org, senozhatsky@chromium.org Subject: [RFC PATCH 2/2] zswap: add sysfs knob for same node mode Date: Sat, 29 Mar 2025 04:02:30 -0700 Message-ID: <20250329110230.2459730-3-nphamcs@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250329110230.2459730-1-nphamcs@gmail.com> References: <20250329110230.2459730-1-nphamcs@gmail.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: BCFDB180012 X-Stat-Signature: 974fhc6zirzquadwdno9u4nts4jpcoe8 X-HE-Tag: 1743246153-900515 X-HE-Meta: U2FsdGVkX1+DfV/47cAGXdv6tENrmW70aCe9ZtPCrQLWjfKDpJxSlolZMLTDJ+kmz7H0wnOptV2MPwxnY5KzkWILfmG1/h8D6BQXfJTL0VUL6rd1162i08bg5wyBajoZJqlyGpP4KowSbirtO6zzllHi37NOVsm04KPXlwmhWins9Gf3Phiu6STY1vCtg4EZHG1+3FwfWU/09tLuGnGs2RFgBsEbnxM3V92+KESGGDMkGhSGIDpz0x6rfVldUTkCRuRI2Q8NoWOUNvv22yo3qZPt/VcHOFDmfvE3uucjQWyGh3aAd8o1DIqa6YxeGgDk7cSmJ//aOPnWdVgYdGO9/wbJbBRKIY2NiX3aIRCIp1LDCI/x+dXKa0Bow7DUrUWfrxnrr0FvLUnkLbVJqc6Fb9HytUjue749M10eqMMNbDX6ffPoi76Vgv+eyHI4y47LT0sB+nh4MA8PZQ9Tt+aV6wZb59+xSylzMmsnd1bH8LQN7WRVoQEAWI7sXzxEaqzwXwpzz0HYaioYsArzzsXCWFBplcqvia5sEUNmCFfoxYfjvnvXN5wO6l8jjDJGUU/pvT7WruFKatWseNODrqSJfOP9NpKPLlKDLoxE4xRjZka+1RFjIjNa3VyIV+BiwiFEdtTu05wPvXVTyRUQznXLADw39DxF9sLD/Grvr3n/zp4usaobQerMlVzs1aL+MwdT/3m66ZrWL8mnzKwKjdn5K2t4aGpyS6kBA2Ngk1xqTeKAn14i+VqdUigFvj1MYYxLOExE5ZfEL8KxYehlJSNlfTjT/hgYJGBoFyMoUzFLfPXoXhIkpA5EOvgVdvhJnPT4ivqwdiLiyO6NK4Mqt7B4NCRW1Nos/Kv4ZhFcrOek1m6Atqi0RucN/jhPVL00Zd+lyfPrHjAHRZSc1DRz7pRD2LoiMmInhSG5AoEh220k388XYM1/azGK9c0Ge6/PnZtF6kHpySBZdJtslqV6O87 4/Bf8riK 2jqDytM7oiCBpPhRwiWyfq2k/4uPb/36nIYUFG/EfK2pq0Brf1yGToyTUUUkkyp66vXHHIOAzlVn9GW2hVwcSzA3jC3U0OSu9suaa9D2YtLDFUKby0s3Rna9y2JsqvMEdKIbFoFjRvTtSrL2U8PTgH3K6MJ212RdrGZdzjVzWMzk9Mz9y3+TYWR7ThwowdUg17H4uemMBNJMjHB+CW97R1TrPhM2gcPnx7YPHyil3iZ2uIyAtVGx9cOuRuUg2kx1H3n2UOJdMyuRvkwF9K2DEM1dTHKhxZB0uOxxOU9HRnT2gYGS7naN5kZzBKdCK7cec9tvtS4Mo9VmdKskILxL+C5j8t0HlDdXdh5jlWSBnlKw8+aOlx1AAAwRyr20w3NS2rTAZO6dMRZdmvzv7zcW0OMK335YesEKNl7MQaYw6tZsDuMm8xlo1gNnxPl5IKSvCF6fMvSV7YSKZ/BghqU4glzam4cnCxGmCxfQk8gXQ+oFGPoI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Taking advantage of the new node-selection capability of zsmalloc, allow zswap to keep the compressed copy in the same node as the original page. The main use case is for CXL systems, where pages in CXL tier should stay in CXL when they are zswapped so as not to create memory pressure in higher tier. This new behavior is opted-in only, and can be enabled as follows: echo Y > /sys/module/zswap/parameters/same_node_mode Suggested-by: Gregory Price Signed-off-by: Nhat Pham --- Documentation/admin-guide/mm/zswap.rst | 9 +++++++++ mm/zswap.c | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Documentation/admin-guide/mm/zswap.rst b/Documentation/admin-guide/mm/zswap.rst index fd3370aa43fe..be8953acc15e 100644 --- a/Documentation/admin-guide/mm/zswap.rst +++ b/Documentation/admin-guide/mm/zswap.rst @@ -142,6 +142,15 @@ User can enable it as follows:: This can be enabled at the boot time if ``CONFIG_ZSWAP_SHRINKER_DEFAULT_ON`` is selected. +In a NUMA system, sometimes we want the compressed copy to reside in the same +node as the original page. For instance, if we use the NUMA nodes to represent +a CXL-based memory tiering system, we do not want the pages demoted to the +lower tier to accidentally return to the higher tier via zswap, creating +memory pressure in the higher tier. The same-node behavior can be enabled +as follows:: + + echo Y > /sys/module/zswap/parameters/same_node_mode + A debugfs interface is provided for various statistic about pool size, number of pages stored, same-value filled pages and various counters for the reasons pages are rejected. diff --git a/mm/zswap.c b/mm/zswap.c index 89b6d4ade4cd..2eee57648750 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -129,6 +129,9 @@ static bool zswap_shrinker_enabled = IS_ENABLED( CONFIG_ZSWAP_SHRINKER_DEFAULT_ON); module_param_named(shrinker_enabled, zswap_shrinker_enabled, bool, 0644); +static bool zswap_same_node_mode; +module_param_named(same_node_mode, zswap_same_node_mode, bool, 0644); + bool zswap_is_enabled(void) { return zswap_enabled; @@ -942,7 +945,7 @@ static bool zswap_compress(struct page *page, struct zswap_entry *entry, { struct crypto_acomp_ctx *acomp_ctx; struct scatterlist input, output; - int comp_ret = 0, alloc_ret = 0; + int comp_ret = 0, alloc_ret = 0, nid = page_to_nid(page); unsigned int dlen = PAGE_SIZE; unsigned long handle; struct zpool *zpool; @@ -981,7 +984,10 @@ static bool zswap_compress(struct page *page, struct zswap_entry *entry, zpool = pool->zpool; gfp = GFP_NOWAIT | __GFP_NORETRY | __GFP_HIGHMEM | __GFP_MOVABLE; - alloc_ret = zpool_malloc(zpool, dlen, gfp, &handle, NULL); + if (zswap_same_node_mode) + alloc_ret = zpool_malloc(zpool, dlen, gfp, &handle, &nid); + else + alloc_ret = zpool_malloc(zpool, dlen, gfp, &handle, NULL); if (alloc_ret) goto unlock;