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 10415C7115D for ; Thu, 19 Jun 2025 17:55:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 620276B0098; Thu, 19 Jun 2025 13:55:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5AA546B0099; Thu, 19 Jun 2025 13:55:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 423BA6B009A; Thu, 19 Jun 2025 13:55:58 -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 320226B0098 for ; Thu, 19 Jun 2025 13:55:58 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id B6BC35B9B1 for ; Thu, 19 Jun 2025 17:55:57 +0000 (UTC) X-FDA: 83572903554.17.61B86F0 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) by imf22.hostedemail.com (Postfix) with ESMTP id B0EBCC0004 for ; Thu, 19 Jun 2025 17:55:55 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=g+Ee4zQd; spf=pass (imf22.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.214.181 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=1750355755; 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=qhxEiBYif/YKCDyTxEvEnwXoCgIUrrgaAQ2W3uziJ+o=; b=UsGlktP1V8ggg4TghEglcTKHuRejiXFkxIdt11/GyivSdBq1CMw/OGgpdMlwwzOvexgh/x T2lqLjpkN+nxgBSOcBhmX6PejsLMFl8ExxNpyxaoEPD+rW1b0TezTdLeUJqSVxBgO3ukfq lv7ajFD7rUGRSIY/2ygsy3Ys0LkLlBE= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750355755; a=rsa-sha256; cv=none; b=nncHIV4KhF4DgoOt5w1VfggFVJCbzuEPAakLECMgvr4/qu8WcxzGOQ4DRynSe7xOYbYsU0 TCzvg53fklwQ9ww7Mk7oZzzuv1F6okJ1KrfS7MtKbHCfbRsFYL0GAd8xFzgB6iuGl5uNjf 8CzymB5IWlP9ax+U6CMB7SfzRMB4TI0= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=g+Ee4zQd; spf=pass (imf22.hostedemail.com: domain of ryncsn@gmail.com designates 209.85.214.181 as permitted sender) smtp.mailfrom=ryncsn@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-234d3261631so7038305ad.1 for ; Thu, 19 Jun 2025 10:55:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750355753; x=1750960553; 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=qhxEiBYif/YKCDyTxEvEnwXoCgIUrrgaAQ2W3uziJ+o=; b=g+Ee4zQdNC0HqbVPuCYB6xIflt9uHfIpk0wUXW00vEjJ5hwGeHHJTzqjnCM1v7V8Un xjct28kv0BmNPhp7j5YlG471I36cCJKsF9yZ9ZmtNwpphkRdHE5pYJ6CXCe63Aautg9u hjXIp9cCWGQYqs17DhHpXU+x4McqI0kPWlmSAF9HvMd2aUOEPWLF5GrKaxYkkzyLKvXL //oG4X/EAi3pb5BmfF79b4pd0nOuP8y3Dwn/eZjanECPEPKpqRehmdi1mnr2ZtMSAQCn V4eTN0hOwOlRWQCyvjr5e0c4qLau/AU6sjpajSt79ET2Hn6gKZhjW9s9K44q2XMthwrX k5/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750355753; x=1750960553; 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=qhxEiBYif/YKCDyTxEvEnwXoCgIUrrgaAQ2W3uziJ+o=; b=LDyH9f4XIADxwBXvc0JbqmWim5XuWbPlaFeUamjqSIxkDiDF5Lp4bF1KdkByBQikU3 cmsJkJMk4of1sA8/KOEIG30RP/ZA1cPuZKsENRxefPfqxaWhrTbL/OfDRt3obj8LjTm9 DgMbxC9/PjXmjwv05Wr2aAXkcQXU7Fnfby5Gnm+5Nez5/G74SZzt19c7RZFzlmJO/OXO gABq9f2HSFnw07S1Vr1EYC0H1Oc9PMfT5pV0Exx/mtXpnlYK3H6SIYJejBtSl1SH8LKK mA939pOks/mfZK6B+HgOdkiJNyOyr32r3whUFxBelzwj+YDibdFsP1z7yDBtuoHvM2rx rF7A== X-Gm-Message-State: AOJu0YziWPms9J8cCN0VPbjvvaMA6+GqwGyX/fXeHFcxjnyFjiZlLvaS OryszqQ8ll1i04rhx26kBXoEe+Mr5FLvS2WNfmiwV7/VWfSc8LaVYkUCbfaFW7pzefg= X-Gm-Gg: ASbGnct/GGEEUM6Iw2FsvQmKP4qV7Kiy39tgXUV8eI72RwSoNIhUzQXzc3eS35k1W7z R6KJ4/a9XWUIYc9KZOYmYXyaxb0aLqWxVGlJGFX3iUWAInWXN+bvmr8UGdFHmtmTGWfgQonYF4F 15F7nG4q1V2RELu/KM8/vRoZWBde2qIdqlY/T8sv1I5AhVeoj5xPoj+sZdHvqmBI+j5ksdeNWB+ jCI1bE1ZPXdWd3Z0Faoj1ANuCXXd+HaX4hQoDSKsa7Tu09PaygvY7v9WZkOFEwhI+FguTPKuqRI +LAmIEHwTdpVa3twCGk86GKfjZGY7STq9p276DDvgnHmTp2zZ3doOqXFzVQwlbpfC19h7d1gBRE KeuiLpRGwbAdSoQxcww== X-Google-Smtp-Source: AGHT+IEJFgdALACITfgwxqQ56cWatjSGdDaAunvgPQAqa+5FC5hRIuAlEC9S5QqI+0+fDBmHXigCPQ== X-Received: by 2002:a17:903:22c8:b0:234:8a4a:adad with SMTP id d9443c01a7336-2366b14d484mr326770805ad.26.1750355753431; Thu, 19 Jun 2025 10:55:53 -0700 (PDT) Received: from KASONG-MC4.tencent.com ([101.32.222.185]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-237d83efa44sm255215ad.77.2025.06.19.10.55.50 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 19 Jun 2025 10:55:52 -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 Subject: [PATCH v2 2/4] mm/shmem, swap: avoid redundant Xarray lookup during swapin Date: Fri, 20 Jun 2025 01:55:36 +0800 Message-ID: <20250619175538.15799-3-ryncsn@gmail.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250619175538.15799-1-ryncsn@gmail.com> References: <20250619175538.15799-1-ryncsn@gmail.com> Reply-To: Kairui Song MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam03 X-Stat-Signature: w8kh4scwor1rtqrmdu5jsoommm3yghxj X-Rspam-User: X-Rspamd-Queue-Id: B0EBCC0004 X-HE-Tag: 1750355755-872520 X-HE-Meta: U2FsdGVkX1+WEkL0vXX77RJF+sThwfIG3nWq2lQoLYOAx5ESlyFm4V0hiac0+UChJ9WKs06ASuyliSJfPHqiMjRvJNlwvbqC9pTvLaWawXCquX3LEFTUzc3/FAhD3cwKrplKFp0RHnJAkXYcPYMJJ5vlIL2H9Fk9bwdCq11iRYOY7u6e36u8y5PDtLdlIVQHtFIVueB1Jy/lADMZbR9zsUsi5kqdfrz46KXJlL0dJd/3ojYbQo3PL2RlbtrHIVjEBPjqqjR0rZ+Nhi0u8e9J+NNiU6NNgTAmQlpQItST0owNFQVQSNhQlDxyAXeA+HElGkIBTuIQU0q6qRw70kTGSpqqeaQUSf2e4d+SCSAwvNvJ1WqAmka09wG07t90alLsXIiRSfXOhBgJSt2s6xwM1lXqH3Eo55elKoK25ohwfPQtCog7FhR9to7Oodc3GV2kxCHtmc9oKRU1dz8kDfsbpotXOb59+3D5fxGG+SnWH2yg0ZrPHWgZa8U5I1Swrf5bPwILJozsXdZkF75+42bkVwQnJBHqB4PIhnuF2OyZhe3RT83zEhPxhm+qRV0c3/ze7hQy9E7+102Rle0JVgDECaUp0GZcb4Avw16E2sy8MwvGK54GFB4LtM/GoQZ3f4eg8y623cSB5gPiVUUHcKWpTlDQAK9Nw22CdDmeclac27uzO6kp121DnI/M6VOx8Zuy+AWqCPZTd5LbMFKuYjvGbIksM0o3Rgk4nSWlPTzLnhF/NXSXBfcQJ9XObzWUslsbTh1hd3eNrpdxO6j2y2wVn1k6a1+qhyMlWHI5fiA+ILfPoyIgsvHLF2K2ykA5aO3J7RR650E+sk91SLTyXZg0yLtfSVltYi4lG2dmZi+eMKHuWVOs5Iy0ZWPkRF4Y+F1PQHxJUabJ0zDKYvCf9V+gHIw42I+Isw2r4DsfHy8K7yhZAkozQXtOvBcQrI68zLmBz/kmOhH+j2YD/Yb7ORj UiC8N0/b klblhdj9B+wECFqaZ0YrplO/qeptEFF5qwyOt3XHxg9L7LAqiTl7Hqk24Hu54yNk5TzERzQ/Kq+XEC8QK25d3RI/SilaphvrXZ8VaxMRavZP9nn0ZVht7wJWc94CrWx7yttseqRyyO5ofqv/WKdB0Au2kOC16QXPZPJDHkqk9QSA3pfnqByt5kMKdEnHRz/uj+QLx80L0hv2nVfbz7bsa8y1RvNinw+r4STPudkL10FC5Y2DVxN5E++2X3AVY0Kd86JzZEkKyUFvlOwrmARH+KC1WDUJbQMJWeuc0PXDy7FZTPquPvoa2Gtyzm8I8knX9B/UM3tA0LJl2k60Em+stUiEFphz/7yMKhlrPIF/afkiR1zs6P/PDTlnSBMr8cXcsRKkQquOkAzzdudZF630zWjjx2Ud9pKtZo3dyJyBtoTomGtfYOVLWAZaNLMnCKlOjwmYJd59WMj4wetGj6aZiPcWKGklFV16yMcaZDXN1AD0ZIJhVy146RgzUcIjJskB7dmW6wzznVNvtRRTte3Gnj6tdK0Q4pCh4c7QTZOaYFrlNs0o2Luraeu7uvHE3sRowc60tII4TofP+5DjQEJIwlU9GJg== 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 --- mm/shmem.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index 4e7ef343a29b..ce44d1da08cd 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