From mboxrd@z Thu Jan 1 00:00:00 1970 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 AE1F3C7EE31 for ; Fri, 27 Jun 2025 06:22:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3358E8D0011; Fri, 27 Jun 2025 02:22:53 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 30D8E8D0001; Fri, 27 Jun 2025 02:22:53 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1FCA68D0011; Fri, 27 Jun 2025 02:22:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 092FF8D0001 for ; Fri, 27 Jun 2025 02:22:53 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id D0FE81045D8 for ; Fri, 27 Jun 2025 06:22:52 +0000 (UTC) X-FDA: 83600187384.30.B34AEDA Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) by imf06.hostedemail.com (Postfix) with ESMTP id EA0FA180010 for ; Fri, 27 Jun 2025 06:22:50 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dM5vpFgM; spf=pass (imf06.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.210.178 as permitted sender) smtp.mailfrom=ryncsn@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=1751005371; h=from:from:sender:reply-to: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=/hWgoWI8jaJ1OTfxVEFPXPhBOEtz+zuwq/NuSmx4sE0=; b=WBn6LvcjJKv1kB9Qz1uhLHbc6l2Yqq3ujQxyavpZD2ybW7wmopWVSnYfP5IJYeF2AwCSUM EIbEE6HGZNEZM2g+Jf2B7tK9FP+R4GQztN9Ips+P+sKzCbvkoujbvHYhzDMXxnymyneg1D YMmaBCd7CENTmPjNmM52Xv6yfcH4Qis= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751005371; a=rsa-sha256; cv=none; b=i0mDI3qqUmcGkE7HL+pnNwjXiadolar0DpBb74qHxVEe4l75G35hUrb/fagfw2dZ/aQsMb kTp3AjM9MaY8KM2vglVkLA70gd/K08+Zs11rdnFo3uiLKQLYd+eYfPL6BSZHpyx+Pdo+gy 4+mar97+0tib8/tUdHTFyEf9hL5WWlU= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=dM5vpFgM; spf=pass (imf06.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.210.178 as permitted sender) smtp.mailfrom=ryncsn@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-74264d1832eso2446916b3a.0 for ; Thu, 26 Jun 2025 23:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751005369; x=1751610169; darn=kvack.org; h=content-transfer-encoding:mime-version:reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=/hWgoWI8jaJ1OTfxVEFPXPhBOEtz+zuwq/NuSmx4sE0=; b=dM5vpFgMha3xVObLrZtUGJ46KwHcSyGgkRRDwxmrEBC55QVuVe1k6En8rcXDmJtEvR pf3s43ji2oJ2VqNsTn7PtePBe1IUft7KcHESKfPq1qeLKxyMh5ySTiibYcz1DH32BJMs MZrvBnLoswPqNoz8ILyPvVAiNDAxIFeS0ZrGwWlFu4GUcUStB0JfnKG+JY2/As3Vhqek qFr7jk+fOpogDYRUK4Y6ufJsgWW62aoaSIM4VKybb+b02dCJIT8fn3fCcADgkilFVGDg jE8D/gVlQbuE0lBLrJDfAWEZsXV0gb+9GeXOu08Xi1mb6tHpxF4hbIWLpAEYfm5ACTWV /HJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751005369; x=1751610169; h=content-transfer-encoding:mime-version:reply-to: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=/hWgoWI8jaJ1OTfxVEFPXPhBOEtz+zuwq/NuSmx4sE0=; b=J2SGPzTVmaFxVsOul7dhmDangeNwPsWbqpaToGsWctowZSnq7/fSZ6hRPMGS2miIdE 72vmuhtzoNph89nuVJrZGQF+Ul9M0bBaLWD97otgpj2HJ2J5I5k3LGlACwwAp6iPXMoB 8Pe7r1KAs0brtTYIIQPy2yrBrxD0T9i4if4yXJBz+Y0s0EqSwz6/yKcd+ObW6EZ/72Cv vS3yv/1aIc3053jxLCspTrW4Yislt2GLXMv2bxFSAIuUpQ2GoI2y68WDxsyVxNEKoMd4 ovRo5oZ/lUp4i/pyNYZTvEAllcE1MZE1yu/xQtigpX9lvZ4R3ksIavL0ceEw51KxcGQF tXCQ== X-Gm-Message-State: AOJu0YwbHp2d6uBADbu9xUH0+hOiAKzfcCFXJqPL/E67w+Uuoby6WkGm o0fqTGHBLXyuee/3Bjy/XzwX8j4mpxwsTsfiBmG7tuss6DF9KwcKC1+kKh+54fZUx8E= X-Gm-Gg: ASbGncvyNAug2yf5yJ2bAwdj8rwoKgrt3cIZ3GLbUiW5CFeaioiwL1oi0iwavgP79Vf S2bmfGs4zwD3NxOBghFTD4qTY1zIk4UMtlfxXj+sLQGMM6XbuLNy72Kgb+HcXvhVUNpokl257zU 09PYgTw/N9HZrjLtz+OKtMxbvu8jrwF2wghrWnS4OndLdpLja7tFXwzYM2tHwCzXADLo48PDNKb dkKSK2zlIDy/bFH6DoH/vYCMoEmH9QHyFUdhGHdup8PNBYu1vYmIp2bFqTmaDVEzzWSeBPg1qiO CdLuExCWPDDBPYvI39vfT9cYjIiSkoYUG5CuZpjwQWLEa7VV7i+ecA2uQbMcPXP9h/M2VcVu11/ Wst7YbgCCIM0= X-Google-Smtp-Source: AGHT+IGEMRNMMobFjW+JqiZRS8skcEyEbLLPp5CM2aFvT1VUOfcS0+W5bUpwPXWMXSptyteMv7HUMw== X-Received: by 2002:a05:6a00:130a:b0:742:da7c:3f30 with SMTP id d2e1a72fcca58-74af6f4cf7cmr2863972b3a.19.1751005368810; Thu, 26 Jun 2025 23:22:48 -0700 (PDT) Received: from KASONG-MC4 ([43.132.141.21]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-74af5409cb6sm1456212b3a.23.2025.06.26.23.22.45 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 26 Jun 2025 23:22:48 -0700 (PDT) From: Kairui Song To: linux-mm@kvack.org Cc: Andrew Morton , Hugh Dickins , Baolin Wang , Matthew Wilcox , Kemeng Shi , Chris Li , Nhat Pham , Baoquan He , Barry Song , linux-kernel@vger.kernel.org, Kairui Song , Dev Jain Subject: [PATCH v3 2/7] mm/shmem, swap: avoid redundant Xarray lookup during swapin Date: Fri, 27 Jun 2025 14:20:15 +0800 Message-ID: <20250627062020.534-3-ryncsn@gmail.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250627062020.534-1-ryncsn@gmail.com> References: <20250627062020.534-1-ryncsn@gmail.com> Reply-To: Kairui Song MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: EA0FA180010 X-Rspam-User: X-Rspamd-Server: rspam06 X-Stat-Signature: ajrsqjazw6i3go9jq5p3sq41ooczg41c X-HE-Tag: 1751005370-188878 X-HE-Meta: U2FsdGVkX1+Rq5Hj0Fr27cdx5RLMKm2e+B1jVd099oqv0mb3BlBbCS/lLEAI7rLZLAhwHzkEmtCkey8l6YZqQzGD8O98jqy6oh2bCO9hnx0vy9m4eDGrKCM1yD9+TwqX+STxu0b2zJvk9EaJLOXac/YER1wJ91ZVyv+7e+0IhRhS7PiXMR64iaLu/EDZTIEd0g19/KZjeg8h/sohoRHhP74w9ybHAbUYfHIOMZdextFjt4Ou1JOpuAnJl97Ff+UDxtTmj3b+sl0xFKax38blsaLmI65b2/ddLN3DihMLqxlbyjRaI+rkFYPo6RbRvvJt2U7+zCmw3B6dKK7mdclchLjaGgnB6BocgilmUa0GapsrBA2K9yXy88EZa4v+yelbGhRCw41hlN+F8h7dPmQTiD5Dq43rcZI8/RngOC7W/OSqvQ9ffaiGnTPc3wUYtsMFxu53PhWxqScddf1ONgfumGd58LNJh5OrTNWAdy3zTIE40wmH98SJ5h1N1vz/60lCNdWIp2u/xBb8u76+nLzAWG5YucSHjVmWDneT6l7Rqgl9QWCTpJUoUk2Vb327SXCd35XOz6vw5oDQls3qZtxTPFA14lCB6LsB8EzRgmU+mQYs/Qhbfd1i7p3B+VDFvf5ObAKebJ8Fqzl/xluKp600HR0uMsNV9gBcaAP2hx1A71OiGoM3jezzuwXtyXO5rgkgzzpOwUOPT4QcszWS32uiXTA2Ic7Ah/NbgL+Dke9k71ma/evjuKgxiRgxvix5c6HQcSxMnoxENkj3w4CJaMBk/ZnN/EcLfsUj+rbNA8tPVysPw2PvkWsl1wABFLUnXph+unweL9PLGhH0N5grDIVSiicY0EcLlmGMsdXSAf2Wsh4HmwJrtWESN9ll3ErqyarCjInU+koP14t7G82dR8xkKdTKYgjUTAQAx/kZxHTvlqdRJfjAZcryrR/yYLaRFlnlKxI23G8tBXqZOE3XmRT 0bMmk3XR BRplfjua8a3ZuNpY/Dfc3kLDM2HqWtJDOx7pH1rlfCXM+34Q3zmXcEEg6FVVq5A/5BWb9JZFhUt7B6vNWeiJCVdpHb0ldVNPeJJtzg6YWJC+ClTJKmm4YJwF97iVwcsDEVX/g/QOafq7ClayoEcp8wVGdmv7K4MQGkRCFvztmu5wFVl5lMpXBgFNQz+lo6yF1X+9PTtWUZm5B7Mf90bgkWCyMeSe9uVYU42NHX866PUCDiQc8D7Dc0XxQtMZGxZg9vrkEmw7pLDAVonaSW//5CC5jiQncHXopBlHPxwcnjSMfKQkeoPYXJq0Nag7tyPGj3fP0uBUYgMe1gtbNxFbD42lVImdMqJ+PYlgabACENvtC8n91Ahyc3c6t+rjpse5dQ1QCnHpWrEaVNqd+dwezcGc4ACzMGcHKwlNacuayAD++PBPgxxW5Y6bZ7Y+BwbrPHQWI62pwmf1SJtQG58AkhVk6qgASvATjpsNLzcaQ08/4TvyVWoqIyUHmt6dT5Fun916cOFBilyzN1opLg1XoamYco4O69qRIjU8v8nxpUNzb12vLKyUHU9gSEQbNc2+Ac2gF/IAZ48m08XsgSPiGjV0r8OZ47wvmMfVsdB4CoMkNEgTwrBQ/u00AbBc+h6A77aT4wtd+mVK8Oc/BCaSftUtTablLA0Cy46PmR6G4LfWDkd19EphnmAw4HVzAR64PrS/Hpxw/si+Zl8IHmXkwWwSiUw== 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: From: Kairui Song Currently shmem calls xa_get_order to get the swap radix entry order, requiring a full tree walk. This can be easily combined with the swap entry value checking (shmem_confirm_swap) to avoid the duplicated lookup, which should improve the performance. Signed-off-by: Kairui Song Reviewed-by: Kemeng Shi Reviewed-by: Dev Jain Reviewed-by: Baolin Wang --- mm/shmem.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index e3c9a1365ff4..033dc7a3435d 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -505,15 +505,27 @@ static int shmem_replace_entry(struct address_space *mapping, /* * Sometimes, before we decide whether to proceed or to fail, we must check - * that an entry was not already brought back from swap by a racing thread. + * that an entry was not already brought back or split by a racing thread. * * Checking folio is not enough: by the time a swapcache folio is locked, it * might be reused, and again be swapcache, using the same swap as before. + * Returns the swap entry's order if it still presents, else returns -1. */ -static bool shmem_confirm_swap(struct address_space *mapping, - pgoff_t index, swp_entry_t swap) +static int shmem_confirm_swap(struct address_space *mapping, pgoff_t index, + swp_entry_t swap) { - return xa_load(&mapping->i_pages, index) == swp_to_radix_entry(swap); + XA_STATE(xas, &mapping->i_pages, index); + int ret = -1; + void *entry; + + rcu_read_lock(); + do { + entry = xas_load(&xas); + if (entry == swp_to_radix_entry(swap)) + ret = xas_get_order(&xas); + } while (xas_retry(&xas, entry)); + rcu_read_unlock(); + return ret; } /* @@ -2256,16 +2268,20 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, return -EIO; si = get_swap_device(swap); - if (!si) { - if (!shmem_confirm_swap(mapping, index, swap)) + order = shmem_confirm_swap(mapping, index, swap); + if (unlikely(!si)) { + if (order < 0) return -EEXIST; else return -EINVAL; } + if (unlikely(order < 0)) { + put_swap_device(si); + return -EEXIST; + } /* Look it up and read it in.. */ folio = swap_cache_get_folio(swap, NULL, 0); - order = xa_get_order(&mapping->i_pages, index); if (!folio) { int nr_pages = 1 << order; bool fallback_order0 = false; @@ -2415,7 +2431,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, *foliop = folio; return 0; failed: - if (!shmem_confirm_swap(mapping, index, swap)) + if (shmem_confirm_swap(mapping, index, swap) < 0) error = -EEXIST; if (error == -EIO) shmem_set_folio_swapin_error(inode, index, folio, swap, @@ -2428,7 +2444,6 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, folio_put(folio); } put_swap_device(si); - return error; } -- 2.50.0