Received: by 2002:ab2:6991:0:b0:1f7:f6c3:9cb1 with SMTP id v17csp797134lqo; Wed, 8 May 2024 15:42:15 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUnK1fWPEqV0ZTIxLoRAQYZBBVr1r5RZXPVfXoqR25+fKihTn0MJF2KSh8DLA5Ut+fycckC/EA/s5RhuOuBMwu0r/DQKjJwcceBVwA6hA== X-Google-Smtp-Source: AGHT+IEHwIlyuKKSu6Ul6YTgd1Oj5XIZJ28YgtFEOK52P9yUhtdW17vVVMXz5lS2DYVBuNsQAVRg X-Received: by 2002:a2e:8053:0:b0:2df:1e3e:3280 with SMTP id 38308e7fff4ca-2e447081ee7mr34743931fa.28.1715208134896; Wed, 08 May 2024 15:42:14 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1715208134; cv=pass; d=google.com; s=arc-20160816; b=ovRJU3ouCjj96VRS0W87YK+Yh+nUgI19IaTFaOyl7hlBJlVG1IgIyGogJ8cvsLIiH0 BY0vKsE6n40/2HQ3Gz+wcD/C3cvx1d2zLpBkY39cghbxJs++X2jxIacwYRKeZazJ/t1D /3X6iF/zyqjDtKjlty9uo94nHdUY/WUN0E2NptA9+duqC/VSloXQ0Va1S3qoBPxViuG1 Rl/35PsF6SWBCgqJNZevrztJx+eAuhBIrkX37V4Lr8ZOQcEVjqwkTCr0zpZKzdq3oZoY bdn7LIFkAovv8khvhCUdZu9WMY+gP3w3CRhgHJaTxqxDgiN0rnSDk0N/rEWQ5fMciFVr kJ0w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=DOx+XLJ6NG229/wS5wOB5lVEjUmMQDyjSrW3ljEjCDo=; fh=xxAWP1O+RSxt5PADC0f6tPJXSz6yPX+cVDvE+clOM4k=; b=LBcBHO8SA1RA87LHpUncPMKbRbXiAR4u0PyW4tPVvSqIivYg6R6RCTRsBlxR0vHH6X HW9qEF1IIuj7s29cYhx+iDPTo2se/+xNRvkn+xIz5UeaDitCYYpQuQnx5mkD4hEWMGgU z2MRe8HPwY7HtWhl1vOPRWdzTJAIQOYkpV3aAs1F2gvkHOFlUruGW6nU8UeopjW2UiSi NDwUWDL4W2M7cWvgr82Fdq1+6Fx2db66Dy8RbaZkfe/hhuG4VifzFzdKke87V7cMgc4u Q3/4D9hmk0bYKBCgrTKLiM7E+yrHNpn8PcEKS3tma1EkTMk5L5X4UguSStvD814sRcGT xZWw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="O/aKUiKW"; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-173904-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-173904-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id 4fb4d7f45d1cf-5733c36d4bcsi55547a12.540.2024.05.08.15.42.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 15:42:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-173904-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="O/aKUiKW"; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-173904-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-173904-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 2CFF01F216A1 for ; Wed, 8 May 2024 22:42:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4A57F2AD0C; Wed, 8 May 2024 22:41:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O/aKUiKW" Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E614D286AE for ; Wed, 8 May 2024 22:41:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715208112; cv=none; b=IPpST/WpV6QQS3J3nYolcvkv+f46+hXVNjrbu/VCxskf4gYYBRFCghz8z6X2+dY9F4T8rAJVqtjvuL07Tpqza/Tp238bE7fNGVrstty2bg6sTlGGAZqld8Z3muLwiDM+OkZ/Jii44hhJip80mBc2FIyEIhQYnYmvbFWByFzu3Ds= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715208112; c=relaxed/simple; bh=nrAk9y30+c6gajgSfc4mOHwujo2W6S4FOBjLI/TfuUY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FLm7IvszcmbmM8IHcabSvCgiG6V/kTnWOqjs3N1fbNQZJw3KXm2R1Qb/+uuevHseb7kpxuD0zjRcWR/KX+EWkdOnVV1QHU9vDsd6IAsD1JuL487gSDketZmEGNtiipjzwaB8tU6aOfcYpDcGqyZ8xB27dM24x81AEG0FUzX23iE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=O/aKUiKW; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-2b3646494a8so241119a91.2 for ; Wed, 08 May 2024 15:41:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1715208110; x=1715812910; darn=vger.kernel.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=DOx+XLJ6NG229/wS5wOB5lVEjUmMQDyjSrW3ljEjCDo=; b=O/aKUiKWhsaKrkTDqwOqlNKY4Ch3rw/6FIPZLSiC8zybtq28idaiYgnAhp+rBugAjA nelqlXFAtxGqsXAAfiKKvYnM2OM0Srn4IknZmnMc6tgOy2kE/eqhhE0r4N5zuYuJR4sr rDmDABBWyx6cy8/FZthDBdmfAAYW8ylbZAt9hH7C6dsOoAbXPLvT7+43Xid4tVpPGYcQ JjjiBk2Lmb5UMnd+5DvpAJI7dtUQJJizlLy8NyfCHzYUkZ5jal/9J3MaDBzcYxWd1G8W X2yL2gc79x/tGFDmO7QJkCUeG6YIwHXtBjLyKGEw47Kf0lD2QrDZbf4FzXSoyS8DAlSp EMyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715208110; x=1715812910; 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=DOx+XLJ6NG229/wS5wOB5lVEjUmMQDyjSrW3ljEjCDo=; b=f+EvEIDqy35CBwuoeXR83ZwFSF26PAhFsapUNHLcXMHWoOI/ZN0CEDbsprDQqR2xnr w9IQxTzJcX6yN6VSjS9MawbCeLIoEdt+91MkLQl3N3p17ElSmQiEkun/goC4ekhxf251 989UkgE6gMBz21g9Hbk/6/w4P/CeNwWrbBlOXzGcqSU/+oC+MP/SmHei8drR5M/BWoM9 Olik5y4fbLwrRyL1DQT74uWZDvKqsCl8fKhISAAKJSfoAT0PSi4bJVgMvb0D6qwUfvGU 2WSCMaaF0bXEQaubdZWRFMsWoCBtXa/6N5ENOHcRQSi9iqH4nILbOp0HHxYb8Gb/fAsm ALmQ== X-Forwarded-Encrypted: i=1; AJvYcCV5w5a7aPQH8YucFQS3yCz8ok6i/yIUIG6Lbn0U7uDJvauj5YPhEsobx8eIDQ0jvH6OoWFyFKCRva8e83iORoOLAKnCAzWMxyjbhQaK X-Gm-Message-State: AOJu0YyHPrrJ7lzxGarUQqjuY7w9bkVwu/ltEzyLPTiE9HJK8uvxE37A rzfYRlLYkIjeYt06ZaQknP/GLaSRybFHjZxaBedmzKTo+4vJJY25 X-Received: by 2002:a17:90a:fa8c:b0:2b5:1f7d:7eae with SMTP id 98e67ed59e1d1-2b6165c4fbbmr3664457a91.24.1715208110215; Wed, 08 May 2024 15:41:50 -0700 (PDT) Received: from localhost.localdomain ([2407:7000:8942:5500:aaa1:59ff:fe57:eb97]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2b67126b666sm102082a91.34.2024.05.08.15.41.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 May 2024 15:41:49 -0700 (PDT) From: Barry Song <21cnbao@gmail.com> To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: baolin.wang@linux.alibaba.com, chrisl@kernel.org, david@redhat.com, hanchuanhua@oppo.com, hannes@cmpxchg.org, hughd@google.com, kasong@tencent.com, linux-kernel@vger.kernel.org, ryan.roberts@arm.com, surenb@google.com, v-songbaohua@oppo.com, willy@infradead.org, xiang@kernel.org, ying.huang@intel.com, yosryahmed@google.com, yuzhao@google.com, ziy@nvidia.com Subject: [PATCH v4 1/6] mm: swap: introduce swap_free_nr() for batched swap_free() Date: Thu, 9 May 2024 10:40:35 +1200 Message-Id: <20240508224040.190469-2-21cnbao@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240508224040.190469-1-21cnbao@gmail.com> References: <20240508224040.190469-1-21cnbao@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Chuanhua Han While swapping in a large folio, we need to free swaps related to the whole folio. To avoid frequently acquiring and releasing swap locks, it is better to introduce an API for batched free. Furthermore, this new function, swap_free_nr(), is designed to efficiently handle various scenarios for releasing a specified number, nr, of swap entries. Signed-off-by: Chuanhua Han Co-developed-by: Barry Song Signed-off-by: Barry Song Reviewed-by: Ryan Roberts Acked-by: Chris Li Reviewed-by: "Huang, Ying" --- include/linux/swap.h | 5 +++++ mm/swapfile.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/include/linux/swap.h b/include/linux/swap.h index 11c53692f65f..d1d35e92d7e9 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -483,6 +483,7 @@ extern void swap_shmem_alloc(swp_entry_t); extern int swap_duplicate(swp_entry_t); extern int swapcache_prepare(swp_entry_t); extern void swap_free(swp_entry_t); +extern void swap_free_nr(swp_entry_t entry, int nr_pages); extern void swapcache_free_entries(swp_entry_t *entries, int n); extern void free_swap_and_cache_nr(swp_entry_t entry, int nr); int swap_type_of(dev_t device, sector_t offset); @@ -564,6 +565,10 @@ static inline void swap_free(swp_entry_t swp) { } +static inline void swap_free_nr(swp_entry_t entry, int nr_pages) +{ +} + static inline void put_swap_folio(struct folio *folio, swp_entry_t swp) { } diff --git a/mm/swapfile.c b/mm/swapfile.c index f6ca215fb92f..ec12f2b9d229 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1356,6 +1356,53 @@ void swap_free(swp_entry_t entry) __swap_entry_free(p, entry); } +static void cluster_swap_free_nr(struct swap_info_struct *sis, + unsigned long offset, int nr_pages) +{ + struct swap_cluster_info *ci; + DECLARE_BITMAP(to_free, BITS_PER_LONG) = { 0 }; + int i, nr; + + ci = lock_cluster_or_swap_info(sis, offset); + while (nr_pages) { + nr = min(BITS_PER_LONG, nr_pages); + for (i = 0; i < nr; i++) { + if (!__swap_entry_free_locked(sis, offset + i, 1)) + bitmap_set(to_free, i, 1); + } + if (!bitmap_empty(to_free, BITS_PER_LONG)) { + unlock_cluster_or_swap_info(sis, ci); + for_each_set_bit(i, to_free, BITS_PER_LONG) + free_swap_slot(swp_entry(sis->type, offset + i)); + if (nr == nr_pages) + return; + bitmap_clear(to_free, 0, BITS_PER_LONG); + ci = lock_cluster_or_swap_info(sis, offset); + } + offset += nr; + nr_pages -= nr; + } + unlock_cluster_or_swap_info(sis, ci); +} + +void swap_free_nr(swp_entry_t entry, int nr_pages) +{ + int nr; + struct swap_info_struct *sis; + unsigned long offset = swp_offset(entry); + + sis = _swap_info_get(entry); + if (!sis) + return; + + while (nr_pages) { + nr = min_t(int, nr_pages, SWAPFILE_CLUSTER - offset % SWAPFILE_CLUSTER); + cluster_swap_free_nr(sis, offset, nr); + offset += nr; + nr_pages -= nr; + } +} + /* * Called after dropping swapcache to decrease refcnt to swap entries. */ -- 2.34.1