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 22FC9C83F03 for ; Fri, 4 Jul 2025 18:23:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BB3CF6B8069; Fri, 4 Jul 2025 14:23:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B0FB76B8067; Fri, 4 Jul 2025 14:23:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9FE566B8069; Fri, 4 Jul 2025 14:23:54 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 8D00D6B8067 for ; Fri, 4 Jul 2025 14:23:54 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 40B7B1A022C for ; Fri, 4 Jul 2025 18:23:54 +0000 (UTC) X-FDA: 83627405988.24.535CA2F Received: from mail-ua1-f48.google.com (mail-ua1-f48.google.com [209.85.222.48]) by imf06.hostedemail.com (Postfix) with ESMTP id 5D3D8180009 for ; Fri, 4 Jul 2025 18:23:52 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="DH3iyHf/"; spf=pass (imf06.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.222.48 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=1751653432; 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=gWY0uEwK05prcrJ+WvYOIQPaK8/MxntEYZbHX1e9+H3lJn9+Bw9hM1JdBJ9dkKIqLvLvrG gPWftoXYhlyy8Q6QSlipgxLRHm+ygtsrD4ppS1F4n1V1mE4e8GbxNYm2mNgAq5KUS6JKeX 6OXiCtKmORdSEErAgQBSGX4CKRrGOu4= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="DH3iyHf/"; spf=pass (imf06.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.222.48 as permitted sender) smtp.mailfrom=ryncsn@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751653432; a=rsa-sha256; cv=none; b=pyQ9OwTf9E4WWJbFhZ0pTNTM3e1RPdzGHLz0LWAE6UO0jXJO+JS9MrOgBLeX0UvIdFLhWL /dxM2GPCjYJgeQ2/h6n7h0zFhlT+ZlT/0SGLF+vWO5mxjuA76dJvgRfQW6wOrTvtxLR5eu RJgJshiL4j+XT8KZyogjQwcUzejJc0Y= Received: by mail-ua1-f48.google.com with SMTP id a1e0cc1a2514c-87ecdf5f326so1260238241.1 for ; Fri, 04 Jul 2025 11:23:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1751653430; x=1752258230; 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=DH3iyHf/SbnTGbfgmR3rE93YBFe88Z/Ip1cokyVtMYmWTAXN9/0ZuJKvUXfZtIJ+Vy VFnITL4I8+yhP36YULGzzsEXxN6FcvSbFLI31wwy4mldc2t7C7my1P/MPT8TH5Fla62K gt8KrF9xqWxAPsF74Z/LLsXO73aLXt40fzTKX8deKmCveHteLzCHB+XfPDKtcXHtWwhW vCva6+X3kvZkmpviDOQU1u95Gtc5KBiIeMTAScZgk4FYY5vTxWjXvTw0QmXXrghpiQ6+ CmrxIHS81GhWFyhd/Q9sKyGpFE7JwzMKknBHhJGkmNnJWiASu18rqnIVdKaokMh4bFqs ABZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751653430; x=1752258230; 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=IDca/gZfoU8qWqoI93oSStYaaDnmBSWQstSERYAAo9dTyLO/ioVWYhcic6TQAfm00n eo+MkIxMiTp9mkIovdO3WjD7Aj5Z52jkU0KyP/QI+u/zl+6ZnqsmC39x3cbTBwvNG4Cn 6Rjqf5TyXD+xnNu9ZaTSI348t/b/FnfXSUTiBBdHuzkrRwAy0vf62jStW4vhy4XYpUco uVhr9I4xmIaoau09smsX9bM2UpeZ8Kf+6LiaFaVsp+LnendoGBLEI1G+v0HQ0i0ANr9K fsMdSZuerM91lly2qZTLn/HcPZAoElZclO/KwMCUnZVNAzSfpVeG+e0WBhxgkVQy8Yyz mmUg== X-Gm-Message-State: AOJu0YyYmc/0CJZunIzd+TNtWJjFlzngIi3rjzy/U0LBL6pbnJiLt74i sToCg8uoCXqgs/6sZ4VQjojPmCEY/C2R7/lus2x+dKc/3KheIQMkUpBhVCPfaWtNxcQ= X-Gm-Gg: ASbGncvwMxLFI9UdQPtt5wQ+/RCHxclzHwTNymbgn0E2R/iCVemE+CLEzWSHcBw9zb9 ZT8JuzCc8pEahCg+/J57XEiqz+7nfUnkHc3bbntPH8yrPbPp20qwpTruYuqEXlCC3UWieG0rRRW X0S4IvMebAbSO3dN8JBoY11FSNNKrk5WnFkeLoHcQlOKJsn1ZRXPV8wQTeO7Nidhwrgz/mXj/EP YHT3y9jkR5BgHzQjLc1h4ojfxERN1cnLYYZmnOmxV0emIkaf8iIXDa26j4p0/MofdfHKvwDb2pu /E9IRvpOs3qnxyNVTGGVGl2f3Ktx2jHW7vCsBGpKYaW4stZhMPNsMcJVq93YMLJVXzw= X-Google-Smtp-Source: AGHT+IHcGsS8lCBCc2bG6GiwF3Ci1TV5JesuDe1bXsduyBVEYl+kCzXmLRqAZibZ2g+n+KoEDJjbSw== X-Received: by 2002:a05:620a:1908:b0:7d3:92bd:21b8 with SMTP id af79cd13be357-7d5dcd15dc8mr574698785a.17.1751653087454; Fri, 04 Jul 2025 11:18:07 -0700 (PDT) Received: from KASONG-MC4 ([101.32.222.185]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7d5dbe7c188sm183300585a.59.2025.07.04.11.18.03 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 04 Jul 2025 11:18:06 -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 v4 2/9] mm/shmem, swap: avoid redundant Xarray lookup during swapin Date: Sat, 5 Jul 2025 02:17:41 +0800 Message-ID: <20250704181748.63181-3-ryncsn@gmail.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250704181748.63181-1-ryncsn@gmail.com> References: <20250704181748.63181-1-ryncsn@gmail.com> Reply-To: Kairui Song MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Queue-Id: 5D3D8180009 X-Rspamd-Server: rspam09 X-Stat-Signature: x8dpm7fibryb45it9nou4rz9wyokfe8s X-HE-Tag: 1751653432-770253 X-HE-Meta: U2FsdGVkX1+gRQmPoLK9du4b30OtUtvbBmPMLIFNfTBfvXvLBR+aRXIEo0XIP5PmM9dnkM7Qxy5Mv4Wku8ImnLNobM2p6iZA+WBgYPGIFtSxCHI0B8zoRjpVYE8ECe9Np+6eQYlCwZe7kYuTJBZwAZu9eFwFUOEYDTAS4M/a7u8DUh6W6P3HSZ8xesWLaaQlDzQY0fL2lZ/pL35Qc8pBHF71x0ZhRauBgprFDcniEhdKJ+NJnT5ybDvokLgi56kqK+hl0Nf2LijuezmEpm2cPkzljPZmKqxK7oLwLDbZrIOhgHKpQzxHe4JQ9+B49+RZYzHrUpNSLvOIeZ7lwqjpeI3H2rZzpDzorxvf6UEOl7JnTzqTPsRtplVhkZySlGDy082Xy+0mnJ2mLBTf2C0OzHJxLpIyG5FjLv2O1MvC1Px8t3gALzS57nR9mY3ndKmbOGCI287mQBXV6ABnQGRNPshhRZcpq9HTtnzoUeZiXuaO3MBfmcK6eDZB9odHWgHzWlG93/BiaXlOVqwNtljFLR+zsPKNHmt19vHHATnenePF5pOQKj/mkvxd5Z+YNcYvmw2EtSS5REYMywsUT8Bfvd4lkyrWGXDg29+L9cFB9+v1DRY6/JnxmMm+58X5YAZuemV3CXLoPN1wFLUG4sxgpv7X1A8+osAaMyYP4tlq5jAxr5JIRXgyzlDnhYhZ0nqskW2Iv9GXFACANAs4rfac6kQqqUG93HrNMQOBr7auMJYp5ftpAPRO20nulR/yGRoCMyikPbaWigvM8fIUyHlMJ50K22iP582ppCqzJDTboPP9TPUQflTNx1GAcWpJSzsCXucZOnmZkZ1CvPCxZf3QqOdx6SzrzV+NmKk9OuVNKcGNhS5SmtC1eJ/fXXXbIPp1+LO2G10s1L+24lLLro+TI97X7W0PE61TzTWFhGg3QKlw8mlymBoPm4UURpGNd7u6Oobn5kOdfHPMSPoM8uQ BcY1Ozyn 33KcNrjta95IObiJUXPTVJIQOCtRPVAZ+dy3lbU9UmSr0pQC78qr4gYNz8WIEb5w1T1YOw/xaDCBmY9s5qhP+P9Bx2MDXZhfTRFnosvQ+VRUk76P4/yDIUM9P9pJUoohIM8qrFK0/RHlf5LzLWP621PgxxclQ6DHCMnA2n5ERZzCDwsY3uSmyYwMTVM8l80Xo/FfWllPbT5miKmu7J0YypUxWN88yAwVlLnDZVbDGhh59wl/7NeGd8O9y/1Y26TjgAvklpjQiEPjcpznLGW77gblolHlQwZg5JKwS2C+WDOO5cbYAv7iJo5j8KmQn4vkzLwjFcj5105TyMOTZDQPbo4u8vZrms/Ma+mX7FmRHBMm0o3hi/5zqzAMrdfnd9uKP/JubUHnY6PtHf5BQZY+ZoyD9rMFSLCYMohWW6kibei79fw+sRm9xXTVsKi/cvY5QMrpVG56roYHt0txhSXTHjGRi5TRzrrlLu2gGbbY/DX8+awBbpw6CsLbnYyToC2EQ3nBf4BO90a/d2u8LpMXf0EamXLDA83HvVKa1Wgju3MHTYd5zvxDmX44XV7ZJEnkYy51yxdcvqG31PwmqkMSYgF+IPWTVOOPwWCA9g0J4Vp7q1B84aqRNQAHYjYIv5kunGfE5buDdaWwna7IZZ7I6Ugq1yjOI55QG0EOdBd/hBtiVQSpZqJbokEG2aGXyU7mTW5xrQOt5blbtHXaoFH2En+QJZg== 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