Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp2458116imm; Thu, 9 Aug 2018 13:19:09 -0700 (PDT) X-Google-Smtp-Source: AA+uWPyRvyIc1vDXX7yEXLhcPMnWRXbn+AZj+fezpO3b+Q6JLu+pHLKbLLBlb1BPGgHiPG2lM4XX X-Received: by 2002:a65:4888:: with SMTP id n8-v6mr3538965pgs.149.1533845948993; Thu, 09 Aug 2018 13:19:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1533845948; cv=none; d=google.com; s=arc-20160816; b=t9Xu7ihQWrEaVA5iXE0fV5o3F9fcr76FGUu4TQa7aQC/wCJtSkC5+/PsvJlqGKZpol BMPDuK11GBaJOf68JjU3b/lemmfcbiSqmduoT1/Md+ett3muUIhh7YqIvwvinx3CgasT HTSzF+Fv+uG4P+cRDp0mbyfK+vItj97gxlQIvL6gEBAAP2Kp3rPo8ly5bFfAUf0z8Mq5 oi6fyAYg111qPqPetvfDeFwYNrKOopiq5sFKed4DYAWxW5ujDacg//lZYJAkpdr+eXwo ZQDTh4q2oIcXcAQVPGCE25qTFjfGWKzkVNXXsSiD3tDc2eJt2Rhfpiunt/4LlaSZkA04 /KRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=/Umw21zYTaFZSQ3+JwiCAjT4RywGNKvmm+sgSd2qIhg=; b=k/7TTxD1zg/INUA28X3CvKxEDhKMTAAbhKkwElu9mAbS6HjYSb3suK2r+so/ZeY+4M AP3DVxvSMQxbqVJOOU+XwSNtTn2n0ixMkZoIQKQYdgmMIu8wSzPah80IpZRKrnb03Xvu LdrfJq7jYJvX9kMy+v0vrJ9VPSQL63H/ZvnMgRNuCckvtIXaEdTe8RiYnuXprYjA6xQA ClHa9TTg2jP6Rj6qHHrqQzbfiRMW/MvluNPc3z9C3SEQBkbf2qhseG9ZcTHQ05EKqmQ2 52a3ZmRD2WgAy5BEw3eT6QmX9Q39oX8yRkEILxAZ3Ik+8PJMAAjMBYjLhvwrx3jvwSlB JsTQ== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f10-v6si7062496pfn.85.2018.08.09.13.18.52; Thu, 09 Aug 2018 13:19:08 -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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vmware.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727334AbeHIWoJ (ORCPT + 99 others); Thu, 9 Aug 2018 18:44:09 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:15158 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726894AbeHIWoI (ORCPT ); Thu, 9 Aug 2018 18:44:08 -0400 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; Thu, 9 Aug 2018 13:17:20 -0700 Received: from sc2-haas01-esx0118.eng.vmware.com (sc2-haas01-esx0118.eng.vmware.com [10.172.44.118]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id C0D9E406E7; Thu, 9 Aug 2018 13:17:37 -0700 (PDT) From: Nadav Amit To: Ingo Molnar CC: , Peter Zijlstra , Thomas Gleixner , , Nadav Amit , Alok Kataria , "H. Peter Anvin" , Subject: [PATCH v7 07/10] x86: prevent inline distortion by paravirt ops Date: Thu, 9 Aug 2018 13:15:50 -0700 Message-ID: <20180809201554.168804-8-namit@vmware.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180809201554.168804-1-namit@vmware.com> References: <20180809201554.168804-1-namit@vmware.com> 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 GCC considers the number of statements in inlined assembly blocks, according to new-lines and semicolons, as an indication to the cost of the block in time and space. This data is distorted by the kernel code, which puts information in alternative sections. As a result, the compiler may perform incorrect inlining and branch optimizations. The solution is to set an assembly macro and call it from the inlined assembly block. As a result GCC considers the inline assembly block as a single instruction. The effect of the patch is a more aggressive inlining, which also causes a size increase of kernel. text data bss dec hex filename 18147336 10226688 2957312 31331336 1de1408 ./vmlinux before 18162555 10226288 2957312 31346155 1de4deb ./vmlinux after (+14819) Static text symbols: Before: 40053 After: 39942 (-111) Cc: Alok Kataria Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: x86@kernel.org Cc: virtualization@lists.linux-foundation.org Acked-by: Peter Zijlstra (Intel) Reviewed-by: Juergen Gross Signed-off-by: Nadav Amit --- arch/x86/include/asm/paravirt_types.h | 56 +++++++++++++-------------- arch/x86/kernel/macros.S | 1 + 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 180bc0bff0fb..dd55d3d1c32a 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -343,23 +343,11 @@ extern struct pv_lock_ops pv_lock_ops; #define paravirt_clobber(clobber) \ [paravirt_clobber] "i" (clobber) -/* - * Generate some code, and mark it as patchable by the - * apply_paravirt() alternate instruction patcher. - */ -#define _paravirt_alt(insn_string, type, clobber) \ - "771:\n\t" insn_string "\n" "772:\n" \ - ".pushsection .parainstructions,\"a\"\n" \ - _ASM_ALIGN "\n" \ - _ASM_PTR " 771b\n" \ - " .byte " type "\n" \ - " .byte 772b-771b\n" \ - " .short " clobber "\n" \ - ".popsection\n" - /* Generate patchable code, with the default asm parameters. */ -#define paravirt_alt(insn_string) \ - _paravirt_alt(insn_string, "%c[paravirt_typenum]", "%c[paravirt_clobber]") +#define paravirt_call \ + "PARAVIRT_CALL type=\"%c[paravirt_typenum]\"" \ + " clobber=\"%c[paravirt_clobber]\"" \ + " pv_opptr=\"%c[paravirt_opptr]\";" /* Simple instruction patching code. */ #define NATIVE_LABEL(a,x,b) "\n\t.globl " a #x "_" #b "\n" a #x "_" #b ":\n\t" @@ -387,16 +375,6 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf, int paravirt_disable_iospace(void); -/* - * This generates an indirect call based on the operation type number. - * The type number, computed in PARAVIRT_PATCH, is derived from the - * offset into the paravirt_patch_template structure, and can therefore be - * freely converted back into a structure offset. - */ -#define PARAVIRT_CALL \ - ANNOTATE_RETPOLINE_SAFE \ - "call *%c[paravirt_opptr];" - /* * These macros are intended to wrap calls through one of the paravirt * ops structs, so that they can be later identified and patched at @@ -534,7 +512,7 @@ int paravirt_disable_iospace(void); /* since this condition will never hold */ \ if (sizeof(rettype) > sizeof(unsigned long)) { \ asm volatile(pre \ - paravirt_alt(PARAVIRT_CALL) \ + paravirt_call \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ @@ -544,7 +522,7 @@ int paravirt_disable_iospace(void); __ret = (rettype)((((u64)__edx) << 32) | __eax); \ } else { \ asm volatile(pre \ - paravirt_alt(PARAVIRT_CALL) \ + paravirt_call \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ @@ -571,7 +549,7 @@ int paravirt_disable_iospace(void); PVOP_VCALL_ARGS; \ PVOP_TEST_NULL(op); \ asm volatile(pre \ - paravirt_alt(PARAVIRT_CALL) \ + paravirt_call \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ @@ -691,6 +669,26 @@ struct paravirt_patch_site { extern struct paravirt_patch_site __parainstructions[], __parainstructions_end[]; +#else /* __ASSEMBLY__ */ + +/* + * This generates an indirect call based on the operation type number. + * The type number, computed in PARAVIRT_PATCH, is derived from the + * offset into the paravirt_patch_template structure, and can therefore be + * freely converted back into a structure offset. + */ +.macro PARAVIRT_CALL type:req clobber:req pv_opptr:req +771: ANNOTATE_RETPOLINE_SAFE + call *\pv_opptr +772: .pushsection .parainstructions,"a" + _ASM_ALIGN + _ASM_PTR 771b + .byte \type + .byte 772b-771b + .short \clobber + .popsection +.endm + #endif /* __ASSEMBLY__ */ #endif /* _ASM_X86_PARAVIRT_TYPES_H */ diff --git a/arch/x86/kernel/macros.S b/arch/x86/kernel/macros.S index 66ccb8e823b1..71d8b716b111 100644 --- a/arch/x86/kernel/macros.S +++ b/arch/x86/kernel/macros.S @@ -10,3 +10,4 @@ #include #include #include +#include -- 2.17.1