From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D20EC64E7B for ; Wed, 2 Dec 2020 17:28:49 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 331E922260 for ; Wed, 2 Dec 2020 17:28:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 331E922260 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=QBlKRJi9UBg7YP6APTpKgSB2wB4grR6d0t6XbXE3Xg4=; b=rokbyGgrRAolrzOnPTlu22HVN kPRgLZASlmWqOWEDCMqUOV64nQupZtnBRb2lceeslzAKgX4TRbl4qwT68LCiSfZi5Y78beOiuqXLw wkUczpXqzyf0ZKhzkzhRqMHlMx10/jC7LLWh2OGwqvGEzsbQM5qsYbyCQp7zCASvt6EX12bOW8QQv yXfAG4ef5rDKlrkO/mkwZOx91wor84otWUNzwzjjnR1JvChtuxvWFzzl5ieX7apuAsSqiOOipIItF efgNUwJBLxYLaUPkccsl6ZcPvnqn1pZ9iQev/KarOm4YxFa7XeTk1bYULR1N3voqfjTNQCVZZLy1J 2rcvAf5rQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kkVup-0002uw-Ez; Wed, 02 Dec 2020 17:27:43 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kkVuh-0002r9-Ko for linux-arm-kernel@lists.infradead.org; Wed, 02 Dec 2020 17:27:37 +0000 Date: Wed, 2 Dec 2020 17:27:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1606930054; bh=ENrxk1To+GUgkJDSxzLowk/dPdrvaLx21Q/VS2M3IfU=; h=From:To:Cc:Subject:References:In-Reply-To:From; b=wlJR4iDNLLjYRaIRy0/SpTdBq3VcPMWEgXPncNp3x9rYxTlbC4I1gw5svpY/IizFb YEg3UC4s9AXZdk6Ls1xvjn7SBkc2F46ZuYPWmc7fvMxU8cgXgwm7oFxmVGalZV2NwH BzDoQgP9AVDzPcplUW1y6rbQyHNRZvnNsVCg6hQQ= From: Will Deacon To: Marc Zyngier Subject: Re: [PATCH v4 03/14] KVM: arm64: Kill 32-bit vCPUs on systems with mismatched EL0 support Message-ID: <20201202172727.GC29813@willie-the-truck> References: <20201124155039.13804-1-will@kernel.org> <20201124155039.13804-4-will@kernel.org> <9bd06b193e7fb859a1207bb1302b7597@kernel.org> <20201127115304.GB20564@willie-the-truck> <583c4074bbd4cf8b8085037745a5d1c0@kernel.org> <20201127172434.GA984327@google.com> <9de8639549040b4478b312503fd5a23f@kernel.org> <20201201165707.GF27783@willie-the-truck> <5e59a8f5bc84403ce2c8f26aa874cb1b@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <5e59a8f5bc84403ce2c8f26aa874cb1b@kernel.org> User-Agent: Mutt/1.10.1 (2018-07-13) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201202_122735_891143_C41AC04C X-CRM114-Status: GOOD ( 28.21 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arch@vger.kernel.org, Juri Lelli , kernel-team@android.com, Vincent Guittot , Quentin Perret , Peter Zijlstra , Catalin Marinas , Johannes Weiner , linux-kernel@vger.kernel.org, Qais Yousef , Ingo Molnar , Li Zefan , Greg Kroah-Hartman , Tejun Heo , Suren Baghdasaryan , Morten Rasmussen , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Wed, Dec 02, 2020 at 08:18:03AM +0000, Marc Zyngier wrote: > On 2020-12-01 16:57, Will Deacon wrote: > > On Fri, Nov 27, 2020 at 06:16:35PM +0000, Marc Zyngier wrote: > > > On 2020-11-27 17:24, Quentin Perret wrote: > > > > On Friday 27 Nov 2020 at 17:14:11 (+0000), Marc Zyngier wrote: > > > > > > [...] > > > > > > > > Yeah, the sanitized read feels better, if only because that is > > > > > what we are going to read in all the valid cases, unfortunately. > > > > > read_sanitised_ftr_reg() is sadly not designed to be called on > > > > > a fast path, meaning that 32bit guests will do a bsearch() on > > > > > the ID-regs every time they exit... > > > > > > > > > > I guess we will have to evaluate how much we loose with this. > > > > > > > > Could we use the trick we have for arm64_ftr_reg_ctrel0 to speed this > > > > up? > > > > > > Maybe. I want to first verify whether this has any measurable impact. > > > Another possibility would be to cache the last > > > read_sanitised_ftr_reg() > > > access, just to see if that helps. There shouldn't be that many code > > > paths hammering it. > > > > We don't have huge numbers of ID registers, so the bsearch shouldn't be > > too expensive. However, I'd like to remind myself why we can't index > > into > > the feature register array directly as we _should_ know all of this > > stuff > > at compile time, right? > > Simply because it's not indexed by ID reg. It's just an ordered collection, > similar to the for sys_reg emulation in KVM. You can compute the index > ahead of time, but just not at compile time. At least not with the > way the arm64_ftr_regs array is built. FWIW, if your testing shows that the bsearch() is costing us, I've hacked up an interface to access the ID registers directly (see below) which I can include with this series. Will --->8 diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index da250e4741bd..23766104d756 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h @@ -599,7 +599,49 @@ static inline bool id_aa64pfr0_sve(u64 pfr0) void __init setup_cpu_features(void); void check_local_cpu_capabilities(void); +#define ARM64_FTR_REG2IDX(id) id ## _IDX +enum arm64_ftr_reg_idx { + ARM64_FTR_REG2IDX(SYS_ID_PFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_PFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_DFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR2_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR3_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR2_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR3_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR4_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR5_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR4_EL1), + ARM64_FTR_REG2IDX(SYS_ID_ISAR6_EL1), + ARM64_FTR_REG2IDX(SYS_MVFR0_EL1), + ARM64_FTR_REG2IDX(SYS_MVFR1_EL1), + ARM64_FTR_REG2IDX(SYS_MVFR2_EL1), + ARM64_FTR_REG2IDX(SYS_ID_PFR2_EL1), + ARM64_FTR_REG2IDX(SYS_ID_DFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_MMFR5_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64PFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64PFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64ZFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64DFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64DFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64ISAR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64ISAR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64MMFR0_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64MMFR1_EL1), + ARM64_FTR_REG2IDX(SYS_ID_AA64MMFR2_EL1), + ARM64_FTR_REG2IDX(SYS_ZCR_EL1), + ARM64_FTR_REG2IDX(SYS_CTR_EL0), + ARM64_FTR_REG2IDX(SYS_DCZID_EL0), + ARM64_FTR_REG2IDX(SYS_CNTFRQ_EL0), + + ARM64_FTR_REG_IDX_MAX, +}; + u64 read_sanitised_ftr_reg(u32 id); +u64 read_sanitised_ftr_reg_by_idx(enum arm64_ftr_reg_idx idx); static inline bool cpu_supports_mixed_endian_el0(void) { diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index 6f36c4f62f69..05223352db5d 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -546,16 +546,18 @@ static const struct arm64_ftr_bits ftr_raz[] = { ARM64_FTR_END, }; -#define ARM64_FTR_REG(id, table) { \ - .sys_id = id, \ - .reg = &(struct arm64_ftr_reg){ \ - .name = #id, \ - .ftr_bits = &((table)[0]), \ - }} +#define ARM64_FTR_REG(id, table) \ + [id ## _IDX] = { \ + .sys_id = id, \ + .reg = &(struct arm64_ftr_reg) { \ + .name = #id, \ + .ftr_bits = &((table)[0]), \ + } \ + } static const struct __ftr_reg_entry { u32 sys_id; - struct arm64_ftr_reg *reg; + struct arm64_ftr_reg *reg; } arm64_ftr_regs[] = { /* Op1 = 0, CRn = 0, CRm = 1 */ @@ -607,7 +609,7 @@ static const struct __ftr_reg_entry { ARM64_FTR_REG(SYS_ZCR_EL1, ftr_zcr), /* Op1 = 3, CRn = 0, CRm = 0 */ - { SYS_CTR_EL0, &arm64_ftr_reg_ctrel0 }, + [ARM64_FTR_REG2IDX(SYS_CTR_EL0)] = { SYS_CTR_EL0, &arm64_ftr_reg_ctrel0 }, ARM64_FTR_REG(SYS_DCZID_EL0, ftr_dczid), /* Op1 = 3, CRn = 14, CRm = 0 */ @@ -1116,6 +1118,18 @@ u64 read_sanitised_ftr_reg(u32 id) } EXPORT_SYMBOL_GPL(read_sanitised_ftr_reg); +u64 read_sanitised_ftr_reg_by_idx(enum arm64_ftr_reg_idx idx) +{ + struct arm64_ftr_reg *regp; + + if (WARN_ON((unsigned)idx >= ARM64_FTR_REG_IDX_MAX)) + return 0; + + regp = arm64_ftr_regs[idx].reg; + return regp->sys_val; +} +EXPORT_SYMBOL_GPL(read_sanitised_ftr_reg_by_idx); + #define read_sysreg_case(r) \ case r: return read_sysreg_s(r) -- 2.29.2.576.ga3fc446d84-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel