Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1798303ybl; Thu, 30 Jan 2020 06:14:51 -0800 (PST) X-Google-Smtp-Source: APXvYqxWZ8XKrgEX4s2b3oKUMNYQv2YSHUzbhUAVSD3+M3QxmwnskxGNNKnb6Bky13juIuGCStnc X-Received: by 2002:a54:4418:: with SMTP id k24mr3101342oiw.46.1580393691251; Thu, 30 Jan 2020 06:14:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580393691; cv=none; d=google.com; s=arc-20160816; b=aLYs8hS2I9CM1FiDJrdLPLv6X4nrhiQklA3qkD3H2+dLTCe+ofAborFxred4plRbEU DiBF+w/XXd2cUnjrfVPT32dfQx2olI1ap08QALwE9mswrKZdsF+8qVeD2ynFL6DccpSy CSENpx+sctmEIoSFoiw9N7i5955snWI0fAc/TKXZ11HEWeFd350/4TeDs0OIhEph2TAc att4FKOh7tsKuP7RFsQ/9w0u7uRc2RbW1fe3BLjVK6KZxxKOaQjUeixskQ+XwPDSsCvX nkKiagRlMDimYym0SK0ZzWrccxUCs1C4KgIcFN33D7jnByGWRvasibf1bfBUbNakYtIS I9Sw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=jiy8q+DLF/cyz8x0j+2VD0K/r6LzapCGUAMM8PPwAqg=; b=ZvMG89FpmF4pr81q9fQcqUTBCjVEf7IOONZlasVlUDsRhcCPfa6P8ZkCWDbZhiSaBg CV4yQEk9mmwGNM0w1+eks6VQva1i7J3nXd609eTPm6ZNRDM2Mh7pp/sonHgA4kf78gl6 sUjByrqn6RcBpY5RwiuDNEQX0gz9uJfDSCtvl+7rGrTEorWRaY3bKUXuG5V+gcoUGbIA icBJaJ1wDxku1i2dCWo6WtVb3j1X9Y6bTm5KRfGHz3yz+snh6CJ5vSU2TM6JgvEl2+kO dMBpCVrUebKDc9doippxz2xdVcLkC/AT9y6LVlehoFQ1uFd2WEZ/muBeMG1t2MLYEyTA 74mQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@c-s.fr header.s=mail header.b=qICZOrjf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h8si2590597oib.104.2020.01.30.06.14.39; Thu, 30 Jan 2020 06:14:51 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@c-s.fr header.s=mail header.b=qICZOrjf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727452AbgA3ONX (ORCPT + 99 others); Thu, 30 Jan 2020 09:13:23 -0500 Received: from pegase1.c-s.fr ([93.17.236.30]:30980 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726902AbgA3ONW (ORCPT ); Thu, 30 Jan 2020 09:13:22 -0500 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 487j4Z2bp9z9v2Nx; Thu, 30 Jan 2020 15:13:18 +0100 (CET) Authentication-Results: localhost; dkim=pass reason="1024-bit key; insecure key" header.d=c-s.fr header.i=@c-s.fr header.b=qICZOrjf; dkim-adsp=pass; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id uOkb5XiF-zPA; Thu, 30 Jan 2020 15:13:18 +0100 (CET) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 487j4Z13FJz9v2Nw; Thu, 30 Jan 2020 15:13:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=c-s.fr; s=mail; t=1580393598; bh=jiy8q+DLF/cyz8x0j+2VD0K/r6LzapCGUAMM8PPwAqg=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=qICZOrjfjgKU41D9G6qwOhWQ3f07+KjLwpAHo5DoCMTyruxB3bymqHi8naihrjRrd VNgNmAI2BgWTRJKP0fo15DiJvJYT/IAWdqQGaK6fSFCsfnDbh4zU2Oj9aR7VXIDKWw S5BQleimwSbi1BQRePhLQirIhOLqknAgD+VG9wXI= Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 606438B875; Thu, 30 Jan 2020 15:13:19 +0100 (CET) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id v9YV4qhIXl9S; Thu, 30 Jan 2020 15:13:19 +0100 (CET) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id CC2F68B874; Thu, 30 Jan 2020 15:13:16 +0100 (CET) Subject: Re: [PATCH V12] mm/debug: Add tests validating architecture page table helpers To: Anshuman Khandual , linux-mm@kvack.org Cc: Andrew Morton , Vlastimil Babka , Greg Kroah-Hartman , Thomas Gleixner , Mike Rapoport , Jason Gunthorpe , Dan Williams , Peter Zijlstra , Michal Hocko , Mark Rutland , Mark Brown , Steven Price , Ard Biesheuvel , Masahiro Yamada , Kees Cook , Tetsuo Handa , Matthew Wilcox , Sri Krishna chowdary , Dave Hansen , Russell King - ARM Linux , Michael Ellerman , Paul Mackerras , Martin Schwidefsky , Heiko Carstens , "David S. Miller" , Vineet Gupta , James Hogan , Paul Burton , Ralf Baechle , "Kirill A . Shutemov" , Gerald Schaefer , Ingo Molnar , linux-snps-arc@lists.infradead.org, linux-mips@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org References: <1580174873-18117-1-git-send-email-anshuman.khandual@arm.com> <68ed6488-aa25-ab41-8da6-f0ddeb15d52b@c-s.fr> <49754f74-53a7-0e4a-bb16-53617f8c902c@arm.com> From: Christophe Leroy Message-ID: <473d8198-3ac4-af3b-e2ec-c0698a3565d3@c-s.fr> Date: Thu, 30 Jan 2020 15:13:16 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.4.2 MIME-Version: 1.0 In-Reply-To: <49754f74-53a7-0e4a-bb16-53617f8c902c@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 30/01/2020 à 14:04, Anshuman Khandual a écrit : > > 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/ For me it would make sense to not mix this patch which implement tests, and changes that are needed for the test to work (or even build) on the different architectures. But that's up to you. > >> >>>   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. I can't see any debug related features in that file. > >> >> 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. What about linux/mmdebug.h instead ? (I have not checked if it would reduce the impact, but that's where things related to CONFIG_DEBUG_VM seems to be). Otherwise, you can just create new file, for instance and include that file only in the init/main.c and mm/debug_vm_pgtable.c > >> >>> +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. Yes, but how can we improve if we blindly copy the errors from the past ? Having tons of 'extern' doesn't mean we must add more. I think checkpatch.pl usually complains when a patch brings a new unreleval extern symbol. > >> >>> +#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() ? It would avoid having it lost in the middle of drivers logs, would be close to the end of init, at a place we can't miss it, close to the result of other tests like CONFIG_DEBUG_RODATA_TEST for instance. At the moment, you have to look for it to be sure the test is done and what the result is. > >> >>>       /* 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. Yes but it perfectly work as standalone. The more easy it is to activate and the more people will use it. DEBUG_VM obliges to rebuild the kernel entirely and could modify the behaviour. Could the helpers we are testing behave differently when DEBUG_VM is not set ? I think it's good the test things as close as possible to final config. > >> 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. I think if we want people to really use it on other architectures it must be possible to activate it without having to modify Kconfig. Otherwise people won't even know the test exists and the architecture fails the test. The purpose of a test suite is to detect bugs. If you can't run the test until you have fixed the bugs, I guess nobody will ever detect the bugs and they will never be fixed. So I think: - the test should be 'default y' when ARCH_HAS_DEBUG_VM_PGTABLE is selected - the test should be 'default n' when ARCH_HAS_DEBUG_VM_PGTABLE is not selected, and it should be user selectable if EXPERT is selected. Something like: config DEBUG_VM_PGTABLE bool "Debug arch page table for semantics compliance" if ARCH_HAS_DEBUG_VM_PGTABLE || EXPERT depends on MMU default 'n' if !ARCH_HAS_DEBUG_VM_PGTABLE default 'y' if DEBUG_VM > >> >>> +    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. Well I was not asking if 'default y' was making sense but only if 'If unsure say N' was making sense due to the 'default y'. You got it. Christophe