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 8A42CC3ABB2 for ; Mon, 16 Sep 2024 05:20:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F10BC6B008A; Mon, 16 Sep 2024 01:20:52 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id EC0296B008C; Mon, 16 Sep 2024 01:20:52 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D60446B0092; Mon, 16 Sep 2024 01:20:52 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id B6E796B008A for ; Mon, 16 Sep 2024 01:20:52 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 62B9B160113 for ; Mon, 16 Sep 2024 05:20:52 +0000 (UTC) X-FDA: 82569451944.11.F2FF2F1 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf04.hostedemail.com (Postfix) with ESMTP id 4A80040006 for ; Mon, 16 Sep 2024 05:20:50 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf04.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@arm.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1726464020; a=rsa-sha256; cv=none; b=30F5sHxJdP4vZB9J/vvl/3jKto+3b/5RaJ+cakQbF2l9/20H5emA7wr4DIyB0j2Z5ss9r2 Iugw8I/X0foA8VALyNYgzNHE++Md/88SrHse/ZWoG+3zLeq7SiAD1we05Fk1dBU48QpfUt 04nDXBZGZXaVQBAw9l3bwk3aBDYLHm4= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf04.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1726464020; 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; bh=0jjMthLj93F1zHFoT3mGl/DbXcPrvDJsW1tK3D7O1wY=; b=vxsjbVOr8NN2AvzTaudYTLF0sH2HcRM/jiIA7fHvw7/2cDEEVEl4LTVtwLHGB5mdUkDPCC OraKn08aauCIY0i6qVHEtThFLwE8KZpWoSzju1eoUioMpSraYgAhbHTwUCF2YmO5K1KJHZ PCX3+YL1/FngcMsfpJxLy/FLB8+qvuI= 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 C8FD61476; Sun, 15 Sep 2024 22:21:18 -0700 (PDT) Received: from [10.162.42.11] (e116581.arm.com [10.162.42.11]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 70DD93F64C; Sun, 15 Sep 2024 22:20:45 -0700 (PDT) Message-ID: Date: Mon, 16 Sep 2024 10:50:42 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] mm: Compute mTHP order efficiently To: Barry Song Cc: akpm@linux-foundation.org, david@redhat.com, willy@infradead.org, ryan.roberts@arm.com, anshuman.khandual@arm.com, hughd@google.com, ioworker0@gmail.com, wangkefeng.wang@huawei.com, baolin.wang@linux.alibaba.com, gshan@redhat.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org References: <20240913091902.1160520-1-dev.jain@arm.com> Content-Language: en-US From: Dev Jain In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Queue-Id: 4A80040006 X-Rspamd-Server: rspam01 X-Stat-Signature: duqhffuzb9hqix7nxx85adanngqmyaez X-HE-Tag: 1726464050-866389 X-HE-Meta: U2FsdGVkX19bDvvytWk6HkbOaQ3Th+K8JBzI+DV+nctZlRVsS/dt/GVCeQfh9y7FTTZ7yNncD1ZfNU7nvX62/NHe3nMKYdZnrC9ALYX10MsvAjr+K5GQLa3XEkZcsRZ4IcwtsMaaUe4MmiSbinSVBG1FZ5goY0lhJfP0fY+pi+IJpQ0fW9EHdDCWZPORMMTqKpcmVZlEt6J9oNZF/6Her2gAzuu8OwGIakbdIobC46TxCoLbgPGfDUPPJge4XaIEQrDw94Nun3Dy2l9k2qDF5Vq5QwxRWXFK9ZraqlXlBdKOHnDqaiJUZF1mKAmuBvkhrqebXhae9eZkFXlHiGvE60FLUIUPpBURvmGCtl3HFmzCfeECYwJYbh9Yp9G2G1Akp9Jotjb+5cfN630gUcYPlqOHbjJH6WX8qh5zht8v8me65MoGyGqJoYyhCBVxCEvSeH437Uu8WXpEXv9z8XAnSVNAOH9zUbGKb9xqIJMOYHEEiOJUz+DEOIQLZwjiLppHqps49Z1/sHmTHouqqNy6Ue6AXY2fYuTeae3cgOSoG+8BRnMW+cEazi0CFxPumku+buc6WO2Ruws/H/uxE4fwQFAYuTrPfH+jkfY/Uyk6MhJh4gXTXLLVEa27GyXwEd+dI66BBmIk7Tep6RUrO2iQPvBoNeDM8tNRwh0y5erWSZPjoTDarkbzBuuNLVnykWynxT+opCVz+VvLU2DDs9LoV2BjnFp4MywEOQDX0PwZ2cvqW5DRHmUkFGpBGy4nEkCxPJa0hSHRQiOZDNx5BywdAQ7HtigQmo7DwTW4bHj3sos2D14oVPrCgNJXfS5LlSGEGlISuKJCrgt+2+9J+Qh/cUctXTgEbd/u5a+Xtvvdadm+DbIb/v5KwNS/TSUD+xkZ7+U7qlTYdKnU5bKTlX21MEF6iZF8Uxx1O3141Q+YLzeK/aaK548UkLwRbJ1RDI/9sfOATCi6FCWhoq+1KJA qvS9fp5P s1vsuYG+FdtP4ZbEPkOj7+wINnRoGEAxMNEGRb67b9BPcs/PqGB5hxjGd6AK2OAgwouS1ZGbSJGlxbYKuoLyU5wBtTB8r2SvmyhCGXfkQmqk1q8SN4V0q4zQayR7q+dlOuoSzt0K1wzjeFX9sAL+GohORcpc8kQ4vKZc0qQyKtfPiyyslDS5pD6BeJ3bmiKOtNwfksiHdRLd9nwfheWdERk2+QigCtdyFs1xdMY2HWrPMbio= 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: On 9/16/24 10:42, Barry Song wrote: > On Fri, Sep 13, 2024 at 5:19 PM Dev Jain wrote: >> We use pte_range_none() to determine whether contiguous PTEs are empty >> for an mTHP allocation. Instead of iterating the while loop for every >> order, use some information, which is the first set PTE found, from the >> previous iteration, to eliminate some cases. The key to understanding >> the correctness of the patch is that the ranges we want to examine >> form a strictly decreasing sequence of nested intervals. >> >> Suggested-by: Ryan Roberts >> Signed-off-by: Dev Jain > I like this patch, but could we come up with a better subject for > pte_range_none()? > The subject is really incorrect. Are you asking me to change "Compute mTHP order efficiently" to something else? > > Also, I'd prefer the change for alloc_anon_folio() to be separated > into its own patch. > So, one patchset with two patches, please. Fine by me. > >> --- >> mm/memory.c | 30 +++++++++++++++++++++++------- >> 1 file changed, 23 insertions(+), 7 deletions(-) >> >> diff --git a/mm/memory.c b/mm/memory.c >> index 3c01d68065be..ffc24a48ef15 100644 >> --- a/mm/memory.c >> +++ b/mm/memory.c >> @@ -4409,26 +4409,27 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) >> return ret; >> } >> >> -static bool pte_range_none(pte_t *pte, int nr_pages) >> +static int pte_range_none(pte_t *pte, int nr_pages) >> { >> int i; >> >> for (i = 0; i < nr_pages; i++) { >> if (!pte_none(ptep_get_lockless(pte + i))) >> - return false; >> + return i; >> } >> >> - return true; >> + return nr_pages; >> } >> >> static struct folio *alloc_anon_folio(struct vm_fault *vmf) >> { >> struct vm_area_struct *vma = vmf->vma; >> #ifdef CONFIG_TRANSPARENT_HUGEPAGE >> + pte_t *first_set_pte = NULL, *align_pte, *pte; >> unsigned long orders; >> struct folio *folio; >> unsigned long addr; >> - pte_t *pte; >> + int max_empty; >> gfp_t gfp; >> int order; >> >> @@ -4463,8 +4464,23 @@ static struct folio *alloc_anon_folio(struct vm_fault *vmf) >> order = highest_order(orders); >> while (orders) { >> addr = ALIGN_DOWN(vmf->address, PAGE_SIZE << order); >> - if (pte_range_none(pte + pte_index(addr), 1 << order)) >> + align_pte = pte + pte_index(addr); >> + >> + /* Range to be scanned known to be empty */ >> + if (align_pte + (1 << order) <= first_set_pte) >> break; >> + >> + /* Range to be scanned contains first_set_pte */ >> + if (align_pte <= first_set_pte) >> + goto repeat; >> + >> + /* align_pte > first_set_pte, so need to check properly */ >> + max_empty = pte_range_none(align_pte, 1 << order); >> + if (max_empty == 1 << order) >> + break; >> + >> + first_set_pte = align_pte + max_empty; >> +repeat: >> order = next_order(&orders, order); >> } >> >> @@ -4579,7 +4595,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) >> if (nr_pages == 1 && vmf_pte_changed(vmf)) { >> update_mmu_tlb(vma, addr, vmf->pte); >> goto release; >> - } else if (nr_pages > 1 && !pte_range_none(vmf->pte, nr_pages)) { >> + } else if (nr_pages > 1 && pte_range_none(vmf->pte, nr_pages) != nr_pages) { >> update_mmu_tlb_range(vma, addr, vmf->pte, nr_pages); >> goto release; >> } >> @@ -4915,7 +4931,7 @@ vm_fault_t finish_fault(struct vm_fault *vmf) >> update_mmu_tlb(vma, addr, vmf->pte); >> ret = VM_FAULT_NOPAGE; >> goto unlock; >> - } else if (nr_pages > 1 && !pte_range_none(vmf->pte, nr_pages)) { >> + } else if (nr_pages > 1 && pte_range_none(vmf->pte, nr_pages) != nr_pages) { >> update_mmu_tlb_range(vma, addr, vmf->pte, nr_pages); >> ret = VM_FAULT_NOPAGE; >> goto unlock; >> -- >> 2.30.2 >> > Thanks > Barry