Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp254359imm; Tue, 25 Sep 2018 21:00:41 -0700 (PDT) X-Google-Smtp-Source: ACcGV61SOBXemPeSq9+IxhGdriI6SWHFJVXHo2TbBZQZia8rRN5i/qiEyqWze/n5m81Tdqtpqn6U X-Received: by 2002:a17:902:34a:: with SMTP id 68-v6mr4045548pld.39.1537934441116; Tue, 25 Sep 2018 21:00:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537934441; cv=none; d=google.com; s=arc-20160816; b=Q3OVHm5eIDTkirNc7NusG0xQOjKoCPVJK+qUZ2wKtMsaycUJGhQm39+4yVriz+ppNV Hd5ScC7ED4RwaQTi4QoQO+8O94Fyyomk9qp0x4jUi1cYgPBNB62OCEU7FcTSo/66Ndkt wsMu/sdyLdoUeeWSthr9abA93G2SMuRwK6o8kFi+2PwpgeNdI/5Mau7cxrFywyrZz4r8 Rj/8DU6bO20STFmoXdrWAycSUGP9CsA4pNf1PMNTp4UeRs23DzkvAIo7Nc8h/UiJdjw4 0hTFdtujO6Uyvz0WGYMUv+bEm03gj6lPjhZ+XG9ugY16XOOR6mREjY2RqilCIsja9Ye2 NPjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=V1vHC+LyrDNxxiyoxAXjOhv1+oJigzSv7xK3IWGD6lw=; b=kcneIMEoUAjjd5/kdEesjtn9n9DTRkzU58j5UyfHz709xT+/FdlfuP0vBxLXpe+irY nQcQm2Rze5MHtKGMfHsfpnL7Rx+cLrmpq+WEAopZEARjMyDiFccCnu2AqaGuXgbfcb/N mICs7F7k7VrTEVIJ+EpgIiMfV88hUEvJITJsSW3oKF4y6PX7aki9oUZbi6r9u3ChlM1Y +OBiWy4dM1v18oFU0HCvdVTd9vzlW/xZ5Wwjmg9ZLvP2BjP8W5GMTb/5LHemXTTNJZUI 5aNi2YD3R9NdeWH8QTI3G5JoP04dRZhSLQfUQiYMCmH3B15wiyxC3wzysBZ2beTOLZP7 heAA== 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 i3-v6si4291013pld.454.2018.09.25.21.00.25; Tue, 25 Sep 2018 21:00:41 -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 S1726470AbeIZKJx (ORCPT + 99 others); Wed, 26 Sep 2018 06:09:53 -0400 Received: from shelob.surriel.com ([96.67.55.147]:49952 "EHLO shelob.surriel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726377AbeIZKJx (ORCPT ); Wed, 26 Sep 2018 06:09:53 -0400 Received: from imladris.surriel.com ([96.67.55.152]) by shelob.surriel.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1g50yN-0006sG-VE; Tue, 25 Sep 2018 23:58:47 -0400 From: Rik van Riel To: linux-kernel@vger.kernel.org Cc: peterz@infradead.org, kernel-team@fb.com, will.deacon@arm.com, songliubraving@fb.com, mingo@kernel.org, luto@kernel.org, hpa@zytor.com, npiggin@gmail.com, Rik van Riel Subject: [PATCH 5/7] Add freed_tables argument to flush_tlb_mm_range Date: Tue, 25 Sep 2018 23:58:42 -0400 Message-Id: <20180926035844.1420-6-riel@surriel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180926035844.1420-1-riel@surriel.com> References: <20180926035844.1420-1-riel@surriel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add an argument to flush_tlb_mm_range to indicate whether page tables are about to be freed after this TLB flush. This allows for an optimization of flush_tlb_mm_range to skip CPUs in lazy TLB mode. No functional changes. Signed-off-by: Rik van Riel --- arch/x86/include/asm/tlb.h | 2 +- arch/x86/include/asm/tlbflush.h | 10 ++++++---- arch/x86/kernel/ldt.c | 2 +- arch/x86/kernel/vm86_32.c | 2 +- arch/x86/mm/tlb.c | 3 ++- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/tlb.h b/arch/x86/include/asm/tlb.h index afbe7d1e68cf..404b8b1d44f5 100644 --- a/arch/x86/include/asm/tlb.h +++ b/arch/x86/include/asm/tlb.h @@ -20,7 +20,7 @@ static inline void tlb_flush(struct mmu_gather *tlb) end = tlb->end; } - flush_tlb_mm_range(tlb->mm, start, end, stride_shift); + flush_tlb_mm_range(tlb->mm, start, end, stride_shift, tlb->freed_tables); } /* diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index d6c0cd9e9591..1dea9860ce5b 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h @@ -536,22 +536,24 @@ struct flush_tlb_info { #define local_flush_tlb() __flush_tlb() -#define flush_tlb_mm(mm) flush_tlb_mm_range(mm, 0UL, TLB_FLUSH_ALL, 0UL) +#define flush_tlb_mm(mm) \ + flush_tlb_mm_range(mm, 0UL, TLB_FLUSH_ALL, 0UL, true) #define flush_tlb_range(vma, start, end) \ flush_tlb_mm_range((vma)->vm_mm, start, end, \ ((vma)->vm_flags & VM_HUGETLB) \ ? huge_page_shift(hstate_vma(vma)) \ - : PAGE_SHIFT) + : PAGE_SHIFT, false) extern void flush_tlb_all(void); extern void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, - unsigned long end, unsigned int stride_shift); + unsigned long end, unsigned int stride_shift, + bool freed_tables); extern void flush_tlb_kernel_range(unsigned long start, unsigned long end); static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long a) { - flush_tlb_mm_range(vma->vm_mm, a, a + PAGE_SIZE, PAGE_SHIFT); + flush_tlb_mm_range(vma->vm_mm, a, a + PAGE_SIZE, PAGE_SHIFT, false); } void native_flush_tlb_others(const struct cpumask *cpumask, diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c index 733e6ace0fa4..91eae79ef686 100644 --- a/arch/x86/kernel/ldt.c +++ b/arch/x86/kernel/ldt.c @@ -273,7 +273,7 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot) map_ldt_struct_to_user(mm); va = (unsigned long)ldt_slot_va(slot); - flush_tlb_mm_range(mm, va, va + LDT_SLOT_STRIDE, 0); + flush_tlb_mm_range(mm, va, va + LDT_SLOT_STRIDE, 0, false); ldt->slot = slot; return 0; diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index 1c03e4aa6474..91460acbb650 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c @@ -199,7 +199,7 @@ static void mark_screen_rdonly(struct mm_struct *mm) pte_unmap_unlock(pte, ptl); out: up_write(&mm->mmap_sem); - flush_tlb_mm_range(mm, 0xA0000, 0xA0000 + 32*PAGE_SIZE, 0UL); + flush_tlb_mm_range(mm, 0xA0000, 0xA0000 + 32*PAGE_SIZE, 0UL, false); } diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 1224f7fb1311..1d74fbc71ad6 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -611,7 +611,8 @@ void native_flush_tlb_others(const struct cpumask *cpumask, static unsigned long tlb_single_page_flush_ceiling __read_mostly = 33; void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, - unsigned long end, unsigned int stride_shift) + unsigned long end, unsigned int stride_shift, + bool freed_tables) { int cpu; -- 2.17.1