Received: by 10.223.176.5 with SMTP id f5csp1828258wra; Wed, 31 Jan 2018 12:14:02 -0800 (PST) X-Google-Smtp-Source: AH8x225jbKFRYVWkV2IBjMR87/cQ5diIZUeZL5ITCi11KOVtdTe4YpJmk/3N0HAKR+caQRlF2Wt3 X-Received: by 10.101.70.15 with SMTP id v15mr27277485pgq.327.1517429642871; Wed, 31 Jan 2018 12:14:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517429642; cv=none; d=google.com; s=arc-20160816; b=AfJCnBuJRS67r8+cXzxK1tMCjHcdTEhQbN0ayj+HQ5+BfH9wWy4I4J5j1cmvV44TfE ObITmndaH8IHhDqRoTwifF27XbxWr6crBt3lAuFlBdFyhhMkvpemt1lI/RqN2733ic4g k/RjsFFLtNFteswK7pHHF3l173ufwXfCdtrm3mESk+SgBODMGfGe5Wa57fz72A0bjUoa CL8QkqECIJqznSGbDx001nkOe0f0l/t7ZIUiGtKilEBxQ8hABPABSEBEgvKr3hjpVdze BQMXNyBjmZsrQIi2yfrwVaAJb7mR1YfmkcMzOp8QaXfvwr3sqk/U8akcdBts22L4m21l wA6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=WtyC6TBzgOQX9pXfxlAaPSbJfcmT2a1hlfBl2Wk1Q44=; b=WvkjOGfFh+8XyV+lI+njSNjPGhryr7gNRJnvzuPcNpOjhyQoL/kA+9FJHRQn4u2otZ nRn+6zcFE9kVNTO5oJBhOD8gvpEe40wHXR6WjnePxQq6/28m01LVQVmOe4Z+oqylqpTG tSn9aUXD4wyeCfEELmPTY8Goy/tXjOK4PzPyvv7rLPOSC9fxh0frTIwIgkCJxz0Q4ZBU QqpCcR0zN4zTwRVcEJN9NU2RqN0LA6joGaqpT1dw0z4DBNfGMrw97P+tdYBBSaz9S8+M VAujMUyivdFkAFY3D/kR8DTm4N2OZJt8dCtaQUTKQWO6u27auNR7VLLrTcL/IOLWZE5N 47lw== 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 p71si318409pfl.404.2018.01.31.12.13.47; Wed, 31 Jan 2018 12:14:02 -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; 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 S1751569AbeAaULf (ORCPT + 99 others); Wed, 31 Jan 2018 15:11:35 -0500 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:44946 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751296AbeAaULe (ORCPT ); Wed, 31 Jan 2018 15:11:34 -0500 Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Wed, 31 Jan 2018 12:11:29 -0800 Received: from ubuntu.localdomain (unknown [10.2.101.129]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id AE51A40C4F; Wed, 31 Jan 2018 12:11:33 -0800 (PST) From: Nadav Amit To: CC: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , , Peter Zijlstra , Nadav Amit , Nadav Amit , Andy Lutomirski , Dave Hansen Subject: [PATCH] x86: Align TLB invalidation info Date: Wed, 31 Jan 2018 12:11:18 -0800 Message-ID: <20180131201118.1694-1-namit@vmware.com> X-Mailer: git-send-email 2.14.1 MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-001.vmware.com: namit@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The TLB invalidation info is allocated on the stack, which might cause it to be unaligned. Since this information may be transferred to different cores for TLB shootdown, this might result in an additional cache-line bouncing between the cores. GCC provides a way to deal with it by using __builtin_alloca_with_align(). Use it to avoid the bouncing cache lines. Signed-off-by: Nadav Amit Cc: Andy Lutomirski Cc: Dave Hansen --- arch/x86/mm/tlb.c | 21 +++++++++++---------- include/linux/compiler-gcc.h | 5 +++++ include/linux/compiler_types.h | 4 ++++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 5bfe61a5e8e3..bab7bb5d982f 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c @@ -574,37 +574,38 @@ 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 long vmflag) { + struct flush_tlb_info *info; int cpu; - struct flush_tlb_info info = { - .mm = mm, - }; + info = __alloca_with_align(sizeof(*info), + SMP_CACHE_BYTES * BITS_PER_BYTE); + info->mm = mm; cpu = get_cpu(); /* This is also a barrier that synchronizes with switch_mm(). */ - info.new_tlb_gen = inc_mm_tlb_gen(mm); + info->new_tlb_gen = inc_mm_tlb_gen(mm); /* Should we flush just the requested range? */ if ((end != TLB_FLUSH_ALL) && !(vmflag & VM_HUGETLB) && ((end - start) >> PAGE_SHIFT) <= tlb_single_page_flush_ceiling) { - info.start = start; - info.end = end; + info->start = start; + info->end = end; } else { - info.start = 0UL; - info.end = TLB_FLUSH_ALL; + info->start = 0UL; + info->end = TLB_FLUSH_ALL; } if (mm == this_cpu_read(cpu_tlbstate.loaded_mm)) { VM_WARN_ON(irqs_disabled()); local_irq_disable(); - flush_tlb_func_local(&info, TLB_LOCAL_MM_SHOOTDOWN); + flush_tlb_func_local(info, TLB_LOCAL_MM_SHOOTDOWN); local_irq_enable(); } if (cpumask_any_but(mm_cpumask(mm), cpu) < nr_cpu_ids) - flush_tlb_others(mm_cpumask(mm), &info); + flush_tlb_others(mm_cpumask(mm), info); put_cpu(); } diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 631354acfa72..aea9a2e69417 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -314,6 +314,11 @@ #define __designated_init __attribute__((designated_init)) #endif +#if GCC_VERSION >= 60100 +#define __alloca_with_align(size, alignment) \ + __builtin_alloca_with_align(size, alignment) +#endif + #endif /* gcc version >= 40000 specific checks */ #if !defined(__noclone) diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h index 6b79a9bba9a7..c71297d95c74 100644 --- a/include/linux/compiler_types.h +++ b/include/linux/compiler_types.h @@ -271,4 +271,8 @@ struct ftrace_likely_data { # define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) #endif +#ifndef __alloca_with_align +#define __alloca_with_align(size, alignment) __builtin_alloca(size) +#endif + #endif /* __LINUX_COMPILER_TYPES_H */ -- 2.14.1