Re: [PATCH V15] mm/debug: Add tests validating architecture page table helpers
From: Anshuman Khandual <hidden>
Date: 2020-03-10 02:32:05
Also in:
linux-arch, linux-arm-kernel, linux-mm, linux-riscv, linux-s390, lkml
On 03/07/2020 12:35 PM, Christophe Leroy wrote:
Le 07/03/2020 à 01:56, Anshuman Khandual a écrit :quoted
On 03/07/2020 06:04 AM, Qian Cai wrote:quoted
quoted
On Mar 6, 2020, at 7:03 PM, Anshuman Khandual [off-list ref] wrote: Hmm, set_pte_at() function is not preferred here for these tests. The idea is to avoid or atleast minimize TLB/cache flushes triggered from these sort of 'static' tests. set_pte_at() is platform provided and could/might trigger these flushes or some other platform specific synchronization stuff. JustWhy is that important for this debugging option?Primarily reason is to avoid TLB/cache flush instructions on the system during these tests that only involve transforming different page table level entries through helpers. Unless really necessary, why should it emit any TLB/cache flush instructions ?What's the problem with thoses flushes ?quoted
quoted
quoted
wondering is there specific reason with respect to the soft lock up problem making it necessary to use set_pte_at() rather than a simple WRITE_ONCE() ?Looks at the s390 version of set_pte_at(), it has this comment, vmaddr); /* * Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ I can only guess that powerpc could be the same here.This comment is present in multiple platforms while defining set_pte_at(). Is not 'barrier()' here alone good enough ? Else what exactly set_pte_at() does as compared to WRITE_ONCE() that avoids the soft lock up, just trying to understand.Argh ! I didn't realise that you were writing directly into the page tables. When it works, that's only by chance I guess. To properly set the page table entries, set_pte_at() has to be used: - On powerpc 8xx, with 16k pages, the page table entry must be copied four times. set_pte_at() does it, WRITE_ONCE() doesn't. - On powerpc book3s/32 (hash MMU), the flag _PAGE_HASHPTE must be preserved among writes. set_pte_at() preserves it, WRITE_ONCE() doesn't. set_pte_at() also does a few other mandatory things, like calling pte_mkpte() So, the WRITE_ONCE() must definitely become a set_pte_at()
Sure, will do. These are part of the clear tests that populates a given entry with a non zero value before clearing and testing it with pxx_none(). In that context, WRITE_ONCE() seemed sufficient. But pte_clear() might be closely tied with proper page table entry update and hence a preceding set_pte_at() will be better. There are still more WRITE_ONCE() for other page table levels during these clear tests. set_pmd_at() and set_pud_at() are defined on platforms that support (and enable) THP and PUD based THP respectively. Hence they could not be used for clear tests as remaining helpers pmd_clear(), pud_clear(), p4d_clear() and pgd_clear() still need to be validated with or without THP support and enablement. We should just leave all other WRITE_ONCE() instances unchanged. Please correct me if I am missing something here.
Christophe