Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp3612655imm; Thu, 17 May 2018 11:32:34 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqtiB5cOvBqDNjRqfwM40cZbua1QR0/ipdioz5+2N8u8KPFcJamKWcGUNc7XJrDG5ByXaMU X-Received: by 2002:a17:902:7582:: with SMTP id j2-v6mr6206696pll.65.1526581954655; Thu, 17 May 2018 11:32:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526581954; cv=none; d=google.com; s=arc-20160816; b=OVxVpcIMx4vnC9gjAB27lw+xkoufcEBUygrMIOcHajrH723mSaZERC/oElvttRz8gT +AEqxr+J4z1XkanZjpI1deSNM0fMpoYXMkyeeBEGw0329Gt/Mol5PCFvdPtGOPacgCMA DreFyamlBCoH0spkC/+G7GkhKbQXS35DORLkkoUNfk2Qst5BwSmgAJE53hfVZSPYf52Z UUb86gT8ykhRFqzLpRlNS0ZmMB5q+1kGHXU+vSfos2IAbYUPS3tyAhBt2VKb4elbcgnF qPAwKW95Bj61XwlzNXwdKGueiHVfLucNbuauttzRKlUrS22DoD5voRbgoIAhPs4dlKJx RvMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date :arc-authentication-results; bh=CwzqPz6Dq0Yi3jG9Qu+CKT70esAEeh4MCDJT2k7jVXo=; b=kR1igbaP1e8xLaiJZ0VBVgXZ6PGlT+Z+2U9RrRTu+navnXRM1unu32JNgOJTf+on4z UtZ7dUxw/VtPkxa35bJ/i/tFA3FxQ2tsVG6lIaJ1Ctc9gOnOAI97CW5s/CT5o8lvNsvI pltQ5iEik1iKLm5FUr9OXoZ4QkZhNmcD39T5mEDcTbcR6ExKHEi2DOCyun85z7FOgvIJ KyQyrD7lu8m92Hg8ubeCnE22utCaYoIznHYOIMCjIhbEG1G5QzNy0LVnlSN8J+UPLW3N Ot1OOBtKH26PK82w+0vr2U9uZk4jq7eCiCovD4O91VWzd46FuEGV8Pk1cwyYIEIdiKCu mcfw== 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 s66-v6si4544773pgc.331.2018.05.17.11.32.19; Thu, 17 May 2018 11:32:34 -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 S1752065AbeEQScC (ORCPT + 99 others); Thu, 17 May 2018 14:32:02 -0400 Received: from mx2.suse.de ([195.135.220.15]:35285 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751017AbeEQScB (ORCPT ); Thu, 17 May 2018 14:32:01 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CEF62ACBF; Thu, 17 May 2018 18:31:59 +0000 (UTC) Date: Thu, 17 May 2018 20:31:44 +0200 From: Borislav Petkov To: "Ghannam, Yazen" Cc: Johannes Hirte , "linux-edac@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "tony.luck@intel.com" , "x86@kernel.org" Subject: [PATCH 2/2] x86/MCE/AMD: Read MCx_MISC block addresses on any CPU Message-ID: <20180517183144.GB24312@pd.tnic> References: <20180414004230.GA2033@probook> <20180416115624.GA1543@probook> <20180515093953.GA1746@probook> <20180516224641.GA31929@pd.tnic> <20180517064930.GA26421@probook> <20180517104124.GA25595@pd.tnic> <20180517134415.GC27738@pd.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.9.3 (2018-01-21) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Borislav Petkov We used rdmsr_safe_on_cpu() to make sure we're reading the proper CPU's MISC block addresses. However, that caused trouble with CPU hotplug due to the _on_cpu() helper issuing an IPI while IRQs are disabled. But we don't have to do that: the block addresses are the same on any CPU so we can read them on any CPU. (What practically happens is, we read them on the BSP and cache them, and for later reads, we service them from the cache). Suggested-by: Yazen Ghannam Signed-off-by: Borislav Petkov --- arch/x86/kernel/cpu/mcheck/mce_amd.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index c8e038800591..f591b01930db 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -436,8 +436,7 @@ static void deferred_error_interrupt_enable(struct cpuinfo_x86 *c) wrmsr(MSR_CU_DEF_ERR, low, high); } -static u32 smca_get_block_address(unsigned int cpu, unsigned int bank, - unsigned int block) +static u32 smca_get_block_address(unsigned int bank, unsigned int block) { u32 low, high; u32 addr = 0; @@ -456,13 +455,13 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank, * For SMCA enabled processors, BLKPTR field of the first MISC register * (MCx_MISC0) indicates presence of additional MISC regs set (MISC1-4). */ - if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high)) + if (rdmsr_safe(MSR_AMD64_SMCA_MCx_CONFIG(bank), &low, &high)) goto out; if (!(low & MCI_CONFIG_MCAX)) goto out; - if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) && + if (!rdmsr_safe(MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) && (low & MASK_BLKPTR_LO)) addr = MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1); @@ -471,7 +470,7 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank, return addr; } -static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 high, +static u32 get_block_address(u32 current_addr, u32 low, u32 high, unsigned int bank, unsigned int block) { u32 addr = 0, offset = 0; @@ -480,7 +479,7 @@ static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 hi return addr; if (mce_flags.smca) - return smca_get_block_address(cpu, bank, block); + return smca_get_block_address(bank, block); /* Fall back to method we used for older processors: */ switch (block) { @@ -558,7 +557,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) smca_configure(bank, cpu); for (block = 0; block < NR_BLOCKS; ++block) { - address = get_block_address(cpu, address, low, high, bank, block); + address = get_block_address(address, low, high, bank, block); if (!address) break; @@ -1175,7 +1174,7 @@ static int allocate_threshold_blocks(unsigned int cpu, unsigned int bank, if (err) goto out_free; recurse: - address = get_block_address(cpu, address, low, high, bank, ++block); + address = get_block_address(address, low, high, bank, ++block); if (!address) return 0; -- 2.17.0.391.g1f1cddd558b5 SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg) --