From: Ryan Roberts <ryan.roberts@arm.com>
To: "Catalin Marinas" <catalin.marinas@arm.com>,
"Mikołaj Lenczewski" <miko.lenczewski@arm.com>
Cc: yang@os.amperecomputing.com, will@kernel.org,
jean-philippe@linaro.org, robin.murphy@arm.com, joro@8bytes.org,
maz@kernel.org, oliver.upton@linux.dev, joey.gouly@arm.com,
james.morse@arm.com, broonie@kernel.org, ardb@kernel.org,
baohua@kernel.org, suzuki.poulose@arm.com, david@redhat.com,
jgg@ziepe.ca, nicolinc@nvidia.com, jsnitsel@redhat.com,
mshavit@google.com, kevin.tian@intel.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, iommu@lists.linux.dev
Subject: Re: [PATCH v7 4/4] arm64/mm: Elide tlbi in contpte_convert() under BBML2
Date: Wed, 25 Jun 2025 14:07:23 +0100 [thread overview]
Message-ID: <636c8901-6e05-479f-ae06-ee391d4d36e8@arm.com> (raw)
In-Reply-To: <7105112f-b0bb-4191-b3c9-93522162319c@arm.com>
On 20/06/2025 17:10, Ryan Roberts wrote:
> On 19/06/2025 20:29, Catalin Marinas wrote:
>> On Tue, Jun 17, 2025 at 09:51:04AM +0000, Mikołaj Lenczewski wrote:
>>> diff --git a/arch/arm64/mm/contpte.c b/arch/arm64/mm/contpte.c
>>> index bcac4f55f9c1..203357061d0a 100644
>>> --- a/arch/arm64/mm/contpte.c
>>> +++ b/arch/arm64/mm/contpte.c
>>> @@ -68,7 +68,144 @@ static void contpte_convert(struct mm_struct *mm, unsigned long addr,
>>> pte = pte_mkyoung(pte);
>>> }
>>>
>>> - __flush_tlb_range(&vma, start_addr, addr, PAGE_SIZE, true, 3);
>>> + /*
>>> + * On eliding the __tlb_flush_range() under BBML2+noabort:
>>> + *
>>> + * NOTE: Instead of using N=16 as the contiguous block length, we use
>>> + * N=4 for clarity.
>>> + *
>>> + * NOTE: 'n' and 'c' are used to denote the "contiguous bit" being
>>> + * unset and set, respectively.
>>> + *
>>> + * We worry about two cases where contiguous bit is used:
>>> + * - When folding N smaller non-contiguous ptes as 1 contiguous block.
>>> + * - When unfolding a contiguous block into N smaller non-contiguous ptes.
>>> + *
>>> + * Currently, the BBML0 folding case looks as follows:
>>> + *
>>> + * 0) Initial page-table layout:
>>> + *
>>> + * +----+----+----+----+
>>> + * |RO,n|RO,n|RO,n|RW,n| <--- last page being set as RO
>>> + * +----+----+----+----+
>>> + *
>>> + * 1) Aggregate AF + dirty flags using __ptep_get_and_clear():
>>> + *
>>> + * +----+----+----+----+
>>> + * | 0 | 0 | 0 | 0 |
>>> + * +----+----+----+----+
>>> + *
>>> + * 2) __flush_tlb_range():
>>> + *
>>> + * |____ tlbi + dsb ____|
>>> + *
>>> + * 3) __set_ptes() to repaint contiguous block:
>>> + *
>>> + * +----+----+----+----+
>>> + * |RO,c|RO,c|RO,c|RO,c|
>>> + * +----+----+----+----+
>>
>> From the initial layout to point (3), we are also changing the
>> permission. Given the rules you mentioned in the Arm ARM, I think that's
>> safe (hardware seeing either the old or the new attributes). The
>> FEAT_BBM description, however, only talks about change between larger
>> and smaller blocks but no mention of also changing the attributes at the
>> same time. Hopefully the microarchitects claiming certain CPUs don't
>> generate conflict aborts understood what Linux does.
I think what you are saying is that despite going via invalid, the HW may see
this direct transition:
+----+----+----+----+
|RO,n|RO,n|RO,n|RW,n|
+----+----+----+----+
to:
+----+----+----+----+
|RO,c|RO,c|RO,c|RO,c|
+----+----+----+----+
There are 2 logical operations here. The first is changing the permissions of
the last entry. The second is changing the size of the entry.
As I understand it, it's permissible in the architecture to update the
permissions of the a PTE without break-before-make and without issuing a tlbi
afterwards; in that case the HW may apply either the old permissions or the new
permissions up until a future tlbi (after which the new permissions are
guarranteed). That's the first logical operation.
The second logical operation is permitted by FEAT_BBM level 2.
So both logical operations are permitted and the Arm ARM doesn't mention any
requirement to "separate" these operations with a tlbi or anything else, as far
as I can see.
So I would interpret that combining these 2 in the way we have should be safe.
RNGLXZ and RJQQTC give further insight into the spirit of the spec. But I agree
this isn't spelled out super clearly.
Perhaps we can move forwards based on this understanding, and I will seek some
clarifying words to be added to the Arm ARM?
Thanks,
Ryan
next prev parent reply other threads:[~2025-06-25 13:07 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-17 9:51 [PATCH v7 0/4] Initial BBML2 support for contpte_convert() Mikołaj Lenczewski
2025-06-17 9:51 ` [PATCH v7 1/4] arm64: cpufeature: Introduce MATCH_ALL_EARLY_CPUS capability type Mikołaj Lenczewski
2025-06-17 10:20 ` Suzuki K Poulose
2025-06-17 9:51 ` [PATCH v7 2/4] arm64: Add BBM Level 2 cpu feature Mikołaj Lenczewski
2025-06-17 10:35 ` Suzuki K Poulose
2025-06-18 14:07 ` Ryan Roberts
2025-06-19 8:57 ` Mikołaj Lenczewski
2025-06-19 9:20 ` Ryan Roberts
2025-06-19 11:51 ` Mikołaj Lenczewski
2025-06-19 11:05 ` Catalin Marinas
2025-06-19 11:51 ` Mikołaj Lenczewski
2025-06-19 13:46 ` Catalin Marinas
2025-06-19 14:46 ` Mikołaj Lenczewski
2025-06-17 9:51 ` [PATCH v7 3/4] iommu/arm: Add BBM Level 2 smmu feature Mikołaj Lenczewski
2025-06-19 11:36 ` Catalin Marinas
2025-06-17 9:51 ` [PATCH v7 4/4] arm64/mm: Elide tlbi in contpte_convert() under BBML2 Mikołaj Lenczewski
2025-06-19 19:29 ` Catalin Marinas
2025-06-19 19:47 ` Catalin Marinas
2025-06-20 16:10 ` Ryan Roberts
2025-06-25 13:07 ` Ryan Roberts [this message]
2025-06-25 13:37 ` Jason Gunthorpe
2025-06-25 14:16 ` Ryan Roberts
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=636c8901-6e05-479f-ae06-ee391d4d36e8@arm.com \
--to=ryan.roberts@arm.com \
--cc=ardb@kernel.org \
--cc=baohua@kernel.org \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=david@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=james.morse@arm.com \
--cc=jean-philippe@linaro.org \
--cc=jgg@ziepe.ca \
--cc=joey.gouly@arm.com \
--cc=joro@8bytes.org \
--cc=jsnitsel@redhat.com \
--cc=kevin.tian@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=miko.lenczewski@arm.com \
--cc=mshavit@google.com \
--cc=nicolinc@nvidia.com \
--cc=oliver.upton@linux.dev \
--cc=robin.murphy@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yang@os.amperecomputing.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).