From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B19D82236FD for ; Mon, 11 May 2026 06:21:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778480512; cv=none; b=rizTu+VxPHpsfFYNTO6z4EGWcJXAY3F+YVVu+Y5Ruon97H3NW9V0CAdAea38EPBVX+WxO4AFFHTitBSqZOAV9SMPqAX8ib/bfy8ZNnGX0Am4CNyRQIIvzHuh5dSr0vWBPS3fAkY2QuUUfJs/udiFQa5jZNrHRX6woybM8CXzCDE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778480512; c=relaxed/simple; bh=p4dh3XaPvO0uUNJECHapVoh5/ObuTHsNDW6l7cexbq0=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=nqTPnaXoQa0fJBSdNLMNU2Q2eWpxmqcQP7J4e7LIyk0q0r5gtC1VVs/3j5DzUkl1APMMTciuaQ01s2LQbAOxiD521ZBuY7XQK8WZ7EFh1Ggd8lPKpv7pM5iBroHFjajbOYKyI0aHKlQn3LV0HOpyFC5kO+LCe8zYBG1rEWtzq/Y= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=YKTZmFga; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="YKTZmFga" 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 90BB31713; Sun, 10 May 2026 23:21:44 -0700 (PDT) Received: from [10.164.148.37] (MacBook-Pro.blr.arm.com [10.164.148.37]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 960D33F99C; Sun, 10 May 2026 23:21:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1778480509; bh=p4dh3XaPvO0uUNJECHapVoh5/ObuTHsNDW6l7cexbq0=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=YKTZmFgaTqSycAvb1igwsE4xyD+ujnbAw8sP9X9y1SqxLNfz0kQGVolTukibmNRoC 6MbV6offkR1jt3xM5f0oNdPJPhlzVPHQ/Cdvw33NfuD+nUsS2uwXkRirxuaxuPm/Zl FG2jkSbTAxKSoZopXblN/gEeb6Hl4fADcnwMhDio= Message-ID: <7afc8a77-5b37-470f-b4f8-c0632a4e2311@arm.com> Date: Mon, 11 May 2026 11:51:38 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 0/9] Optimize anonymous large folio unmapping To: Andrew Morton Cc: david@kernel.org, ljs@kernel.org, hughd@google.com, chrisl@kernel.org, kasong@tencent.com, riel@surriel.com, liam@infradead.org, vbabka@kernel.org, harry@kernel.org, jannh@google.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, qi.zheng@linux.dev, shakeel.butt@linux.dev, baohua@kernel.org, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, rppt@kernel.org, surenb@google.com, mhocko@suse.com, baolin.wang@linux.alibaba.com, shikemeng@huaweicloud.com, nphamcs@gmail.com, bhe@redhat.com, youngjun.park@lge.com, pfalcato@suse.de, ryan.roberts@arm.com, anshuman.khandual@arm.com References: <20260506094504.2588857-1-dev.jain@arm.com> <20260508163842.ad2b2202f827d3f86228758d@linux-foundation.org> Content-Language: en-US From: Dev Jain In-Reply-To: <20260508163842.ad2b2202f827d3f86228758d@linux-foundation.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 09/05/26 5:08 am, Andrew Morton wrote: > On Wed, 6 May 2026 15:14:55 +0530 Dev Jain wrote: > >> Speed up unmapping of anonymous large folios by clearing the ptes, and >> setting swap ptes, in one go. >> >> ... >> >> Performance as measured on a Linux VM on Apple M3 (arm64): >> >> Vanilla - Mean: 37401913 ns, std dev: 12% >> Patched - Mean: 17420282 ns, std dev: 11% >> >> No regression observed on 4K folios. >> >> Performance as measured on bare metal x86: >> >> Vanilla - mean: 54986286 ns, std dev: 1.5% >> Patched - mean: 51930795 ns, std dev: 3% > > That looks nice. > > I'll pass at this time, wait for reviewer input. Most reviewers are > jetlagged and exhausted, so a resend might be needed ;) > > Saskiko said a few things: > https://sashiko.dev/#/patchset/20260506094504.2588857-1-dev.jain@arm.com Patch 2: "In the original code, failing hugetlb_vma_trylock_write() triggered a goto walk_abort, leaving ret set to true." That is wrong. Patch 9: "Since __HAVE_ARCH_UNMAP_ONE is typically defined without a value on sparc64, __is_defined() will evaluate to 0 because it is primarily designed for Kconfig symbols that explicitly evaluate to 1." Which is again wrong? Patch 9: "What happens to the remaining pages in the batch? Since get_and_clear_ptes() cleared all of them upfront, and the loop aborts early without restoring them, it appears the remaining PTEs are left cleared in the page tables and their references are not released" Yes this is valid. I did see it on the v2 Sashiko review but misread it : ) When unmap fails for a sub-batch, I need to restore all the cleared ptes, not only those of the sub-batch. This should work: diff --git a/mm/rmap.c b/mm/rmap.c index fc953f36d4527..e54c15a82c504 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -2023,10 +2023,8 @@ static inline bool __unmap_anon_folio_range(struct vm_area_struct *vma, struct f swp_entry_t entry = page_swap_entry(subpage); struct mm_struct *mm = vma->vm_mm; - if (folio_dup_swap_pages(folio, subpage, nr_pages) < 0) { - set_ptes(mm, address, ptep, pteval, nr_pages); + if (folio_dup_swap_pages(folio, subpage, nr_pages) < 0) return false; - } /* * arch_unmap_one() is expected to be a NOP on @@ -2036,16 +2034,13 @@ static inline bool __unmap_anon_folio_range(struct vm_area_struct *vma, struct f if (arch_unmap_one(mm, vma, address, pteval) < 0) { VM_WARN_ON(nr_pages != 1); folio_put_swap_pages(folio, subpage, nr_pages); - set_pte_at(mm, address, ptep, pteval); return false; } /* See folio_try_share_anon_rmap(): clear PTE first. */ - if (anon_exclusive && folio_try_share_anon_rmap_ptes(folio, subpage, nr_pages)) { + if (anon_exclusive && folio_try_share_anon_rmap_ptes(folio, subpage, nr_pages)) folio_put_swap_pages(folio, subpage, nr_pages); - set_ptes(mm, address, ptep, pteval, nr_pages); return false; - } if (list_empty(&mm->mmlist)) { spin_lock(&mmlist_lock); @@ -2075,8 +2070,10 @@ static inline bool unmap_anon_folio_range(struct vm_area_struct *vma, struct fol first_page, expected_anon_exclusive); ret = __unmap_anon_folio_range(vma, folio, first_page + sub_batch_idx, address, ptep, pteval, len, expected_anon_exclusive); - if (!ret) + if (!ret) { + set_ptes(vma->vm_mm, address, ptep, pteval, nr_pages); return ret; + } nr_pages -= len; if (!nr_pages) > >