Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752793AbdCFIfL (ORCPT ); Mon, 6 Mar 2017 03:35:11 -0500 Received: from foss.arm.com ([217.140.101.70]:58714 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752580AbdCFIfF (ORCPT ); Mon, 6 Mar 2017 03:35:05 -0500 From: Marc Zyngier To: Shanker Donthineni Cc: Christoffer Dall , linux-kernel , linux-arm-kernel , kvmarm , kvm , Will Deacon , Catalin Marinas , Vikram Sethi Subject: Re: [PATCH v2] arm64: kvm: Use has_vhe() instead of hyp_alternate_select() In-Reply-To: <1488767598-2055-1-git-send-email-shankerd@codeaurora.org> (Shanker Donthineni's message of "Sun, 5 Mar 2017 20:33:18 -0600") Organization: ARM Ltd References: <1488767598-2055-1-git-send-email-shankerd@codeaurora.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) Date: Mon, 06 Mar 2017 08:34:00 +0000 Message-ID: <87bmte3itj.fsf@on-the-bus.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2005 Lines: 53 Hi Shanker, On Mon, Mar 06 2017 at 2:33:18 am GMT, Shanker Donthineni wrote: > Now all the cpu_hwcaps features have their own static keys. We don't > need a separate function hyp_alternate_select() to patch the vhe/nvhe > code. We can achieve the same functionality by using has_vhe(). It > improves the code readability, uses the jump label instructions, and > also compiler generates the better code with a fewer instructions. How do you define "better"? Which compiler? Do you have any benchmarking data? > > Signed-off-by: Shanker Donthineni > --- > v2: removed 'Change-Id: Ia8084189833f2081ff13c392deb5070c46a64038' from commit > > arch/arm64/kvm/hyp/debug-sr.c | 12 ++++++---- > arch/arm64/kvm/hyp/switch.c | 50 +++++++++++++++++++----------------------- > arch/arm64/kvm/hyp/sysreg-sr.c | 23 +++++++++---------- > 3 files changed, 43 insertions(+), 42 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/debug-sr.c b/arch/arm64/kvm/hyp/debug-sr.c > index f5154ed..e5642c2 100644 > --- a/arch/arm64/kvm/hyp/debug-sr.c > +++ b/arch/arm64/kvm/hyp/debug-sr.c > @@ -109,9 +109,13 @@ static void __hyp_text __debug_save_spe_nvhe(u64 *pmscr_el1) > dsb(nsh); > } > > -static hyp_alternate_select(__debug_save_spe, > - __debug_save_spe_nvhe, __debug_save_spe_vhe, > - ARM64_HAS_VIRT_HOST_EXTN); > +static void __hyp_text __debug_save_spe(u64 *pmscr_el1) > +{ > + if (has_vhe()) > + __debug_save_spe_vhe(pmscr_el1); > + else > + __debug_save_spe_nvhe(pmscr_el1); > +} I have two worries about this kind of thing: - Not all compilers do support jump labels, leading to a memory access on each static key (GCC 4.8, for example). This would immediately introduce a pretty big regression - The hyp_alternate_select() method doesn't introduce a fast/slow path duality. Each path has the exact same cost. I'm not keen on choosing what is supposed to be the fast path, really. Thanks, M. -- Jazz is not dead, it just smell funny.