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;