Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp3987306ybi; Mon, 10 Jun 2019 22:15:45 -0700 (PDT) X-Google-Smtp-Source: APXvYqzsUcB83xjoVRqCubvMBOVkU64dvy/iQ6ey7LR+fx9V3Jmus/NHZp9zTwZRO12yLpxR+o6C X-Received: by 2002:a17:90a:1c17:: with SMTP id s23mr16413515pjs.108.1560230145586; Mon, 10 Jun 2019 22:15:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560230145; cv=none; d=google.com; s=arc-20160816; b=LIz5qBV0NQW59hXfEIJWIapVlwty+ZDDkXh17uiJ3Sn2zxeSmo7U8244eZHwcNtATT Y92c6jbGhgZZ9+b4mjVmzf+J3q5EVpUsU+bEFI1wsqHTDlTtsh2+2z1rj4ZgLZ0wv5qv drCdjbL+ShxviatvGcsoTGoWONURuhkuOm+2a8ApzMHfQYMb7twHYHEepkk1p1WMoUzd +W3VGP9Aa8/YoqYOCHTE7HpAHMq75VWfpYSAUbFUcF3cyuUCV5RCakXUuoadUUX2hL3V A37w+HVdM4SzAOxQTRPh+BWwX4D/HK1TENIiG/psPVmmQy3iKZ7jMLwo5DxsnQ7u/lJC 6dNg== 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; bh=MVYdUVF8TMhqeKNkMhTi4YFI1Gq+UcXcBKyW/cyJe+A=; b=H8XY1IWDWSVRozYQfd+p6ryMXbnfb1psaPtFCZyudhlCMUWnH1wqtsAs/VY/ujjHoW hbHP6XHJw0bb6pHXMFX/m5XwFK92yllnq9EjRUE+VNLsOPWKbS7e7Dr62D9zOpHdKpT/ UJWpHDBr1fP8gWSzj9r+WwC/TUMAf/GxWrfG4va2Qc8AF5baNwYAK5/blNFtH256yB7W fT/xTZhuPeju7leI7s2IScrIVA1S1BCeNyoqDATdr9Shx2Znn7Kbloul6zaQAdyDK43i ZfG+NIbs4BjPAx4cI33C6pVadCRHllLWvhSZNUiQrcVcLiSQZt9rZ5W+pdVaUHiayl40 JrRQ== ARC-Authentication-Results: i=1; mx.google.com; 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 j38si11485433pgi.227.2019.06.10.22.15.30; Mon, 10 Jun 2019 22:15:45 -0700 (PDT) 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; 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 S2391195AbfFKFPV (ORCPT + 99 others); Tue, 11 Jun 2019 01:15:21 -0400 Received: from foss.arm.com ([217.140.110.172]:53006 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390492AbfFKFPU (ORCPT ); Tue, 11 Jun 2019 01:15:20 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 55CCB344; Mon, 10 Jun 2019 22:15:19 -0700 (PDT) Received: from [10.162.43.135] (p8cg001049571a15.blr.arm.com [10.162.43.135]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 5A7FF3F73C; Mon, 10 Jun 2019 22:15:11 -0700 (PDT) Subject: Re: [RFC V3] mm: Generalize and rename notify_page_fault() as kprobe_page_fault() To: Christophe Leroy , linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: 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, Andrew Morton , Michal Hocko , Matthew Wilcox , Mark Rutland , Stephen Rothwell , Andrey Konovalov , Michael Ellerman , Paul Mackerras , Russell King , Catalin Marinas , Will Deacon , Tony Luck , Fenghua Yu , Martin Schwidefsky , Heiko Carstens , Yoshinori Sato , "David S. Miller" , Thomas Gleixner , Peter Zijlstra , Ingo Molnar , Andy Lutomirski , Dave Hansen References: <1559903655-5609-1-git-send-email-anshuman.khandual@arm.com> <97e9c9b3-89c8-d378-4730-841a900e6800@arm.com> From: Anshuman Khandual Message-ID: <1875ab7a-204e-4150-c7cc-d282f69da724@arm.com> Date: Tue, 11 Jun 2019 10:45:30 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/11/2019 10:16 AM, Christophe Leroy wrote: > > > Le 10/06/2019 à 04:39, Anshuman Khandual a écrit : >> >> >> On 06/07/2019 09:01 PM, Christophe Leroy wrote: >>> >>> >>> Le 07/06/2019 à 12:34, Anshuman Khandual a écrit : >>>> Very similar definitions for notify_page_fault() are being used by multiple >>>> architectures duplicating much of the same code. This attempts to unify all >>>> of them into a generic implementation, rename it as kprobe_page_fault() and >>>> then move it to a common header. >>>> >>>> kprobes_built_in() can detect CONFIG_KPROBES, hence new kprobe_page_fault() >>>> need not be wrapped again within CONFIG_KPROBES. Trap number argument can >>>> now contain upto an 'unsigned int' accommodating all possible platforms. >>>> >>>> kprobe_page_fault() goes the x86 way while dealing with preemption context. >>>> As explained in these following commits the invoking context in itself must >>>> be non-preemptible for kprobes processing context irrespective of whether >>>> kprobe_running() or perhaps smp_processor_id() is safe or not. It does not >>>> make much sense to continue when original context is preemptible. Instead >>>> just bail out earlier. >>>> >>>> commit a980c0ef9f6d >>>> ("x86/kprobes: Refactor kprobes_fault() like kprobe_exceptions_notify()") >>>> >>>> commit b506a9d08bae ("x86: code clarification patch to Kprobes arch code") >>>> >>>> Cc: linux-arm-kernel@lists.infradead.org >>>> Cc: linux-ia64@vger.kernel.org >>>> Cc: linuxppc-dev@lists.ozlabs.org >>>> Cc: linux-s390@vger.kernel.org >>>> Cc: linux-sh@vger.kernel.org >>>> Cc: sparclinux@vger.kernel.org >>>> Cc: x86@kernel.org >>>> Cc: Andrew Morton >>>> Cc: Michal Hocko >>>> Cc: Matthew Wilcox >>>> Cc: Mark Rutland >>>> Cc: Christophe Leroy >>>> Cc: Stephen Rothwell >>>> Cc: Andrey Konovalov >>>> Cc: Michael Ellerman >>>> Cc: Paul Mackerras >>>> Cc: Russell King >>>> Cc: Catalin Marinas >>>> Cc: Will Deacon >>>> Cc: Tony Luck >>>> Cc: Fenghua Yu >>>> Cc: Martin Schwidefsky >>>> Cc: Heiko Carstens >>>> Cc: Yoshinori Sato >>>> Cc: "David S. Miller" >>>> Cc: Thomas Gleixner >>>> Cc: Peter Zijlstra >>>> Cc: Ingo Molnar >>>> Cc: Andy Lutomirski >>>> Cc: Dave Hansen >>>> >>>> Signed-off-by: Anshuman Khandual >>>> --- >>>> Testing: >>>> >>>> - Build and boot tested on arm64 and x86 >>>> - Build tested on some other archs (arm, sparc64, alpha, powerpc etc) >>>> >>>> Changes in RFC V3: >>>> >>>> - Updated the commit message with an explaination for new preemption behaviour >>>> - Moved notify_page_fault() to kprobes.h with 'static nokprobe_inline' per Matthew >>>> - Changed notify_page_fault() return type from int to bool per Michael Ellerman >>>> - Renamed notify_page_fault() as kprobe_page_fault() per Peterz >>>> >>>> Changes in RFC V2: (https://patchwork.kernel.org/patch/10974221/) >>>> >>>> - Changed generic notify_page_fault() per Mathew Wilcox >>>> - Changed x86 to use new generic notify_page_fault() >>>> - s/must not/need not/ in commit message per Matthew Wilcox >>>> >>>> Changes in RFC V1: (https://patchwork.kernel.org/patch/10968273/) >>>> >>>>    arch/arm/mm/fault.c      | 24 +----------------------- >>>>    arch/arm64/mm/fault.c    | 24 +----------------------- >>>>    arch/ia64/mm/fault.c     | 24 +----------------------- >>>>    arch/powerpc/mm/fault.c  | 23 ++--------------------- >>>>    arch/s390/mm/fault.c     | 16 +--------------- >>>>    arch/sh/mm/fault.c       | 18 ++---------------- >>>>    arch/sparc/mm/fault_64.c | 16 +--------------- >>>>    arch/x86/mm/fault.c      | 21 ++------------------- >>>>    include/linux/kprobes.h  | 16 ++++++++++++++++ >>>>    9 files changed, 27 insertions(+), 155 deletions(-) >>>> >>> >>> [...] >>> >>>> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h >>>> index 443d980..064dd15 100644 >>>> --- a/include/linux/kprobes.h >>>> +++ b/include/linux/kprobes.h >>>> @@ -458,4 +458,20 @@ static inline bool is_kprobe_optinsn_slot(unsigned long addr) >>>>    } >>>>    #endif >>>>    +static nokprobe_inline bool kprobe_page_fault(struct pt_regs *regs, >>>> +                          unsigned int trap) >>>> +{ >>>> +    int ret = 0; >>> >>> ret is pointless. >>> >>>> + >>>> +    /* >>>> +     * To be potentially processing a kprobe fault and to be allowed >>>> +     * to call kprobe_running(), we have to be non-preemptible. >>>> +     */ >>>> +    if (kprobes_built_in() && !preemptible() && !user_mode(regs)) { >>>> +        if (kprobe_running() && kprobe_fault_handler(regs, trap)) >>> >>> don't need an 'if A if B', can do 'if A && B' >> >> Which will make it a very lengthy condition check. > > Yes. But is that a problem at all ? Probably not. > > For me the following would be easier to read. > > if (kprobes_built_in() && !preemptible() && !user_mode(regs) && >     kprobe_running() && kprobe_fault_handler(regs, trap)) >     ret = 1; As mentioned before will stick with current x86 implementation.