Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp1732719rwb; Wed, 5 Oct 2022 04:07:16 -0700 (PDT) X-Google-Smtp-Source: AMsMyM48gKCZ/wJ8ORIgAgamsWXMxkclZmAXWELduQdol6h+MXMimf6P7/wBpLhgrQxgKK6SsmAx X-Received: by 2002:a17:907:1de1:b0:78d:20bb:3934 with SMTP id og33-20020a1709071de100b0078d20bb3934mr4817620ejc.29.1664968036253; Wed, 05 Oct 2022 04:07:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664968036; cv=none; d=google.com; s=arc-20160816; b=ZWSjd6N3649790f6n9aPXiRSE6u7CJSgR5z+ZfaIXPGa0PXGjr9pRn1rKkWFpSI4yt +NFWe/sR2ekUBzqIk+OIz5gP15IbxVOeJm6pGfzEu/3KMmgd25tu5MzWpJi7drAll2rN ivHIZeLenzowv6CFLTPyHndQ5IH9Fy1KRyv3CMGU6mwVEZD5VG3NOaAGA1rPxq5fk3zB W3JGMkDdGuQw6TSiMtEgR4GfYh8VcKaBxdLg53jkOV9xvj+qOUCL7ZjnPKPRvXqQe2iC lunxrRFK0jhpnfdrklPsSgYoK9qhcp9YlRiRLHv2tGJnTWwdxec4c9LxCotJXV61Cn5c 2hiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZjfiyOlyqF25zTBDZULVk0UdTR16lW+0ZSJokbWtjEI=; b=ZySe3DhAbVjj1nwyR3znWehctjl5l2Q0/eKyNhc+bWc82TqKNtqNJlKKMy5oDthVvo 7mv5roaCmzDoH+6FtvQZ3U8JLGZhZ0zCSrxEETvHpqC+YAspBuMkf3f/xz+JE77sWU6V JVdFjPaWdX4ZL04ArQafdbRCLVZ/hI1af4ZRNyAaAxpo0+qaw9Ix46MFHT34fSoGHC5c +DgTgnle6uioAMd6ENPLcevSkZ73o66rIMift+QxtEBwj4fFsGFPnO/ic2+5zpePeHrd FSXnyZuwNwoQFvW3Ez9GXZClNHJGBVa76qlH68hHjEE1DgSCmNcQBcqy91ygdLHdtFXS 8zhw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=mybiJLJX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h20-20020a05640250d400b0044785c547dbsi3650543edb.212.2022.10.05.04.06.50; Wed, 05 Oct 2022 04:07:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=mybiJLJX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229761AbiJELDR (ORCPT + 99 others); Wed, 5 Oct 2022 07:03:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50434 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229531AbiJELDN (ORCPT ); Wed, 5 Oct 2022 07:03:13 -0400 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 17F456CF4F for ; Wed, 5 Oct 2022 04:03:12 -0700 (PDT) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id B584C1F8A3; Wed, 5 Oct 2022 11:03:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1664967790; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZjfiyOlyqF25zTBDZULVk0UdTR16lW+0ZSJokbWtjEI=; b=mybiJLJXqY902Vp/rd3sqvMwiEKnCTgtRLXgK5oq+rrLSTp2pFMmn6YH/hWAdU//eFxwAp cdVcSzknEyIofxPePN/tqIyJAEP6E22WM5xXlKVfwA0Q8zmPaXg0b3Wv1hPWQl8M5Methq bflyIfbkTWugKokBYTizibEOrCLw1Jo= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 6FD9713345; Wed, 5 Oct 2022 11:03:10 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id tT8WGm5kPWPmQgAAMHmgww (envelope-from ); Wed, 05 Oct 2022 11:03:10 +0000 From: Juergen Gross To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: Juergen Gross , Boris Ostrovsky , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , xen-devel@lists.xenproject.org Subject: [PATCH v3 1/4] xen/pv: add fault recovery control to pmu msr accesses Date: Wed, 5 Oct 2022 13:02:59 +0200 Message-Id: <20221005110302.13455-2-jgross@suse.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20221005110302.13455-1-jgross@suse.com> References: <20221005110302.13455-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Today pmu_msr_read() and pmu_msr_write() fall back to the safe variants of read/write MSR in case the MSR access isn't emulated via Xen. Allow the caller to select that faults should not be recovered from by passing NULL for the error pointer. Restructure the code to make it more readable. Signed-off-by: Juergen Gross --- V2: - do some restructuring (Jan Beulich, Boris Ostrovsky) V3: - commit message rephrasing (Jan Beulich) - more restructuring (Boris Ostrovsky) --- arch/x86/xen/pmu.c | 66 ++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/arch/x86/xen/pmu.c b/arch/x86/xen/pmu.c index 21ecbe754cb2..0f98cb1077e3 100644 --- a/arch/x86/xen/pmu.c +++ b/arch/x86/xen/pmu.c @@ -131,6 +131,9 @@ static inline uint32_t get_fam15h_addr(u32 addr) static inline bool is_amd_pmu_msr(unsigned int msr) { + if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) + return false; + if ((msr >= MSR_F15H_PERF_CTL && msr < MSR_F15H_PERF_CTR + (amd_num_counters * 2)) || (msr >= MSR_K7_EVNTSEL0 && @@ -144,6 +147,9 @@ static int is_intel_pmu_msr(u32 msr_index, int *type, int *index) { u32 msr_index_pmc; + if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) + return false; + switch (msr_index) { case MSR_CORE_PERF_FIXED_CTR_CTRL: case MSR_IA32_DS_AREA: @@ -290,48 +296,52 @@ static bool xen_amd_pmu_emulate(unsigned int msr, u64 *val, bool is_read) return false; } +static bool pmu_msr_chk_emulated(unsigned int msr, uint64_t *val, bool is_read, + bool *emul) +{ + int type, index; + + if (is_amd_pmu_msr(msr)) + *emul = xen_amd_pmu_emulate(msr, val, is_read); + else if (is_intel_pmu_msr(msr, &type, &index)) + *emul = xen_intel_pmu_emulate(msr, val, type, index, is_read); + else + return false; + + return true; +} + bool pmu_msr_read(unsigned int msr, uint64_t *val, int *err) { - if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) { - if (is_amd_pmu_msr(msr)) { - if (!xen_amd_pmu_emulate(msr, val, 1)) - *val = native_read_msr_safe(msr, err); - return true; - } - } else { - int type, index; + bool emulated; - if (is_intel_pmu_msr(msr, &type, &index)) { - if (!xen_intel_pmu_emulate(msr, val, type, index, 1)) - *val = native_read_msr_safe(msr, err); - return true; - } + if (!pmu_msr_chk_emulated(msr, val, true, &emulated)) + return false; + + if (!emulated) { + *val = err ? native_read_msr_safe(msr, err) + : native_read_msr(msr); } - return false; + return true; } bool pmu_msr_write(unsigned int msr, uint32_t low, uint32_t high, int *err) { uint64_t val = ((uint64_t)high << 32) | low; + bool emulated; - if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) { - if (is_amd_pmu_msr(msr)) { - if (!xen_amd_pmu_emulate(msr, &val, 0)) - *err = native_write_msr_safe(msr, low, high); - return true; - } - } else { - int type, index; + if (!pmu_msr_chk_emulated(msr, &val, false, &emulated)) + return false; - if (is_intel_pmu_msr(msr, &type, &index)) { - if (!xen_intel_pmu_emulate(msr, &val, type, index, 0)) - *err = native_write_msr_safe(msr, low, high); - return true; - } + if (!emulated) { + if (err) + *err = native_write_msr_safe(msr, low, high); + else + native_write_msr(msr, low, high); } - return false; + return true; } static unsigned long long xen_amd_read_pmc(int counter) -- 2.35.3