On 01/28/2020 10:35 PM, Christophe Leroy wrote:
Le 28/01/2020 Ã 02:27, Anshuman Khandual a ÃcritÂ:
diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h
index 0b6c4042942a..fb0e76d254b3 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -53,6 +53,12 @@ static inline void sync_initial_page_table(void) { }
  struct mm_struct;
 +#define mm_p4d_folded mm_p4d_folded
+static inline bool mm_p4d_folded(struct mm_struct *mm)
+{
+ÂÂÂ return !pgtable_l5_enabled();
+}
+
For me this should be part of another patch, it is not directly linked to the tests.
We did discuss about this earlier and Kirril mentioned its not worth
a separate patch.
https://lore.kernel.org/linux-arm-kernel/20190913091305.rkds4f3fqv3yjhjy@box/
 void set_pte_vaddr_p4d(p4d_t *p4d_page, unsigned long vaddr, pte_t new_pte);
 void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte);
 diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
index 798ea36a0549..e0b04787e789 100644
--- a/include/asm-generic/pgtable.h
+++ b/include/asm-generic/pgtable.h
@@ -1208,6 +1208,12 @@ static inline bool arch_has_pfn_modify_check(void)
 # define PAGE_KERNEL_EXEC PAGE_KERNEL
 #endif
 +#ifdef CONFIG_DEBUG_VM_PGTABLE
Not sure it is a good idea to put that in include/asm-generic/pgtable.h
Logically that is the right place, as it is related to page table but
not something platform related.
By doing this you are forcing a rebuild of almost all files, whereas only init/main.o and mm/debug_vm_pgtable.o should be rebuilt when activating this config option.
I agreed but whats the alternative ? We could move these into init/main.c
to make things simpler but will that be a right place, given its related
to generic page table.
+extern void debug_vm_pgtable(void);
Please don't use the 'extern' keyword, it is useless and not to be used for functions declaration.
Really ? But, there are tons of examples doing the same thing both in
generic and platform code as well.
+#else
+static inline void debug_vm_pgtable(void) { }
+#endif
+
 #endif /* !__ASSEMBLY__ */
  #ifndef io_remap_pfn_range
diff --git a/init/main.c b/init/main.c
index da1bc0b60a7d..5e59e6ac0780 100644
--- a/init/main.c
+++ b/init/main.c
@@ -1197,6 +1197,7 @@ static noinline void __init kernel_init_freeable(void)
ÂÂÂÂÂ sched_init_smp();
 Â page_alloc_init_late();
+ÂÂÂ debug_vm_pgtable();
Wouldn't it be better to call debug_vm_pgtable() in kernel_init() between the call to async_synchronise_full() and ftrace_free_init_mem() ?
IIRC, proposed location is the earliest we could call debug_vm_pgtable().
Is there any particular benefit or reason to move it into kernel_init() ?
ÂÂÂÂÂ /* Initialize page ext after all struct pages are initialized. */
ÂÂÂÂÂ page_ext_init();
 diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 5ffe144c9794..7cceae923c05 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -653,6 +653,12 @@ config SCHED_STACK_END_CHECK
ÂÂÂÂÂÂÂ data corruption or a sporadic crash at a later stage once the region
ÂÂÂÂÂÂÂ is examined. The runtime overhead introduced is minimal.
 +config ARCH_HAS_DEBUG_VM_PGTABLE
+ÂÂÂ bool
+ÂÂÂ help
+ÂÂÂÂÂ An architecture should select this when it can successfully
+ÂÂÂÂÂ build and run DEBUG_VM_PGTABLE.
+
 config DEBUG_VM
ÂÂÂÂÂ bool "Debug VM"
ÂÂÂÂÂ depends on DEBUG_KERNEL
@@ -688,6 +694,22 @@ config DEBUG_VM_PGFLAGS
 Â If unsure, say N.
 +config DEBUG_VM_PGTABLE
+ÂÂÂ bool "Debug arch page table for semantics compliance"
+ÂÂÂ depends on MMU
+ÂÂÂ depends on DEBUG_VM
Does it really need to depend on DEBUG_VM ?
No. It seemed better to package this test along with DEBUG_VM (although I
dont remember the conversation around it) and hence this dependency.
I think we could make it standalone and 'default y if DEBUG_VM' instead.
Which will yield the same result like before but in a different way. But
yes, this test could go about either way but unless there is a good enough
reason why change the current one.
+ÂÂÂ depends on ARCH_HAS_DEBUG_VM_PGTABLE
+ÂÂÂ default y
+ÂÂÂ help
+ÂÂÂÂÂ This option provides a debug method which can be used to test
+ÂÂÂÂÂ architecture page table helper functions on various platforms in
+ÂÂÂÂÂ verifying if they comply with expected generic MM semantics. This
+ÂÂÂÂÂ will help architecture code in making sure that any changes or
+ÂÂÂÂÂ new additions of these helpers still conform to expected
+ÂÂÂÂÂ semantics of the generic MM.
+
+ÂÂÂÂÂ If unsure, say N.
+
Does it make sense to make it 'default y' and say 'If unsure, say N' ?
No it does. Not when it defaults 'y' unconditionally. Will drop the last
sentence "If unsure, say N". Nice catch, thank you.