From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.4 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4DA2EC38BE2 for ; Mon, 24 Feb 2020 20:31:33 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 028CC20675 for ; Mon, 24 Feb 2020 20:31:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="K57GW7qB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 028CC20675 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id E4A356B0092; Mon, 24 Feb 2020 15:31:28 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id DAA6C6B0093; Mon, 24 Feb 2020 15:31:28 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C6BD16B0095; Mon, 24 Feb 2020 15:31:28 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id A52936B0092 for ; Mon, 24 Feb 2020 15:31:28 -0500 (EST) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 66A94181AC9CB for ; Mon, 24 Feb 2020 20:31:28 +0000 (UTC) X-FDA: 76526165856.23.smash88_29e501ebcd914 X-HE-Tag: smash88_29e501ebcd914 X-Filterd-Recvd-Size: 6800 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf50.hostedemail.com (Postfix) with ESMTP for ; Mon, 24 Feb 2020 20:31:27 +0000 (UTC) Received: by mail-pj1-f74.google.com with SMTP id i3so406952pjx.8 for ; Mon, 24 Feb 2020 12:31:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=gWGWLzMDfRJn6B5dEmX6CBuT6y2zEQqydtIvsZF/DT8=; b=K57GW7qByWEztIciIM8ZIfggV5pcKrGlHx/TVIrdw8MUi6fHGw+kkhncRBXKGghjz7 vIBemnN7YITHiMS1otpi9D3SYHVPm9QRzJ9/g8MIjn9CILqOd4+QH15ffrpmWPa8PuNw UOe7Pu2UScy0JieOlOU53H1C1Ad5OgjbaN09dBG6UO4YiG3/u7fyciwo4DLmGj+EZzV7 HbZ49q0z2e1vhzX5EmQ5YZh6L4HBAnGnwLF4vmpiITOXjMjVr744zGrpqHNEk8iQ0F1S LsW85NrSMafLZNhP6gF6nVQMQcqtJlo4U0a/5kHmkHqOw6NBq4qOGoShEFAl6LVwU2Iw QCQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=gWGWLzMDfRJn6B5dEmX6CBuT6y2zEQqydtIvsZF/DT8=; b=lS3K+ozVSpLkLtGiv4sIRked6pYp7l5kGvXiwCZINUW98vGgBmTgbhf2ckOfvm4MCc ScnyaHRqL13Jj26+Bzm+M5najoG6opP/V1iH0QoNPz5kgkaw3DqMbErxdpOdcabmg6HU 2JkEK9ZmQMapJ7ipoLJ5GE9Vlo7/ti+KTDJ07YzUP/BbXZQ0zHLtv/hSz8jXiZqHQhqk +zD+50iP5VC++g2ZihMrkQ3CBdpO+Y+HwG6TjfiZyYN9G0khUZN5N2IgSYI9oRjLezc3 PxPTjyqGgmD9RXSU5UBaNV0AM4+OnHoFqwGICi1oo8gh8largvhFvFJssVoYB/UeqNQe yNFg== X-Gm-Message-State: APjAAAUWF3KU48EAEen4cbt071ZynVVx23mFwOleEPYRuedSKQXdpjq0 PxmSgJs9Xsd64x4TTfxR+qYSpEiHOLk= X-Google-Smtp-Source: APXvYqwzHQ0lmu3zCTa1iGZHZygP+/9GmAeEE7svXuVy7RHc7e7z9w1+B3xO9DGUdE2diYNUfh1PjiAkCiE= X-Received: by 2002:a63:6d01:: with SMTP id i1mr53357291pgc.55.1582576286784; Mon, 24 Feb 2020 12:31:26 -0800 (PST) Date: Mon, 24 Feb 2020 12:30:44 -0800 In-Reply-To: <20200224203057.162467-1-walken@google.com> Message-Id: <20200224203057.162467-12-walken@google.com> Mime-Version: 1.0 References: <20200224203057.162467-1-walken@google.com> X-Mailer: git-send-email 2.25.0.265.gbab2e86ba0-goog Subject: [RFC PATCH 11/24] x86 fault handler: merge bad_area() functions From: Michel Lespinasse To: Peter Zijlstra , Andrew Morton , Laurent Dufour , Vlastimil Babka , Matthew Wilcox , "Liam R . Howlett" , Jerome Glisse , Davidlohr Bueso , David Rientjes Cc: linux-mm , Michel Lespinasse Content-Type: text/plain; charset="UTF-8" X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This merges the bad_area(), bad_area_access_error() and the underlying __bad_area() functions into one single unified function. Passing a NULL vma triggers the prior bad_area() behavior, while passing a non-NULL vma triggers the prior bad_area_access_error() behavior. The control flow is very similar in all cases, and we now release the mmap_sem read lock in one single place rather than 3. Text size is reduced by 356 bytes here. Signed-off-by: Michel Lespinasse --- arch/x86/mm/fault.c | 54 ++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git arch/x86/mm/fault.c arch/x86/mm/fault.c index a8ce9e160b72..adbd2b03fcf9 100644 --- arch/x86/mm/fault.c +++ arch/x86/mm/fault.c @@ -919,26 +919,6 @@ bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code, __bad_area_nosemaphore(regs, error_code, address, 0, SEGV_MAPERR); } -static void -__bad_area(struct pt_regs *regs, unsigned long error_code, - unsigned long address, u32 pkey, int si_code) -{ - struct mm_struct *mm = current->mm; - /* - * Something tried to access memory that isn't in our memory map.. - * Fix it, but check if it's kernel or user first.. - */ - mm_read_unlock(mm); - - __bad_area_nosemaphore(regs, error_code, address, pkey, si_code); -} - -static noinline void -bad_area(struct pt_regs *regs, unsigned long error_code, unsigned long address) -{ - __bad_area(regs, error_code, address, 0, SEGV_MAPERR); -} - static inline bool bad_area_access_from_pkeys(unsigned long error_code, struct vm_area_struct *vma) { @@ -957,9 +937,15 @@ static inline bool bad_area_access_from_pkeys(unsigned long error_code, } static noinline void -bad_area_access_error(struct pt_regs *regs, unsigned long error_code, - unsigned long address, struct vm_area_struct *vma) +bad_area(struct pt_regs *regs, unsigned long error_code, + unsigned long address, struct vm_area_struct *vma) { + u32 pkey = 0; + int si_code = SEGV_MAPERR; + + if (!vma) + goto unlock; + /* * This OSPKE check is not strictly necessary at runtime. * But, doing it this way allows compiler optimizations @@ -986,12 +972,20 @@ bad_area_access_error(struct pt_regs *regs, unsigned long error_code, * 6. T1 : reaches here, sees vma_pkey(vma)=5, when we really * faulted on a pte with its pkey=4. */ - u32 pkey = vma_pkey(vma); - - __bad_area(regs, error_code, address, pkey, SEGV_PKUERR); + pkey = vma_pkey(vma); + si_code = SEGV_PKUERR; } else { - __bad_area(regs, error_code, address, 0, SEGV_ACCERR); + si_code = SEGV_ACCERR; } + +unlock: + /* + * Something tried to access memory that isn't in our memory map.. + * Fix it, but check if it's kernel or user first.. + */ + mm_read_unlock(current->mm); + + __bad_area_nosemaphore(regs, error_code, address, pkey, si_code); } static void @@ -1401,17 +1395,17 @@ void do_user_addr_fault(struct pt_regs *regs, vma = find_vma(mm, address); if (unlikely(!vma)) { - bad_area(regs, hw_error_code, address); + bad_area(regs, hw_error_code, address, NULL); return; } if (likely(vma->vm_start <= address)) goto good_area; if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) { - bad_area(regs, hw_error_code, address); + bad_area(regs, hw_error_code, address, NULL); return; } if (unlikely(expand_stack(vma, address))) { - bad_area(regs, hw_error_code, address); + bad_area(regs, hw_error_code, address, NULL); return; } @@ -1421,7 +1415,7 @@ void do_user_addr_fault(struct pt_regs *regs, */ good_area: if (unlikely(access_error(hw_error_code, vma))) { - bad_area_access_error(regs, hw_error_code, address, vma); + bad_area(regs, hw_error_code, address, vma); return; } -- 2.25.0.341.g760bfbb309-goog