All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alistair Popple <apopple@nvidia.com>
To: Ryan Roberts <ryan.roberts@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, Ard Biesheuvel <ardb@kernel.org>,
	Marc Zyngier <maz@kernel.org>,
	Oliver Upton <oliver.upton@linux.dev>,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Zenghui Yu <yuzenghui@huawei.com>,
	Andrey Ryabinin <ryabinin.a.a@gmail.com>,
	Alexander Potapenko <glider@google.com>,
	Andrey Konovalov <andreyknvl@gmail.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Anshuman Khandual <anshuman.khandual@arm.com>,
	Matthew Wilcox <willy@infradead.org>, Yu Zhao <yuzhao@google.com>,
	Mark Rutland <mark.rutland@arm.com>,
	David Hildenbrand <david@redhat.com>,
	Kefeng Wang <wangkefeng.wang@huawei.com>,
	John Hubbard <jhubbard@nvidia.com>, Zi Yan <ziy@nvidia.com>,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 14/14] arm64/mm: Add ptep_get_and_clear_full() to optimize process teardown
Date: Fri, 24 Nov 2023 12:35:30 +1100	[thread overview]
Message-ID: <87y1eovsn5.fsf@nvdebian.thelocal> (raw)
In-Reply-To: <3b4f6bff-6322-4394-9efb-9c3b9ef52010@arm.com>


Ryan Roberts <ryan.roberts@arm.com> writes:

> On 23/11/2023 05:13, Alistair Popple wrote:
>> 
>> Ryan Roberts <ryan.roberts@arm.com> writes:
>> 
>>> ptep_get_and_clear_full() adds a 'full' parameter which is not present
>>> for the fallback ptep_get_and_clear() function. 'full' is set to 1 when
>>> a full address space teardown is in progress. We use this information to
>>> optimize arm64_sys_exit_group() by avoiding unfolding (and therefore
>>> tlbi) contiguous ranges. Instead we just clear the PTE but allow all the
>>> contiguous neighbours to keep their contig bit set, because we know we
>>> are about to clear the rest too.
>>>
>>> Before this optimization, the cost of arm64_sys_exit_group() exploded to
>>> 32x what it was before PTE_CONT support was wired up, when compiling the
>>> kernel. With this optimization in place, we are back down to the
>>> original cost.
>>>
>>> This approach is not perfect though, as for the duration between
>>> returning from the first call to ptep_get_and_clear_full() and making
>>> the final call, the contpte block in an intermediate state, where some
>>> ptes are cleared and others are still set with the PTE_CONT bit. If any
>>> other APIs are called for the ptes in the contpte block during that
>>> time, we have to be very careful. The core code currently interleaves
>>> calls to ptep_get_and_clear_full() with ptep_get() and so ptep_get()
>>> must be careful to ignore the cleared entries when accumulating the
>>> access and dirty bits - the same goes for ptep_get_lockless(). The only
>>> other calls we might resonably expect are to set markers in the
>>> previously cleared ptes. (We shouldn't see valid entries being set until
>>> after the tlbi, at which point we are no longer in the intermediate
>>> state). Since markers are not valid, this is safe; set_ptes() will see
>>> the old, invalid entry and will not attempt to unfold. And the new pte
>>> is also invalid so it won't attempt to fold. We shouldn't see this for
>>> the 'full' case anyway.
>>>
>>> The last remaining issue is returning the access/dirty bits. That info
>>> could be present in any of the ptes in the contpte block. ptep_get()
>>> will gather those bits from across the contpte block. We don't bother
>>> doing that here, because we know that the information is used by the
>>> core-mm to mark the underlying folio as accessed/dirty. And since the
>>> same folio must be underpinning the whole block (that was a requirement
>>> for folding in the first place), that information will make it to the
>>> folio eventually once all the ptes have been cleared. This approach
>>> means we don't have to play games with accumulating and storing the
>>> bits. It does mean that any interleaved calls to ptep_get() may lack
>>> correct access/dirty information if we have already cleared the pte that
>>> happened to store it. The core code does not rely on this though.
>> 
>> Does not *currently* rely on this. I can't help but think it is
>> potentially something that could change in the future though which would
>> lead to some subtle bugs.
>
> Yes, there is a risk, although IMHO, its very small.
>
>> 
>> Would there be any may of avoiding this? Half baked thought but could
>> you for example copy the access/dirty information to the last (or
>> perhaps first, most likely invalid) PTE?
>
> I spent a long time thinking about this and came up with a number of
> possibilities, none of them ideal. In the end, I went for the simplest one
> (which works but suffers from the problem that it depends on the way it is
> called not changing).

Ok, that answers my underlying question of "has someone thought about
this and are there any easy solutions". I suspected that was the case
given the excellent write up though!

> 1) copy the access/dirty flags into all the remaining uncleared ptes within the
> contpte block. This is how I did it in v1; although it was racy. I think this
> could be implemented correctly but its extremely complex.
>
> 2) batch calls from the core-mm (like I did for pte_set_wrprotects()) so that we
> can clear 1 or more full contpte blocks in a single call - the ptes are never in
> an intermediate state. This is difficult because ptep_get_and_clear_full()
> returns the pte that was cleared so its difficult to scale that up to multiple ptes.
>
> 3) add ptep_get_no_access_dirty() and redefine the interface to only allow that
> to be called while ptep_get_and_clear_full() calls are on-going. Then assert in
> the other functions that ptep_get_and_clear_full() is not on-going when they are
> called. So we would get a clear sign that usage patterns have changed. But there
> is no easy place to store that state (other than scanning a contpte block
> looking for pte_none() amongst pte_valid_cont() entries) and it all felt ugly.
>
> 4) The simple approach I ended up taking; I thought it would be best to keep it
> simple and see if anyone was concerned before doing something more drastic.
>
> What do you think? If we really need to solve this, then option 1 is my
> preferred route, but it would take some time to figure out and reason about a
> race-free scheme.

Well I like simple, and I agree the risk is small. But I can't help feel
the current situation is too subtle, mainly because it is architecture
specific and the assumptions are not communicated in core-mm code
anywhere. But also none of the aternatives seem much better.

However there are only three callers of ptep_get_and_clear_full(), and
all of these hold the PTL. So if I'm not mistaken that should exclude
just about all users of ptep_get*() which will take the ptl before hand.

So really that only leaves ptep_get_lockless() that could/should
interleave right? From a quick glance of those users none look at the
young/dirty information anyway, so I wonder if we can just assert in the
core-mm that ptep_get_lockless() does not return young/dirty information
and clear it in the helpers? That would make things explicit and
consistent which would address my concern (although I haven't looked too
closely at the details there).

> Thanks,
> Ryan


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Alistair Popple <apopple@nvidia.com>
To: Ryan Roberts <ryan.roberts@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, Ard Biesheuvel <ardb@kernel.org>,
	Marc Zyngier <maz@kernel.org>,
	Oliver Upton <oliver.upton@linux.dev>,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Zenghui Yu <yuzenghui@huawei.com>,
	Andrey Ryabinin <ryabinin.a.a@gmail.com>,
	Alexander Potapenko <glider@google.com>,
	Andrey Konovalov <andreyknvl@gmail.com>,
	Dmitry Vyukov <dvyukov@google.com>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Anshuman Khandual <anshuman.khandual@arm.com>,
	Matthew Wilcox <willy@infradead.org>, Yu Zhao <yuzhao@google.com>,
	Mark Rutland <mark.rutland@arm.com>,
	David Hildenbrand <david@redhat.com>,
	Kefeng Wang <wangkefeng.wang@huawei.com>,
	John Hubbard <jhubbard@nvidia.com>, Zi Yan <ziy@nvidia.com>,
	linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 14/14] arm64/mm: Add ptep_get_and_clear_full() to optimize process teardown
Date: Fri, 24 Nov 2023 12:35:30 +1100	[thread overview]
Message-ID: <87y1eovsn5.fsf@nvdebian.thelocal> (raw)
In-Reply-To: <3b4f6bff-6322-4394-9efb-9c3b9ef52010@arm.com>


Ryan Roberts <ryan.roberts@arm.com> writes:

> On 23/11/2023 05:13, Alistair Popple wrote:
>> 
>> Ryan Roberts <ryan.roberts@arm.com> writes:
>> 
>>> ptep_get_and_clear_full() adds a 'full' parameter which is not present
>>> for the fallback ptep_get_and_clear() function. 'full' is set to 1 when
>>> a full address space teardown is in progress. We use this information to
>>> optimize arm64_sys_exit_group() by avoiding unfolding (and therefore
>>> tlbi) contiguous ranges. Instead we just clear the PTE but allow all the
>>> contiguous neighbours to keep their contig bit set, because we know we
>>> are about to clear the rest too.
>>>
>>> Before this optimization, the cost of arm64_sys_exit_group() exploded to
>>> 32x what it was before PTE_CONT support was wired up, when compiling the
>>> kernel. With this optimization in place, we are back down to the
>>> original cost.
>>>
>>> This approach is not perfect though, as for the duration between
>>> returning from the first call to ptep_get_and_clear_full() and making
>>> the final call, the contpte block in an intermediate state, where some
>>> ptes are cleared and others are still set with the PTE_CONT bit. If any
>>> other APIs are called for the ptes in the contpte block during that
>>> time, we have to be very careful. The core code currently interleaves
>>> calls to ptep_get_and_clear_full() with ptep_get() and so ptep_get()
>>> must be careful to ignore the cleared entries when accumulating the
>>> access and dirty bits - the same goes for ptep_get_lockless(). The only
>>> other calls we might resonably expect are to set markers in the
>>> previously cleared ptes. (We shouldn't see valid entries being set until
>>> after the tlbi, at which point we are no longer in the intermediate
>>> state). Since markers are not valid, this is safe; set_ptes() will see
>>> the old, invalid entry and will not attempt to unfold. And the new pte
>>> is also invalid so it won't attempt to fold. We shouldn't see this for
>>> the 'full' case anyway.
>>>
>>> The last remaining issue is returning the access/dirty bits. That info
>>> could be present in any of the ptes in the contpte block. ptep_get()
>>> will gather those bits from across the contpte block. We don't bother
>>> doing that here, because we know that the information is used by the
>>> core-mm to mark the underlying folio as accessed/dirty. And since the
>>> same folio must be underpinning the whole block (that was a requirement
>>> for folding in the first place), that information will make it to the
>>> folio eventually once all the ptes have been cleared. This approach
>>> means we don't have to play games with accumulating and storing the
>>> bits. It does mean that any interleaved calls to ptep_get() may lack
>>> correct access/dirty information if we have already cleared the pte that
>>> happened to store it. The core code does not rely on this though.
>> 
>> Does not *currently* rely on this. I can't help but think it is
>> potentially something that could change in the future though which would
>> lead to some subtle bugs.
>
> Yes, there is a risk, although IMHO, its very small.
>
>> 
>> Would there be any may of avoiding this? Half baked thought but could
>> you for example copy the access/dirty information to the last (or
>> perhaps first, most likely invalid) PTE?
>
> I spent a long time thinking about this and came up with a number of
> possibilities, none of them ideal. In the end, I went for the simplest one
> (which works but suffers from the problem that it depends on the way it is
> called not changing).

Ok, that answers my underlying question of "has someone thought about
this and are there any easy solutions". I suspected that was the case
given the excellent write up though!

> 1) copy the access/dirty flags into all the remaining uncleared ptes within the
> contpte block. This is how I did it in v1; although it was racy. I think this
> could be implemented correctly but its extremely complex.
>
> 2) batch calls from the core-mm (like I did for pte_set_wrprotects()) so that we
> can clear 1 or more full contpte blocks in a single call - the ptes are never in
> an intermediate state. This is difficult because ptep_get_and_clear_full()
> returns the pte that was cleared so its difficult to scale that up to multiple ptes.
>
> 3) add ptep_get_no_access_dirty() and redefine the interface to only allow that
> to be called while ptep_get_and_clear_full() calls are on-going. Then assert in
> the other functions that ptep_get_and_clear_full() is not on-going when they are
> called. So we would get a clear sign that usage patterns have changed. But there
> is no easy place to store that state (other than scanning a contpte block
> looking for pte_none() amongst pte_valid_cont() entries) and it all felt ugly.
>
> 4) The simple approach I ended up taking; I thought it would be best to keep it
> simple and see if anyone was concerned before doing something more drastic.
>
> What do you think? If we really need to solve this, then option 1 is my
> preferred route, but it would take some time to figure out and reason about a
> race-free scheme.

Well I like simple, and I agree the risk is small. But I can't help feel
the current situation is too subtle, mainly because it is architecture
specific and the assumptions are not communicated in core-mm code
anywhere. But also none of the aternatives seem much better.

However there are only three callers of ptep_get_and_clear_full(), and
all of these hold the PTL. So if I'm not mistaken that should exclude
just about all users of ptep_get*() which will take the ptl before hand.

So really that only leaves ptep_get_lockless() that could/should
interleave right? From a quick glance of those users none look at the
young/dirty information anyway, so I wonder if we can just assert in the
core-mm that ptep_get_lockless() does not return young/dirty information
and clear it in the helpers? That would make things explicit and
consistent which would address my concern (although I haven't looked too
closely at the details there).

> Thanks,
> Ryan



  reply	other threads:[~2023-11-24  1:37 UTC|newest]

Thread overview: 204+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-15 16:30 [PATCH v2 00/14] Transparent Contiguous PTEs for User Mappings Ryan Roberts
2023-11-15 16:30 ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 01/14] mm: Batch-copy PTE ranges during fork() Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 21:26   ` kernel test robot
2023-11-15 21:26     ` kernel test robot
2023-11-16 10:07     ` Ryan Roberts
2023-11-16 10:07       ` Ryan Roberts
2023-11-16 10:12       ` David Hildenbrand
2023-11-16 10:12         ` David Hildenbrand
2023-11-16 10:36         ` Ryan Roberts
2023-11-16 10:36           ` Ryan Roberts
2023-11-16 11:01           ` David Hildenbrand
2023-11-16 11:01             ` David Hildenbrand
2023-11-16 11:13             ` Ryan Roberts
2023-11-16 11:13               ` Ryan Roberts
2023-11-15 21:37   ` Andrew Morton
2023-11-15 21:37     ` Andrew Morton
2023-11-16  9:34     ` Ryan Roberts
2023-11-16  9:34       ` Ryan Roberts
2023-12-04 11:01     ` Christophe Leroy
2023-12-04 11:01       ` Christophe Leroy
2023-11-15 22:40   ` kernel test robot
2023-11-15 22:40     ` kernel test robot
2023-11-16 10:03   ` David Hildenbrand
2023-11-16 10:03     ` David Hildenbrand
2023-11-16 10:26     ` Ryan Roberts
2023-11-16 10:26       ` Ryan Roberts
2023-11-27  8:42     ` Barry Song
2023-11-27  8:42       ` Barry Song
2023-11-27  9:35       ` Ryan Roberts
2023-11-27  9:35         ` Ryan Roberts
2023-11-27  9:59         ` Barry Song
2023-11-27  9:59           ` Barry Song
2023-11-27 10:10           ` Ryan Roberts
2023-11-27 10:10             ` Ryan Roberts
2023-11-27 10:28             ` Barry Song
2023-11-27 10:28               ` Barry Song
2023-11-27 11:07               ` Ryan Roberts
2023-11-27 11:07                 ` Ryan Roberts
2023-11-27 20:34                 ` Barry Song
2023-11-27 20:34                   ` Barry Song
2023-11-28  9:14                   ` Ryan Roberts
2023-11-28  9:14                     ` Ryan Roberts
2023-11-28  9:49                     ` Barry Song
2023-11-28  9:49                       ` Barry Song
2023-11-28 10:49                       ` Ryan Roberts
2023-11-28 10:49                         ` Ryan Roberts
2023-11-28 21:06                         ` Barry Song
2023-11-28 21:06                           ` Barry Song
2023-11-29 12:21                           ` Ryan Roberts
2023-11-29 12:21                             ` Ryan Roberts
2023-11-30  0:51                             ` Barry Song
2023-11-30  0:51                               ` Barry Song
2023-11-16 11:03   ` David Hildenbrand
2023-11-16 11:03     ` David Hildenbrand
2023-11-16 11:20     ` Ryan Roberts
2023-11-16 11:20       ` Ryan Roberts
2023-11-16 13:20       ` David Hildenbrand
2023-11-16 13:20         ` David Hildenbrand
2023-11-16 13:49         ` Ryan Roberts
2023-11-16 13:49           ` Ryan Roberts
2023-11-16 14:13           ` David Hildenbrand
2023-11-16 14:13             ` David Hildenbrand
2023-11-16 14:15             ` David Hildenbrand
2023-11-16 14:15               ` David Hildenbrand
2023-11-16 17:58               ` Ryan Roberts
2023-11-16 17:58                 ` Ryan Roberts
2023-11-23 10:26               ` Ryan Roberts
2023-11-23 10:26                 ` Ryan Roberts
2023-11-23 12:12                 ` David Hildenbrand
2023-11-23 12:12                   ` David Hildenbrand
2023-11-23 12:28                   ` Ryan Roberts
2023-11-23 12:28                     ` Ryan Roberts
2023-11-24  8:53                     ` David Hildenbrand
2023-11-24  8:53                       ` David Hildenbrand
2023-11-23  4:26   ` Alistair Popple
2023-11-23  4:26     ` Alistair Popple
2023-11-23 14:43     ` Ryan Roberts
2023-11-23 14:43       ` Ryan Roberts
2023-11-23 23:50       ` Alistair Popple
2023-11-23 23:50         ` Alistair Popple
2023-11-27  5:54   ` Barry Song
2023-11-27  5:54     ` Barry Song
2023-11-27  9:24     ` Ryan Roberts
2023-11-27  9:24       ` Ryan Roberts
2023-11-28  0:11       ` Barry Song
2023-11-28  0:11         ` Barry Song
2023-11-28 11:00         ` Ryan Roberts
2023-11-28 11:00           ` Ryan Roberts
2023-11-28 19:00           ` Barry Song
2023-11-28 19:00             ` Barry Song
2023-11-29 12:29             ` Ryan Roberts
2023-11-29 12:29               ` Ryan Roberts
2023-11-29 13:09               ` Barry Song
2023-11-29 13:09                 ` Barry Song
2023-11-29 14:07                 ` Ryan Roberts
2023-11-29 14:07                   ` Ryan Roberts
2023-11-30  0:34                   ` Barry Song
2023-11-30  0:34                     ` Barry Song
2023-11-15 16:30 ` [PATCH v2 02/14] arm64/mm: set_pte(): New layer to manage contig bit Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 03/14] arm64/mm: set_ptes()/set_pte_at(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 04/14] arm64/mm: pte_clear(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 05/14] arm64/mm: ptep_get_and_clear(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 06/14] arm64/mm: ptep_test_and_clear_young(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 07/14] arm64/mm: ptep_clear_flush_young(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 08/14] arm64/mm: ptep_set_wrprotect(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 09/14] arm64/mm: ptep_set_access_flags(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 10/14] arm64/mm: ptep_get(): " Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 11/14] arm64/mm: Split __flush_tlb_range() to elide trailing DSB Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 12/14] arm64/mm: Wire up PTE_CONT for user mappings Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-21 11:22   ` Alistair Popple
2023-11-21 11:22     ` Alistair Popple
2023-11-21 15:14     ` Ryan Roberts
2023-11-21 15:14       ` Ryan Roberts
2023-11-22  6:01       ` Alistair Popple
2023-11-22  6:01         ` Alistair Popple
2023-11-22  8:35         ` Ryan Roberts
2023-11-22  8:35           ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 13/14] arm64/mm: Implement ptep_set_wrprotects() to optimize fork() Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-15 16:30 ` [PATCH v2 14/14] arm64/mm: Add ptep_get_and_clear_full() to optimize process teardown Ryan Roberts
2023-11-15 16:30   ` Ryan Roberts
2023-11-23  5:13   ` Alistair Popple
2023-11-23  5:13     ` Alistair Popple
2023-11-23 16:01     ` Ryan Roberts
2023-11-23 16:01       ` Ryan Roberts
2023-11-24  1:35       ` Alistair Popple [this message]
2023-11-24  1:35         ` Alistair Popple
2023-11-24  8:54         ` Ryan Roberts
2023-11-24  8:54           ` Ryan Roberts
2023-11-27  7:34           ` Alistair Popple
2023-11-27  7:34             ` Alistair Popple
2023-11-27  8:53             ` Ryan Roberts
2023-11-27  8:53               ` Ryan Roberts
2023-11-28  6:54               ` Alistair Popple
2023-11-28  6:54                 ` Alistair Popple
2023-11-28 12:45                 ` Ryan Roberts
2023-11-28 12:45                   ` Ryan Roberts
2023-11-28 16:55                   ` Ryan Roberts
2023-11-28 16:55                     ` Ryan Roberts
2023-11-30  5:07                     ` Alistair Popple
2023-11-30  5:07                       ` Alistair Popple
2023-11-30  5:57                       ` Barry Song
2023-11-30  5:57                         ` Barry Song
2023-11-30 11:47                       ` Ryan Roberts
2023-11-30 11:47                         ` Ryan Roberts
2023-12-03 23:20                         ` Alistair Popple
2023-12-03 23:20                           ` Alistair Popple
2023-12-04  9:39                           ` Ryan Roberts
2023-12-04  9:39                             ` Ryan Roberts
2023-11-28  7:32   ` Barry Song
2023-11-28  7:32     ` Barry Song
2023-11-28 11:15     ` Ryan Roberts
2023-11-28 11:15       ` Ryan Roberts
2023-11-28  8:17   ` Barry Song
2023-11-28  8:17     ` Barry Song
2023-11-28 11:49     ` Ryan Roberts
2023-11-28 11:49       ` Ryan Roberts
2023-11-28 20:23       ` Barry Song
2023-11-28 20:23         ` Barry Song
2023-11-29 12:43         ` Ryan Roberts
2023-11-29 12:43           ` Ryan Roberts
2023-11-29 13:00           ` Barry Song
2023-11-29 13:00             ` Barry Song
2023-11-30  5:35           ` Barry Song
2023-11-30  5:35             ` Barry Song
2023-11-30 12:00             ` Ryan Roberts
2023-11-30 12:00               ` Ryan Roberts
2023-12-03 21:41               ` Barry Song
2023-12-03 21:41                 ` Barry Song
2023-11-27  3:18 ` [PATCH v2 00/14] Transparent Contiguous PTEs for User Mappings Barry Song
2023-11-27  3:18   ` Barry Song
2023-11-27  9:15   ` Ryan Roberts
2023-11-27  9:15     ` Ryan Roberts
2023-11-27 10:35     ` Barry Song
2023-11-27 10:35       ` Barry Song
2023-11-27 11:11       ` Ryan Roberts
2023-11-27 11:11         ` Ryan Roberts
2023-11-27 22:53         ` Barry Song
2023-11-27 22:53           ` Barry Song
2023-11-28 11:52           ` Ryan Roberts
2023-11-28 11:52             ` Ryan Roberts
2023-11-28  3:13     ` Yang Shi
2023-11-28  3:13       ` Yang Shi
2023-11-28 11:58       ` Ryan Roberts
2023-11-28 11:58         ` Ryan Roberts
2023-11-28  5:49     ` Barry Song
2023-11-28  5:49       ` Barry Song
2023-11-28 12:08       ` Ryan Roberts
2023-11-28 12:08         ` Ryan Roberts
2023-11-28 19:37         ` Barry Song
2023-11-28 19:37           ` Barry Song

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=87y1eovsn5.fsf@nvdebian.thelocal \
    --to=apopple@nvidia.com \
    --cc=akpm@linux-foundation.org \
    --cc=andreyknvl@gmail.com \
    --cc=anshuman.khandual@arm.com \
    --cc=ardb@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=david@redhat.com \
    --cc=dvyukov@google.com \
    --cc=glider@google.com \
    --cc=james.morse@arm.com \
    --cc=jhubbard@nvidia.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=oliver.upton@linux.dev \
    --cc=ryabinin.a.a@gmail.com \
    --cc=ryan.roberts@arm.com \
    --cc=suzuki.poulose@arm.com \
    --cc=vincenzo.frascino@arm.com \
    --cc=wangkefeng.wang@huawei.com \
    --cc=will@kernel.org \
    --cc=willy@infradead.org \
    --cc=yuzenghui@huawei.com \
    --cc=yuzhao@google.com \
    --cc=ziy@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.