From: Ryan Roberts <ryan.roberts@arm.com>
To: Dev Jain <dev.jain@arm.com>, catalin.marinas@arm.com, will@kernel.org
Cc: anshuman.khandual@arm.com, quic_zhenhuah@quicinc.com,
kevin.brodsky@arm.com, yangyicong@hisilicon.com,
joey.gouly@arm.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, david@redhat.com
Subject: Re: [PATCH v3] arm64: Enable vmalloc-huge with ptdump
Date: Tue, 17 Jun 2025 09:12:56 +0100 [thread overview]
Message-ID: <f1876bc1-94f5-46d0-b51d-12537d979830@arm.com> (raw)
In-Reply-To: <ec8a398c-727c-420a-9110-5362ce35f786@arm.com>
On 17/06/2025 04:59, Dev Jain wrote:
>
> On 17/06/25 8:24 am, Dev Jain wrote:
>>
>> On 16/06/25 11:37 pm, Ryan Roberts wrote:
>>> On 16/06/2025 11:33, Dev Jain wrote:
>>>> arm64 disables vmalloc-huge when kernel page table dumping is enabled,
>>>> because an intermediate table may be removed, potentially causing the
>>>> ptdump code to dereference an invalid address. We want to be able to
>>>> analyze block vs page mappings for kernel mappings with ptdump, so to
>>>> enable vmalloc-huge with ptdump, synchronize between page table removal in
>>>> pmd_free_pte_page()/pud_free_pmd_page() and ptdump pagetable walking. We
>>>> use mmap_read_lock and not write lock because we don't need to synchronize
>>>> between two different vm_structs; two vmalloc objects running this same
>>>> code path will point to different page tables, hence there is no race.
>>>>
>>>> For pud_free_pmd_page(), we isolate the PMD table to avoid taking the lock
>>>> 512 times again via pmd_free_pte_page().
>>>>
>>>> We implement the locking mechanism using static keys, since the chance
>>>> of a race is very small. Observe that the synchronization is needed
>>>> to avoid the following race:
>>>>
>>>> CPU1 CPU2
>>>> take reference of PMD table
>>>> pud_clear()
>>>> pte_free_kernel()
>>>> walk freed PMD table
>>>>
>>>> and similar race between pmd_free_pte_page and ptdump_walk_pgd.
>>>>
>>>> Therefore, there are two cases: if ptdump sees the cleared PUD, then
>>>> we are safe. If not, then the patched-in read and write locks help us
>>>> avoid the race.
>>>>
>>>> To implement the mechanism, we need the static key access from mmu.c and
>>>> ptdump.c. Note that in case !CONFIG_PTDUMP_DEBUGFS, ptdump.o won't be a
>>>> target in the Makefile, therefore we cannot initialize the key there, as
>>>> is being done, for example, in the static key implementation of
>>>> hugetlb-vmemmap. Therefore, include asm/cpufeature.h, which includes
>>>> the jump_label mechanism. Declare the key there and define the key to false
>>>> in mmu.c.
>>>>
>>>> No issues were observed with mm-selftests. No issues were observed while
>>>> parallelly running test_vmalloc.sh and dumping the kernel pagetable through
>>>> sysfs in a loop.
>>>>
>>>> v2->v3:
>>>> - Use static key mechanism
>>>>
>>>> v1->v2:
>>>> - Take lock only when CONFIG_PTDUMP_DEBUGFS is on
>>>> - In case of pud_free_pmd_page(), isolate the PMD table to avoid taking
>>>> the lock 512 times again via pmd_free_pte_page()
>>>>
>>>> Signed-off-by: Dev Jain <dev.jain@arm.com>
>>>> ---
>>>> arch/arm64/include/asm/cpufeature.h | 1 +
>>>> arch/arm64/mm/mmu.c | 51 ++++++++++++++++++++++++++---
>>>> arch/arm64/mm/ptdump.c | 5 +++
>>>> 3 files changed, 53 insertions(+), 4 deletions(-)
>>>>
[...]
>>>> + pud_clear(pudp);
>>> How can this possibly be correct; you're clearing the pud without any
>>> synchronisation. So you could have this situation:
>>>
>>> CPU1 (vmalloc) CPU2 (ptdump)
>>>
>>> static_branch_enable()
>>> mmap_write_lock()
>>> pud = pudp_get()
>>
>> When you do pudp_get(), you won't be dereferencing a NULL pointer.
>> pud_clear() will nullify the pud entry. So pudp_get() will boil
>> down to retrieving a NULL entry. Or, pudp_get() will retrieve an
>> entry pointing to the now isolated PMD table. Correct me if I am
>> wrong.
>>
>>> pud_free_pmd_page()
>>> pud_clear()
>>> access the table pointed to by pud
>>> BANG!
>
> I am also confused thoroughly now : ) This should not go bang as the
>
> table pointed to by pud is still there, and our sequence guarantees that
>
> if the ptdump walk is using the pmd table, then pud_free_pmd_page won't
>
> free the PMD table yet.
You're right... I'm not sure what I was smoking last night. For some reason I
read the pXd_clear() as "free". This approach looks good to me - very clever!
And you even managed to ensure the WRITE_ONCE() in pXd_clear() doesn't get
reordered after taking the lock via the existing dsb in the tlb maintenance
operation - I like it!
I'll send a separate review with some nits, but I'm out today, so that might
have to wait until tomorrow.
Thanks, and sorry again for the noise!
Ryan
next prev parent reply other threads:[~2025-06-17 8:13 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-16 10:33 Dev Jain
2025-06-16 15:00 ` David Hildenbrand
2025-06-16 16:34 ` Dev Jain
2025-06-16 18:07 ` Ryan Roberts
2025-06-16 21:20 ` Ryan Roberts
2025-06-17 11:51 ` Uladzislau Rezki
2025-06-18 3:11 ` Dev Jain
2025-06-18 17:19 ` Uladzislau Rezki
2025-06-19 3:13 ` Dev Jain
2025-06-18 11:21 ` Ryan Roberts
2025-06-18 17:19 ` Uladzislau Rezki
2025-06-17 2:54 ` Dev Jain
2025-06-17 3:59 ` Dev Jain
2025-06-17 8:12 ` Ryan Roberts [this message]
2025-06-17 8:58 ` Dev Jain
2025-06-25 10:35 ` Ryan Roberts
2025-06-25 11:12 ` Dev Jain
2025-06-25 11:16 ` Ryan Roberts
2025-06-25 11:25 ` Dev Jain
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=f1876bc1-94f5-46d0-b51d-12537d979830@arm.com \
--to=ryan.roberts@arm.com \
--cc=anshuman.khandual@arm.com \
--cc=catalin.marinas@arm.com \
--cc=david@redhat.com \
--cc=dev.jain@arm.com \
--cc=joey.gouly@arm.com \
--cc=kevin.brodsky@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=quic_zhenhuah@quicinc.com \
--cc=will@kernel.org \
--cc=yangyicong@hisilicon.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
all inboxes | Powered by JetHome®