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 1D433C04FFE for ; Wed, 8 May 2024 07:37:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 842926B0093; Wed, 8 May 2024 03:37:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7F22B6B0096; Wed, 8 May 2024 03:37:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6E13B6B0098; Wed, 8 May 2024 03:37:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 51F386B0093 for ; Wed, 8 May 2024 03:37:52 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id C226A40D40 for ; Wed, 8 May 2024 07:37:51 +0000 (UTC) X-FDA: 82094424342.07.ACF1A7A Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) by imf05.hostedemail.com (Postfix) with ESMTP id 9028110000C for ; Wed, 8 May 2024 07:37:48 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Hb7/aZLE"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf05.hostedemail.com: domain of ying.huang@intel.com designates 192.198.163.11 as permitted sender) smtp.mailfrom=ying.huang@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1715153868; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=XJG+Maq/WY802+0yoPZEc8f37QCjnpeI7YozgmdRL0U=; b=4azHRxw2bNbId2OeWjYvgBh/QyUbPBvrxGzH3zjjWEz1FLNNU8Rw00g6/rLuV+jIGIGFH4 0RLwPTJJebf5+JFfAOFQQG6eNw9A6wDr7kXOVTHMO2tjmCDcSc8PFqEfvvecJVrQbF89wt 2ND2p9JbmvGCNgmxdPEd4dInrX3jhn4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1715153868; a=rsa-sha256; cv=none; b=J+tWuLeqFnUf5EdHLuxif5txDv/Sipk/e0384vWoh4AZab9D9WGGv0bu4gI9RGk2R6KwLW CusFZ7qX1QKX8iPDYdf6Tbw9r4m6E+99zwXvnR9+AI3EMN0/hs3AJynecWggA/u0tPsTKp o//VdflF2LawZZTeDStzMc+ZeKked0g= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Hb7/aZLE"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf05.hostedemail.com: domain of ying.huang@intel.com designates 192.198.163.11 as permitted sender) smtp.mailfrom=ying.huang@intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1715153870; x=1746689870; h=from:to:cc:subject:in-reply-to:references:date: message-id:mime-version; bh=7kK1OGyMIdX7Apf6Ja0H+cg76QDS3Hw4FvN28t5kLy8=; b=Hb7/aZLEskcIYByC4/1Pich4Y5nPmJ74tobIWZZj18w7QzimlyhoBcOT kYWDS0qqa3bDdmqDIPh1CtZS9UUq0fuDMhS/rHzBeq7AUAR3MljIj5gKH gWbz4ADL7t1QKcJGCpuEVKvaXYIr8TsR4XiL0UG6snPN3BI+476zpd1Z0 7B9XGmgeA8CzKuXj6ZLKIvSqPLRSlYz961Fk1D/+KlkC9MxgsSkK4S/ZX S1sxrwlNeVXyIUDbAX3EVoIYYOVlYTimjzSaZ098MV077X+sukad+r33X 3K4z5oGPE7Y29CJsNUgwWujRv1TXmS5ySuOl/LXwXgGBXdglklfvFaPYE w==; X-CSE-ConnectionGUID: fbSGdAXgT5yz4HT3QyR19w== X-CSE-MsgGUID: yKEKJoZxRoONQf0le0S1tQ== X-IronPort-AV: E=McAfee;i="6600,9927,11066"; a="21596318" X-IronPort-AV: E=Sophos;i="6.08,144,1712646000"; d="scan'208";a="21596318" Received: from orviesa002.jf.intel.com ([10.64.159.142]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 00:37:47 -0700 X-CSE-ConnectionGUID: wPLR2/CiQuaJotSJBX2cMw== X-CSE-MsgGUID: Zebk5gcESHmin/TaV87uCA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,144,1712646000"; d="scan'208";a="59651920" Received: from unknown (HELO yhuang6-desk2.ccr.corp.intel.com) ([10.238.208.55]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 May 2024 00:37:42 -0700 From: "Huang, Ying" To: Barry Song <21cnbao@gmail.com> Cc: akpm@linux-foundation.org, linux-mm@kvack.org, 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, yosryahmed@google.com, yuzhao@google.com, ziy@nvidia.com Subject: Re: [PATCH v3 1/6] mm: swap: introduce swap_free_nr() for batched swap_free() In-Reply-To: <20240503005023.174597-2-21cnbao@gmail.com> (Barry Song's message of "Fri, 3 May 2024 12:50:18 +1200") References: <20240503005023.174597-1-21cnbao@gmail.com> <20240503005023.174597-2-21cnbao@gmail.com> Date: Wed, 08 May 2024 15:35:49 +0800 Message-ID: <8734qskb6y.fsf@yhuang6-desk2.ccr.corp.intel.com> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=ascii X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 9028110000C X-Stat-Signature: ef1x534eejkok3o9yxd7dfu6yan5i9tm X-Rspam-User: X-HE-Tag: 1715153868-412144 X-HE-Meta: U2FsdGVkX18+ZyalS7ZGA/faMG0zKluShRaIYRTFkgUmZRz+x8u3q4C535anvOU2iCZUZ+661GnqMl/zM0Rd90yYyt1LxN918p1PCoX674btHbpb7fomDQeP/KS19daWUOPIAJ0117kIxLBHBVCiEV8Ppl9vmxkcBFO+8byt8eRM8YOoiEjSNyJxnym5+0mrJF4xIMdrhSx5tjl/EBWApYYX2r1PTCSU4xmgvTJymk2kijpGth90pBHr5h8vobA/cyZ0Eir3frxqBng9BPkD2jHZYuNkA831Z9NRCJCk4AmGVkgeySIUUFwvnjrxKQDudxAqNyHrZXx73JgJM4r6d+y2wKZYMHyObFlpYyzYrZ50U8UPQlHKVizbfNglyE5jCu4+inP4cUGtPzi2Smj5qOSNFFgXgPneksHMes90rp6K5tox3oyjrHzZcfDg6fD0Zwzur/lX2rvj5sAfTlGQjTNb8k0Gpo2++cJiI1nhxFbgplM0jsttF4ioqdYj0qvW9zybixeFMccEGNWpj7MjWghn2Asv8MmtmZ7LmSVoAegL/7l/5DZ4+DpafjcD3gSGSmxzznYDb2idRgOaol4ee3jM0H15+kkmTDW2HnQb5qXo8o27iLPEmv/W9MPEmQegnr9wU01ZC9AvDRBW0jvqpnrz7HTM6g4XSUFTsu+t/ntaSd0CGDYsSbyi2DdSqkaluD7P5SoaURwz6QSRhLpLu40KAyD+RiPMX4muD6mnoyrFXnZdXJh6efH7R0tVBuefVeZSiCEeTZbaaQWxOI9dC3SUc0vexYaqWUSITCy3/88UtAvDKyADygWYWs+PGRPJf/ExaXzF6nEqfU9Oz3S4DpJFi5jxcwFCJPV6W1Cf56I0ZPCUjeoNyMs0gyjXDjaGwb6mzAQRbm4AZFnK6E13UqgC1UNK7rGqmgmXIkpI93euDnlffASWrX7tAv5biJ5hK3obz3TV9AfpL0OcbEo 9MrGgqdw S8jIznH30igKdX3a52u4LCmtag5Qg9OXh033UzbKut+FmJC8SAW8zn79nfiIlId/ZVxdLDCOqXoNkGpBBgCB4DN+yLAkwXnTaADhvbUpd5UBZ02V4Ek4PjhfQeH7+iBxIxu6GcI4mEMPe8DDH/MhU6DOnAAZZd1EmIL2r5xoaUI3jwivf8smoDumxR30lcvp+4ZjGy43q0lJUOG74L1jK0xF1D/yl2G34ADyyXpblqsQIWEl1BJzlwOFN3wN7omG6kUZxY3NHH0jekSPjKUQ0dLyekjYl7Kz9WVAQng8lM3aB6BclQv1q0ybNEsYszydFris9AxlSGqZ3TKc= 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: Barry Song <21cnbao@gmail.com> writes: > 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 LGTM, Thanks! 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. > */