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 26E8FC4345F for ; Fri, 12 Apr 2024 11:39:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 759246B0082; Fri, 12 Apr 2024 07:39:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7096C6B0083; Fri, 12 Apr 2024 07:39:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5AA1F6B0087; Fri, 12 Apr 2024 07:39:11 -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 3CFBB6B0082 for ; Fri, 12 Apr 2024 07:39:11 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A9E81120E03 for ; Fri, 12 Apr 2024 11:39:10 +0000 (UTC) X-FDA: 82000683660.12.E7BF185 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) by imf17.hostedemail.com (Postfix) with ESMTP id C9F5A40009 for ; Fri, 12 Apr 2024 11:39:08 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cZXG39Ts; spf=pass (imf17.hostedemail.com: domain of chuanhuahan@gmail.com designates 209.85.208.46 as permitted sender) smtp.mailfrom=chuanhuahan@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=1712921948; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ne+lbARHIxIH9ow2SNPs+xIBWW7muiKC/RnuB4JLtkU=; b=L/U22lZ1BBdqv0mraC6iQbzPaluyH4FU8DM6pocAX3Ul2olVDgJrnNWKPirAcW08nOsrSM MSp6whrVspCI6fgrXj2pmRMjhqnlGXfHRiyi2CBbNccv4yVJCPyEIatKKsjibYfDMGqTdf LvKvJAZTH5uVE7SW3AzQt17qsLLbGR4= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cZXG39Ts; spf=pass (imf17.hostedemail.com: domain of chuanhuahan@gmail.com designates 209.85.208.46 as permitted sender) smtp.mailfrom=chuanhuahan@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1712921948; a=rsa-sha256; cv=none; b=hpM5J9d3eXfhW6bjj8ppEw5VTyBJUyn41JnB3fzlJhASg3UVdrq1uznygYZJ/oI6G8rhZq EPmXTVkUNnEuDNoHrdGCZM+sZFj6FzfIpmVhj78FMtIfSkAEXMWCqLBiOLfjmmmg0vGeF4 /yOh5k4iOjEgN7t1xrlKfI3wwcLqtZs= Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-56e6646d78bso856497a12.1 for ; Fri, 12 Apr 2024 04:39:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712921947; x=1713526747; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=ne+lbARHIxIH9ow2SNPs+xIBWW7muiKC/RnuB4JLtkU=; b=cZXG39TsUnt68rMLJS5Ryz/fB4NwAIIoZqolLxhX9VSmu1zyoCRXixbnmz9f/KrtVH GeJUz5SOmCKfDk9p+xTumDOSpshjh8Lrq54pyAO9erQJwOOuDz0O/H5IASB0Y5da9knf c0HjNII8VIgDC/e5EusEI24lzFytVl5p675ai3m6XzYoajSOyLa3xUJxAmh7sEtMbaNC I0ULYwC/r3NqBE90lqHwnVGOtBt0ghZZJQLkT7P8Eq7RGTcMFK8hUe3DUxy6QrsxhCR6 zP9Is37f6fh7HgvtxNtoey6NZXmfjReequA7E7bHMS3Q93fe+pBESGzfEmDrtFyj3syU ORhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712921947; x=1713526747; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ne+lbARHIxIH9ow2SNPs+xIBWW7muiKC/RnuB4JLtkU=; b=ho+UK2k+ZQiI/nPCJcXzNClQ5jWo875yLVhHK39AKHsSk+uvYXa8VUURiun1f/PW+G 9NCxDN2rwOkOjI3MvmKPEwjOKB9SFrVGOvpXIQMl3ZGn2s3lqL0FjA0JMXdd5Hbt0omZ DwEzsGRuBb3QdGVBRwLfvU7BnzAJslmxd3upS2V6l8hcGoyTU6vE7eZm0Ur+9H0nn5JY F5gPI0O+5WCcUGMBCPoDMAnszyafJz4r2zYYSbVOb/QFAKgWjFSnelSe7rtRjNeCS6v9 ImImlH2dMSGyJqfEx64H9Y0e51YPbgw/ODwgBrmaRlc2OSX/8GGA+9BFeZAXHnJOQ7AE Ly0A== X-Forwarded-Encrypted: i=1; AJvYcCXMk/zV1sptOCm90ZGCHW/2dqinvb7RGaNxn9rMfPycmQ2itqb6jQJnrS6sKKQxGzqQqd5BV+yIwk0QXpJqDSKfqMg= X-Gm-Message-State: AOJu0YxRy1SJyJvJuL43pZHuliB5WvK24utzykf+/1V3NHhlnnJZxzVj Af6Moae7mm0pL1z+WCKl9J7zQRM/kXVi7G5Q+Uo8AS24qCbRPcy1uYRobWMakQNUphwb8/WdzGS pfdFmWHU8h1la+rcgNcc0Td9sbFA= X-Google-Smtp-Source: AGHT+IGJKL463vGhgAykZA/DrJ7dmuatQjc3W/dExDHS0ebPMyuuPP1hoCfNK2hrcfqmUASRS5iguO3X2fBw2gqm1Qo= X-Received: by 2002:a50:c30e:0:b0:56e:543c:bbb5 with SMTP id a14-20020a50c30e000000b0056e543cbbb5mr1435336edb.26.1712921946997; Fri, 12 Apr 2024 04:39:06 -0700 (PDT) MIME-Version: 1.0 References: <20240409082631.187483-1-21cnbao@gmail.com> <20240409082631.187483-2-21cnbao@gmail.com> <95bc0ebb-49f4-4331-8809-3e4625f1d91a@arm.com> <66afc978-0221-488b-9fc6-7d5213d385ed@arm.com> In-Reply-To: <66afc978-0221-488b-9fc6-7d5213d385ed@arm.com> From: Chuanhua Han Date: Fri, 12 Apr 2024 19:38:55 +0800 Message-ID: Subject: Re: [PATCH v2 1/5] mm: swap: introduce swap_free_nr() for batched swap_free() To: Ryan Roberts Cc: Barry Song <21cnbao@gmail.com>, 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, 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, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: C9F5A40009 X-Rspam-User: X-Stat-Signature: 5o9q11rn1d6s586psgducz7r5omzjswo X-Rspamd-Server: rspam01 X-HE-Tag: 1712921948-766974 X-HE-Meta: U2FsdGVkX1+IP71/e0c6lUQ3wom6pHtqKUEwHDXYj/OpOEG+YR0FeOWbJrn4glY3U3u3CMDqCzqG2Uozna8G2DQlukZDuo+18JEtZEOEMp4T6Gr69mcyj7TUur1T9kdn51MIzjrMYLY1nbydqm/YfcrzDbmbNXXVH37sEljBiTnNaeTmx7j0vffTeyr7R58eR6mczN0op+MZ3MpuvJuXKJXFrXlZMn/uNBwBgtXkXdeTqxotISJuaAZ9Er+Ovid/C8zPwekidUTualJhBcAtQKsg2aRALgWKBsF53bc41y8nsy6H9guYt9tIGDAU11rfk8o5gtbIkErlDygZNnMwABpvKKyTBHxLcM8+MqZDsCyHIrcwSNlyyZ1eEb5Yvmz0DVBILppCb7BeT0Lo2kv1W4P4u3N3JEaDG0k2CWihkhBKQgbcpv3lPmm24JRLSys7cK7xoHaMAIT+UJqaGYkpH1uYNJt0alYSV93S2Ne6lkdMfu8ZyIXFhpXSLon8JSBGoBreFzsSnnfRUhlQvXUZBCtY7H7myAieP/j1ZS8tZ2GeefT1kgJk910r0Tpo3JqYkINmSAvVoReSKSNUA81Yig6rCAivYCdBJlwyKZyn9f/ZVoYoCVWbO19kCGxJ8eW1MvDO/DzjN6FzC6jKCUWAiNxccA8qEKVZEhhtFMiMgK4zzUaIdk0gt+QLTtAdBwm31V3LL5QVvlqTWC33gwAaUctfZug+V8rLjbYgwuKhljBNqeM/FY1CFj2xhJSwhOh9H7XgcwW821/IADg9s9XlDGmnfIOtVGKnhAAJEqqSpH2bbJBMZjI+gCrVfG+tcm39B+zyaGz8jmxPPD0Gaul4JOWCTlN8/nR+mU/sTs09rlXZuhVc5KhPzy3zqPRuJY485qyxFEibepv905ff1M4+WKNKQkQ6/bnzwBwtA70OfOJSMLyyF42FQbVJb3OPrCykflwBd+hnI6IB3QOJpXO FCh+N0l+ aYBffsZs7ktSGRGy0Q3AaOSr9ywZhge8XZcjyT7i9GZh5eKCfJ6MUsyP16crTAGpexf4t+ZvkRZJtf0qTrOLTZSNv2qGJySwGwAX+vpNmG3nZ6m0zqpe1+3MCCdYTlVKMBirzaCHNCIrzEMsQcCGQ27oTiGkiXd+CQtCYsO0mrhD57O/urA9kGFS58KJYZWirYoxJJh5KCO+qoq1jC4ee1eb86Ns5egHhVbaL85+z2Jdnmzb/tQN4ZsbyJ8ZpHgm7I3cJ19NuIORIBLWL2FwMQ7yrLsn4+ypLLVpiQ9wb2E9h5cAnJEqfTiYMb2UVnkbGfQUYIaR3xdw5NybzbUVYHrF4onpygZurSAUGRUt0ixVfXrigoK0mnjtoICJ/yYwgYPXDTChmUfo3pKiVVWCGTz8LhNvaT3JylferzQKLAkiC997+5ntJ5nwHsfcjep+ldT7WJYjbI8wtK3zWeRkEq624ZT3bPAwm/8p4LE4QVJXRioqD9wgDquZiwsz7MKoOPU1+DXVL/FYHCWg= 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: Ryan Roberts =E4=BA=8E2024=E5=B9=B44=E6=9C=8812=E6= =97=A5=E5=91=A8=E4=BA=94 19:28=E5=86=99=E9=81=93=EF=BC=9A > > On 12/04/2024 03:07, Chuanhua Han wrote: > > Ryan Roberts =E4=BA=8E2024=E5=B9=B44=E6=9C=8811= =E6=97=A5=E5=91=A8=E5=9B=9B 22:30=E5=86=99=E9=81=93=EF=BC=9A > >> > >> On 09/04/2024 09:26, Barry Song wrote: > >>> 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. > >>> > >>> Signed-off-by: Chuanhua Han > >>> Co-developed-by: Barry Song > >>> Signed-off-by: Barry Song > >> > >> Couple of nits; feel free to ignore. > >> > >> Reviewed-by: Ryan Roberts > >> > >>> --- > >>> include/linux/swap.h | 5 +++++ > >>> mm/swapfile.c | 51 ++++++++++++++++++++++++++++++++++++++++++= ++ > >>> 2 files changed, 56 insertions(+) > >>> > >>> diff --git a/include/linux/swap.h b/include/linux/swap.h > >>> index 11c53692f65f..b7a107e983b8 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) > >>> { > >>> } > >>> > >>> +void swap_free_nr(swp_entry_t entry, int nr_pages) > >>> +{ > >>> +} > >>> + > >>> static inline void put_swap_folio(struct folio *folio, swp_entry_t s= wp) > >>> { > >>> } > >>> diff --git a/mm/swapfile.c b/mm/swapfile.c > >>> index 28642c188c93..f4c65aeb088d 100644 > >>> --- a/mm/swapfile.c > >>> +++ b/mm/swapfile.c > >>> @@ -1356,6 +1356,57 @@ void swap_free(swp_entry_t entry) > >>> __swap_entry_free(p, entry); > >>> } > >>> > >>> +/* > >>> + * Free up the maximum number of swap entries at once to limit the > >>> + * maximum kernel stack usage. > >>> + */ > >>> +#define SWAP_BATCH_NR (SWAPFILE_CLUSTER > 512 ? 512 : SWAPFILE_CLUST= ER) > >>> + > >>> +/* > >>> + * Called after swapping in a large folio, batched free swap entries > >>> + * for this large folio, entry should be for the first subpage and > >>> + * its offset is aligned with nr_pages > >>> + */ > >>> +void swap_free_nr(swp_entry_t entry, int nr_pages) > >>> +{ > >>> + int i, j; > >>> + struct swap_cluster_info *ci; > >>> + struct swap_info_struct *p; > >>> + unsigned int type =3D swp_type(entry); > >>> + unsigned long offset =3D swp_offset(entry); > >>> + int batch_nr, remain_nr; > >>> + DECLARE_BITMAP(usage, SWAP_BATCH_NR) =3D { 0 }; > >>> + > >>> + /* all swap entries are within a cluster for mTHP */ > >>> + VM_BUG_ON(offset % SWAPFILE_CLUSTER + nr_pages > SWAPFILE_CLUST= ER); > >>> + > >>> + if (nr_pages =3D=3D 1) { > >>> + swap_free(entry); > >>> + return; > >>> + } > >>> + > >>> + remain_nr =3D nr_pages; > >>> + p =3D _swap_info_get(entry); > >>> + if (p) { > >> > >> nit: perhaps return early if (!p) ? Then you dedent the for() block. > > > > Agreed! > > > >> > >>> + for (i =3D 0; i < nr_pages; i +=3D batch_nr) { > >>> + batch_nr =3D min_t(int, SWAP_BATCH_NR, remain_n= r); > >>> + > >>> + ci =3D lock_cluster_or_swap_info(p, offset); > >>> + for (j =3D 0; j < batch_nr; j++) { > >>> + if (__swap_entry_free_locked(p, offset = + i * SWAP_BATCH_NR + j, 1)) > >>> + __bitmap_set(usage, j, 1); > >>> + } > >>> + unlock_cluster_or_swap_info(p, ci); > >>> + > >>> + for_each_clear_bit(j, usage, batch_nr) > >>> + free_swap_slot(swp_entry(type, offset += i * SWAP_BATCH_NR + j)); > >>> + > >> > >> nit: perhaps change to for (;;), and do the checks here to avoid clear= ing the > >> bitmap on the last run: > >> > >> i +=3D batch_nr; > >> if (i < nr_pages) > >> break; Should be=EF=BC=9A if (i >=3D nr_pages) break; > > Great, thank you for your advice! > > Or maybe leave the for() as is, but don't explicitly init the bitmap at t= he > start of the function and instead call: > > bitmap_clear(usage, 0, SWAP_BATCH_NR); > > At the start of each loop? Yeah, that's OK, actually these two ways are similar, both are to reduce the number of bitmap_clear calls. > > >> > >>> + bitmap_clear(usage, 0, SWAP_BATCH_NR); > >>> + remain_nr -=3D batch_nr; > >>> + } > >>> + } > >>> +} > >>> + > >>> /* > >>> * Called after dropping swapcache to decrease refcnt to swap entrie= s. > >>> */ > >> > >> > > > > > --=20 Thanks, Chuanhua