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 15CC5C83F10 for ; Thu, 31 Aug 2023 15:21:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3C0E1900003; Thu, 31 Aug 2023 11:21:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 34A448D0001; Thu, 31 Aug 2023 11:21:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1EA5F900003; Thu, 31 Aug 2023 11:21:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 0C1D38D0001 for ; Thu, 31 Aug 2023 11:21:59 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id C35A2B2CA3 for ; Thu, 31 Aug 2023 15:21:58 +0000 (UTC) X-FDA: 81184765116.28.67A7545 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf18.hostedemail.com (Postfix) with ESMTP id 77BCA1C0031 for ; Thu, 31 Aug 2023 15:21:56 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=none; spf=pass (imf18.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1693495317; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Wbvog3IxRg00zJbYswFshkPVgFfD/BhmLEQk2qdPtRs=; b=AxcHiD6p/xoXuVJAAvx5T9HBUZ1E9XgTvueHlZ2tpb8xezg7Q990sP0NQCkbbASB/0AhMd bgzSTANBR0gI06aGrP0bKiSSu0dLxxw1MkR4Eyz8boF7BfvL5MvZu79XajgW/VEDHyn5hx isKpxa90gZ3D2hz3vDBrlplAmTpMUgo= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1693495317; a=rsa-sha256; cv=none; b=NCNJxZYcYTOgbn0pbzGQom/nmV6wmqIlg7MKsR1KDnvLMdATNQNmzX5ut+ZF5krh9Huza8 UqRU1r34pA9BaLZWaR5GfVKzN/LkvmcuZ4bjVDOhtMMDowJQx5Pi/d+iJfCW6EA91orDMc oX0BFvDiaZTNPKehU5vJjBaZlyGgRK0= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=none; spf=pass (imf18.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B6518C15; Thu, 31 Aug 2023 08:22:34 -0700 (PDT) Received: from [10.1.32.135] (XHFQ2J9959.cambridge.arm.com [10.1.32.135]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 0A4F53F64C; Thu, 31 Aug 2023 08:21:54 -0700 (PDT) Message-ID: Date: Thu, 31 Aug 2023 16:21:53 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH 09/14] mm: Handle large folios in free_unref_folios() Content-Language: en-GB To: "Matthew Wilcox (Oracle)" , linux-mm@kvack.org References: <20230825135918.4164671-1-willy@infradead.org> <20230825135918.4164671-10-willy@infradead.org> From: Ryan Roberts In-Reply-To: <20230825135918.4164671-10-willy@infradead.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Stat-Signature: d9uraf7hf1etefi64xqee3e1onh7iq9h X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 77BCA1C0031 X-Rspam-User: X-HE-Tag: 1693495316-31952 X-HE-Meta: U2FsdGVkX1+tYc2b8F0aF9WlZUTTo6xRT82eaEDGyogOh1XbgCJqx8O6JizqVNm7FXJJ8aByJWyxmQsJooUSwINF43yKNgt+MIlKuSglHMWW+zVroJsCNBv1HRx2ddp/2tXa90DIcuEtywvOY6Qs3qd5pBp9uKgYVcA2tlvSOCS5rEw11nD3TyOaSxgz3KzETpzQuwLGCimOv7FriQmYnSvy3aGaIyP2V4oe77s/J8MZfGLxIT1QxV5wgCTsGLVUBWRwTsrDADO2Ypy92wwfkvOxz7dA/rjXrt7eMPUd2UOl1j8Sn4ko5DDvj8k2gjjLy2MOr/ic3FZ5Ipir73IPztD9q8n1rjhAECJXd5wI+GE8j7ECsuEUWGsw13/oonwTa2MPvGwRE5E7GvMdKNNoX+ZwMmsT9+9bKhgg3xeeZnQ9II++s+cG8GbEutenIDASqvdrH2+gVMwV9pUaS6PpSG7cCMWQfCoE32TU2uQpqjE4QLL10/zZdvYEZJvsSfWSzlx/D5MVEiqdeQHV1PSPKbtCkCcJViDi1ItQMecQNMGuNkDE7GepyHBZMYSVp8oCWOvN/M51g9ezfRq7H5KKqdveXH+7wE/JhoBAa4qbvjcC+29xMeSaQViz8C40NssffEWJMj2lDE3FefHxJiOY7RxaepV7V2KdKh1nDyMsu+gDYitsVQ8dAekpPucdR6c+vtAozRmgAEhiFwd+/lOJ94Fxm/351YGwdPzH/EostNK6oGb6zN0QHhXt5tZ1oLzQP7fN8XNiI6Q/s30rNB+xPxIPq6sSCVxsxCJ8Yz5MiAyNrRo5/5FdKzg3OyoB6hi8pBqLy3sV4HZ/k+qL/S1/wMlVt6FhKcbuMfnUJReEUhiAC3RuNjqZh6khZjqAh4BGCbNsp0Nq3pcNPlGjDtWEY4FS4fxiw6PZq5csRZr5owwkDyE+5jMD8SByi8lcA/41vJvEz0xz4ksQecpYCfz 9ZKbmmeC qlyVmt4K/ZCNwp4UoY7VSR1N9Wn7UnXM8JIjTI6tTYlOHdr4TI3H5pHNpVN5lQqSfwBkKdbJJMHTw5bW9eHjvNimVY+e+btFxZw+X7wu5tcGeddBsZ08Glv+yS1EdmKsaV/DzrCxyGbJBGPQJY+/a0uCpqOrZtzD4C5NuXbqnaQjTNjlVkrRrn2EZorCE7zS5s6KXrg4k4AKYpTLswT00+jAmgr/KlF/LGYAdp0DtAHo8PFaLr2MmrEvFWg== 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: On 25/08/2023 14:59, Matthew Wilcox (Oracle) wrote: > Call folio_undo_large_rmappable() if needed. free_unref_page_prepare() > destroys the ability to call folio_order(), so stash the order in > folio->private for the benefit of the second loop. > > Signed-off-by: Matthew Wilcox (Oracle) > --- > mm/page_alloc.c | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index bca5c70b5576..e586d17fb7f2 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -2465,7 +2465,7 @@ void free_unref_page(struct page *page, unsigned int order) > } > > /* > - * Free a batch of 0-order pages > + * Free a batch of folios > */ > void free_unref_folios(struct folio_batch *folios) > { > @@ -2478,7 +2478,11 @@ void free_unref_folios(struct folio_batch *folios) > for (i = 0, j = 0; i < folios->nr; i++) { > struct folio *folio = folios->folios[i]; > unsigned long pfn = folio_pfn(folio); > - if (!free_unref_page_prepare(&folio->page, pfn, 0)) > + unsigned int order = folio_order(folio); Do you need to do anything special for hugetlb folios? I see that destroy_large_folio() has: if (folio_test_hugetlb(folio)) { free_huge_folio(folio); return; } > + > + if (order > 0 && folio_test_large_rmappable(folio)) > + folio_undo_large_rmappable(folio); > + if (!free_unref_page_prepare(&folio->page, pfn, order)) > continue; > > /* > @@ -2486,11 +2490,13 @@ void free_unref_folios(struct folio_batch *folios) > * comment in free_unref_page. > */ > migratetype = get_pcppage_migratetype(&folio->page); > - if (unlikely(is_migrate_isolate(migratetype))) { > + if (order > PAGE_ALLOC_COSTLY_ORDER || Should this be `if (!pcp_allowed_order(order) ||` ? That helper includes the THP pageblock_order too. > + is_migrate_isolate(migratetype)) { > free_one_page(folio_zone(folio), &folio->page, pfn, > - 0, migratetype, FPI_NONE); > + order, migratetype, FPI_NONE); > continue; > } > + folio->private = (void *)(unsigned long)order; > if (j != i) > folios->folios[j] = folio; > j++; > @@ -2500,7 +2506,9 @@ void free_unref_folios(struct folio_batch *folios) > for (i = 0; i < folios->nr; i++) { > struct folio *folio = folios->folios[i]; > struct zone *zone = folio_zone(folio); > + unsigned int order = (unsigned long)folio->private; > > + folio->private = NULL; > migratetype = get_pcppage_migratetype(&folio->page); > > /* Different zone requires a different pcp lock */ > @@ -2519,7 +2527,7 @@ void free_unref_folios(struct folio_batch *folios) > if (unlikely(!pcp)) { > pcp_trylock_finish(UP_flags); > free_one_page(zone, &folio->page, > - folio_pfn(folio), 0, > + folio_pfn(folio), order, > migratetype, FPI_NONE); > locked_zone = NULL; > continue; > @@ -2535,7 +2543,8 @@ void free_unref_folios(struct folio_batch *folios) > migratetype = MIGRATE_MOVABLE; > > trace_mm_page_free_batched(&folio->page); > - free_unref_page_commit(zone, pcp, &folio->page, migratetype, 0); > + free_unref_page_commit(zone, pcp, &folio->page, migratetype, > + order); > } > > if (pcp) {