Received: by 10.223.176.5 with SMTP id f5csp10464wra; Tue, 6 Feb 2018 16:04:49 -0800 (PST) X-Google-Smtp-Source: AH8x225G8cCDLhSbRY8Wd4lDP5GV+dVUmFgQKjMVEH0H4WO7mdaTfj8Z0U3EdhGU25CN/e+Udhl6 X-Received: by 10.98.67.138 with SMTP id l10mr4024148pfi.72.1517961889612; Tue, 06 Feb 2018 16:04:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517961889; cv=none; d=google.com; s=arc-20160816; b=WI+iaXFJpUcTvfXG7G+vVIfOIK6UOjo4yZrvUTAJa3BHVnGlZ6AhrQbOFjbBgEcXQz bjBmKeNp5/OJGGxu2+CKB6JUFDWoDyNOusQnMScS5MdjZoYh+DGwk8BG2sgykKbNSEyy XK5X43s4A7IZSikVOtJA0nM5eupZNUVZwKItRmvzYbGk7JkM12t3GkTd0vlCAUqqL6TK GFN+Oy33rCIn+2VGGVkFR27UjJu7nyIWI4aXPlLkpwDWwcDeDqv198n+U5qOpK90YnEs McIJxA6FKXuRYU7zpW80fnUOR22UFGwBCukH6r3VUvU0KhaefDXBk2g+f5io6prG0UQk YMZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature:arc-authentication-results; bh=nRkoEyNv+vZXQzM2ZW9l26Kqxwsqv1gxUsiYRUPQbR4=; b=ylrFZ+0TOwpmkbcgQBt3Px6MDauxKklZIwoqklg6936amZA3R9JRF9L5VShDHBb+Eu EPHQZvF1xVJYfkOal1uNgcloWjaC8Cz2e+ZAYWQQs7qEqAIP43KF1MtBCYjLmhqH80tL l2s9O6LVBzlochoi0KmCHXcXmaUNBVsiYyxbCP6PVRvQPyuJ7nTRP+zaID2iGQauPLOV wnZ8igIuMwjdeJeiM8kmHrkk+wNU08fyzlgdc7ps+PjUHt0jmHJTbeV0IINh+0Zeyirc WgXKJHc7r5kEwfxFcGjptSXW6HTv3nnlriyIZ3QTfH/7/JU7qaxG6o7mSrYA02drD94i LrXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amazon.co.uk header.s=amazon201209 header.b=Smf1sUKr; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.co.uk Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s14si123502pgc.718.2018.02.06.16.04.32; Tue, 06 Feb 2018 16:04:49 -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; dkim=pass header.i=@amazon.co.uk header.s=amazon201209 header.b=Smf1sUKr; 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=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=amazon.co.uk Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932168AbeBGADr (ORCPT + 99 others); Tue, 6 Feb 2018 19:03:47 -0500 Received: from smtp-fw-6002.amazon.com ([52.95.49.90]:60349 "EHLO smtp-fw-6002.amazon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932153AbeBGADn (ORCPT ); Tue, 6 Feb 2018 19:03:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.co.uk; i=@amazon.co.uk; q=dns/txt; s=amazon201209; t=1517961823; x=1549497823; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nRkoEyNv+vZXQzM2ZW9l26Kqxwsqv1gxUsiYRUPQbR4=; b=Smf1sUKrQU1aCweOtjZsoQwdpeveDVHT7m5ZailxYmB0NGZ4iJcvskx1 wfROy4gzcBh6T0ag5INIlNd6B8Wq+5SJn4wyDrYF7SwLPPfFKbV5k8l6H Jfu7XuvLEuP6/OnmKBsIAaiMDGLPpcHTgt/rqfLOgeyOuquHV5A9WCDzo c=; X-IronPort-AV: E=Sophos;i="5.46,470,1511827200"; d="scan'208";a="331027616" Received: from iad6-co-svc-p1-lb1-vlan3.amazon.com (HELO email-inbound-relay-1e-c7c08562.us-east-1.amazon.com) ([10.124.125.6]) by smtp-border-fw-out-6002.iad6.amazon.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 07 Feb 2018 00:03:42 +0000 Received: from uc8d3ff76b9bc5848a9cc.ant.amazon.com (iad1-ws-svc-lb91-vlan2.amazon.com [10.0.103.146]) by email-inbound-relay-1e-c7c08562.us-east-1.amazon.com (8.14.7/8.14.7) with ESMTP id w1703am4086838 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 7 Feb 2018 00:03:38 GMT Received: from uc8d3ff76b9bc5848a9cc.ant.amazon.com (localhost [127.0.0.1]) by uc8d3ff76b9bc5848a9cc.ant.amazon.com (8.15.2/8.15.2/Debian-3) with ESMTP id w1703UUq015510; Wed, 7 Feb 2018 00:03:30 GMT Received: (from dwmw@localhost) by uc8d3ff76b9bc5848a9cc.ant.amazon.com (8.15.2/8.15.2/Submit) id w1703UF5015509; Wed, 7 Feb 2018 00:03:30 GMT From: David Woodhouse To: tglx@linutronix.de, torvalds@linux-foundation.org, x86@kernel.org, linux-kernel@vger.kernel.org, bp@alien8.de, peterz@infradead.org, tim.c.chen@linux.intel.com, dave.hansen@intel.com, arjan.van.de.ven@intel.com Subject: [RFC PATCH 2/4] KVM: x86: Reduce retpoline performance impact in slot_handle_level_range() Date: Wed, 7 Feb 2018 00:03:12 +0000 Message-Id: <1517961794-14972-3-git-send-email-dwmw@amazon.co.uk> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1517961794-14972-1-git-send-email-dwmw@amazon.co.uk> References: <1517961794-14972-1-git-send-email-dwmw@amazon.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With retpoline, tight loops of "call this function for every XXX" are very much pessimised by taking a prediction miss *every* time. This one showed up very high in our early testing. By marking the iterator slot_handle_…() functions always_inline, we can ensure that the indirect function call can be optimised away into a direct call and it actually generates slightly smaller code because some of the other conditionals can get optimised away too. Suggested-by: Linus Torvalds Signed-off-by: David Woodhouse --- arch/x86/kvm/mmu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 2b8eb4d..cc83bdc 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -5058,7 +5058,7 @@ void kvm_mmu_uninit_vm(struct kvm *kvm) typedef bool (*slot_level_handler) (struct kvm *kvm, struct kvm_rmap_head *rmap_head); /* The caller should hold mmu-lock before calling this function. */ -static bool +static __always_inline bool slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_level_handler fn, int start_level, int end_level, gfn_t start_gfn, gfn_t end_gfn, bool lock_flush_tlb) @@ -5088,7 +5088,7 @@ slot_handle_level_range(struct kvm *kvm, struct kvm_memory_slot *memslot, return flush; } -static bool +static __always_inline bool slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_level_handler fn, int start_level, int end_level, bool lock_flush_tlb) @@ -5099,7 +5099,7 @@ slot_handle_level(struct kvm *kvm, struct kvm_memory_slot *memslot, lock_flush_tlb); } -static bool +static __always_inline bool slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_level_handler fn, bool lock_flush_tlb) { @@ -5107,7 +5107,7 @@ slot_handle_all_level(struct kvm *kvm, struct kvm_memory_slot *memslot, PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); } -static bool +static __always_inline bool slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_level_handler fn, bool lock_flush_tlb) { @@ -5115,7 +5115,7 @@ slot_handle_large_level(struct kvm *kvm, struct kvm_memory_slot *memslot, PT_MAX_HUGEPAGE_LEVEL, lock_flush_tlb); } -static bool +static __always_inline bool slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot, slot_level_handler fn, bool lock_flush_tlb) { -- 2.7.4