Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1140778imm; Tue, 15 May 2018 14:31:10 -0700 (PDT) X-Google-Smtp-Source: AB8JxZruhLgckbQhtqnsCkpMqfyuVwONLNelxnEmbKBmTxUa1zIrLB7suT2XgLlGtuIpBt5cleaa X-Received: by 2002:a62:8b92:: with SMTP id e18-v6mr16777141pfl.60.1526419870499; Tue, 15 May 2018 14:31:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526419870; cv=none; d=google.com; s=arc-20160816; b=DqDAufu8DWnGriagGK2yM584Jm8Gxge5ByjxczblBmRrsYcKoEZ0Ui0F5AGqnTw84C qfrOEbMj8B3cZZCP0WfjnstfV5b+Gr0QztaDMCm0kNViq+bqxn/t8W63L2W9GdBMUt1N 2znmRHB9p86r43lRuozketmn/VSUKEm1sq6H76RY+Tcjt7i3IvdtSHaaAUR9JvVe3jGA DKydOsPdz929kgQgjhTVzcVw+NLiXT/6y9XcGjjb7T8l8eAdFhALyQW7g1lP1/DE1P7G J8YZdxjKSeDyciTusja93pgvo5NFoZTeaejcYH7TLBXrKcx3HfnEdfEK8+fjgZK2xf2b pNyQ== 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=x5YouCY6vjA6iYwnorNLz5B5lbGMDnBo7I3hZKCxdAM=; b=gaLt2b7sgs0YSvrY/hZFfiwTd8MY/0/0XGoEOLllLH1Qp3wwcwMccezHYBmklbKhi6 72vxOgeV5L9gDHYpHzmDr3HoHlmhTUgo5YhXQE/5aA0VzNP+t1zHQo+hJHCNBwqzu/W2 uAjJoPj+R4JYXhOba05JhFLv4HGKs1Ps4RpHPfbY6M+N49eL7vBsIk6O1UpUicjyh23d O8vL0HQLXSywXsqFUp3GQZQQ8V0ec7uwXkr/BpuTooAgpkQwV6n96HWM/7NSUqJNeSQw /b6mDnAe5VXyzzhSUHVZq/eWRu1VFi3ORCx4rwvHWq1wb5ZAU7bYpNZGjvrV4mzWEpbA Kopw== 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 q127-v6si746259pga.71.2018.05.15.14.30.56; Tue, 15 May 2018 14:31:10 -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 S1752617AbeEOVaP (ORCPT + 99 others); Tue, 15 May 2018 17:30:15 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:48538 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752411AbeEOV0L (ORCPT ); Tue, 15 May 2018 17:26:11 -0400 Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Tue, 15 May 2018 14:25:46 -0700 Received: from sc2-haas01-esx0118.eng.vmware.com (sc2-haas01-esx0118.eng.vmware.com [10.172.44.118]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id D9384B079A; Tue, 15 May 2018 14:26:10 -0700 (PDT) From: Nadav Amit To: CC: , Nadav Amit , Juergen Gross , Alok Kataria , Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , , Subject: [RFC 4/8] x86: prevent inline distortion by paravirt ops Date: Tue, 15 May 2018 07:11:11 -0700 Message-ID: <20180515141124.84254-5-namit@vmware.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180515141124.84254-1-namit@vmware.com> References: <20180515141124.84254-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 18131468 10068488 2936832 31136788 1db1c14 ./vmlinux before 18146418 10064100 2936832 31147350 1db4556 ./vmlinux after (+10562) Static text symbols: Before: 39788 After: 39673 (-115) Cc: Juergen Gross Cc: Alok Kataria Cc: Thomas Gleixner Cc: Ingo Molnar Cc: "H. Peter Anvin" Cc: x86@kernel.org Cc: virtualization@lists.linux-foundation.org Signed-off-by: Nadav Amit --- arch/x86/include/asm/paravirt_types.h | 53 +++++++++++++++------------ 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h index 180bc0bff0fb..3fe99dab8266 100644 --- a/arch/x86/include/asm/paravirt_types.h +++ b/arch/x86/include/asm/paravirt_types.h @@ -346,20 +346,37 @@ extern struct pv_lock_ops pv_lock_ops; /* * Generate some code, and mark it as patchable by the * apply_paravirt() alternate instruction patcher. + * + * 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_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" \ + +asm ("\n" + ".macro __paravirt_alt type:req clobber:req pv_opptr:req\n" + "771:\n\t" + ANNOTATE_RETPOLINE_SAFE "\n\t" + "call *\\pv_opptr\n" + "772:\n\t" + ".pushsection .parainstructions,\"a\"\n\t" + _ASM_ALIGN "\n\t" + _ASM_PTR " 771b\n\t" + ".byte \\type\n\t" + ".byte 772b-771b\n\t" + ".short \\clobber\n\t" ".popsection\n" + ".endm"); + +#define _paravirt_alt(type, clobber, pv_opptr) \ + "__paravirt_alt type=" __stringify(type) \ + " clobber=" __stringify(clobber) \ + " pv_opptr=" __stringify(pv_opptr) "\n\t" /* 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_alt \ + _paravirt_alt("%c[paravirt_typenum]", "%c[paravirt_clobber]", \ + "%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 +404,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 +541,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_alt \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ @@ -544,7 +551,7 @@ int paravirt_disable_iospace(void); __ret = (rettype)((((u64)__edx) << 32) | __eax); \ } else { \ asm volatile(pre \ - paravirt_alt(PARAVIRT_CALL) \ + paravirt_alt \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ @@ -571,7 +578,7 @@ int paravirt_disable_iospace(void); PVOP_VCALL_ARGS; \ PVOP_TEST_NULL(op); \ asm volatile(pre \ - paravirt_alt(PARAVIRT_CALL) \ + paravirt_alt \ post \ : call_clbr, ASM_CALL_CONSTRAINT \ : paravirt_type(op), \ -- 2.17.0