From: Borislav Petkov <bp@suse.de> To: "Ghannam, Yazen" <Yazen.Ghannam@amd.com> Cc: Johannes Hirte <johannes.hirte@datenkhaos.de>, "linux-edac@vger.kernel.org" <linux-edac@vger.kernel.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "tony.luck@intel.com" <tony.luck@intel.com>, "x86@kernel.org" <x86@kernel.org> Subject: [PATCH 1/2] x86/MCE/AMD: Cache SMCA MISC block addresses Date: Thu, 17 May 2018 20:30:58 +0200 [thread overview] Message-ID: <20180517183058.GA24312@pd.tnic> (raw) In-Reply-To: <CY4PR12MB1557F564AF25A4F2306C7DE4F8910@CY4PR12MB1557.namprd12.prod.outlook.com> From: Borislav Petkov <bp@suse.de> ... into a global, two-dimensional array and service subsequent reads from that cache to avoid rdmsr_on_cpu() calls during CPU hotplug (IPIs with IRQs disabled). In addition, this fixes a KASAN slab-out-of-bounds read due to wrong usage of the bank->blocks pointer. Reported-by: Johannes Hirte <johannes.hirte@datenkhaos.de> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Yazen Ghannam <yazen.ghannam@amd.com> Fixes: 27bd59502702 ("x86/mce/AMD: Get address from already initialized block") Link: http://lkml.kernel.org/r/20180414004230.GA2033@probook --- arch/x86/kernel/cpu/mcheck/mce_amd.c | 29 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index f7666eef4a87..c8e038800591 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -94,6 +94,11 @@ static struct smca_bank_name smca_names[] = { [SMCA_SMU] = { "smu", "System Management Unit" }, }; +static u32 smca_bank_addrs[MAX_NR_BANKS][NR_BLOCKS] __ro_after_init = +{ + [0 ... MAX_NR_BANKS - 1] = { [0 ... NR_BLOCKS - 1] = -1 } +}; + const char *smca_get_name(enum smca_bank_types t) { if (t >= N_SMCA_BANK_TYPES) @@ -443,20 +448,26 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank, if (!block) return MSR_AMD64_SMCA_MCx_MISC(bank); + /* Check our cache first: */ + if (smca_bank_addrs[bank][block] != -1) + return smca_bank_addrs[bank][block]; + /* * 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)) - return addr; + goto out; if (!(low & MCI_CONFIG_MCAX)) - return addr; + goto out; if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) && (low & MASK_BLKPTR_LO)) - return MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1); + addr = MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1); +out: + smca_bank_addrs[bank][block] = addr; return addr; } @@ -468,18 +479,6 @@ static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 hi if ((bank >= mca_cfg.banks) || (block >= NR_BLOCKS)) return addr; - /* Get address from already initialized block. */ - if (per_cpu(threshold_banks, cpu)) { - struct threshold_bank *bankp = per_cpu(threshold_banks, cpu)[bank]; - - if (bankp && bankp->blocks) { - struct threshold_block *blockp = &bankp->blocks[block]; - - if (blockp) - return blockp->address; - } - } - if (mce_flags.smca) return smca_get_block_address(cpu, bank, block); -- 2.17.0.391.g1f1cddd558b5 SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg) --
WARNING: multiple messages have this Message-ID (diff)
From: Boris Petkov <bp@suse.de> To: "Ghannam, Yazen" <Yazen.Ghannam@amd.com> Cc: Johannes Hirte <johannes.hirte@datenkhaos.de>, "linux-edac@vger.kernel.org" <linux-edac@vger.kernel.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>, "tony.luck@intel.com" <tony.luck@intel.com>, "x86@kernel.org" <x86@kernel.org> Subject: [1/2] x86/MCE/AMD: Cache SMCA MISC block addresses Date: Thu, 17 May 2018 20:30:58 +0200 [thread overview] Message-ID: <20180517183058.GA24312@pd.tnic> (raw) From: Borislav Petkov <bp@suse.de> ... into a global, two-dimensional array and service subsequent reads from that cache to avoid rdmsr_on_cpu() calls during CPU hotplug (IPIs with IRQs disabled). In addition, this fixes a KASAN slab-out-of-bounds read due to wrong usage of the bank->blocks pointer. Reported-by: Johannes Hirte <johannes.hirte@datenkhaos.de> Signed-off-by: Borislav Petkov <bp@suse.de> Cc: Yazen Ghannam <yazen.ghannam@amd.com> Fixes: 27bd59502702 ("x86/mce/AMD: Get address from already initialized block") Link: http://lkml.kernel.org/r/20180414004230.GA2033@probook --- arch/x86/kernel/cpu/mcheck/mce_amd.c | 29 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index f7666eef4a87..c8e038800591 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -94,6 +94,11 @@ static struct smca_bank_name smca_names[] = { [SMCA_SMU] = { "smu", "System Management Unit" }, }; +static u32 smca_bank_addrs[MAX_NR_BANKS][NR_BLOCKS] __ro_after_init = +{ + [0 ... MAX_NR_BANKS - 1] = { [0 ... NR_BLOCKS - 1] = -1 } +}; + const char *smca_get_name(enum smca_bank_types t) { if (t >= N_SMCA_BANK_TYPES) @@ -443,20 +448,26 @@ static u32 smca_get_block_address(unsigned int cpu, unsigned int bank, if (!block) return MSR_AMD64_SMCA_MCx_MISC(bank); + /* Check our cache first: */ + if (smca_bank_addrs[bank][block] != -1) + return smca_bank_addrs[bank][block]; + /* * 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)) - return addr; + goto out; if (!(low & MCI_CONFIG_MCAX)) - return addr; + goto out; if (!rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_MISC(bank), &low, &high) && (low & MASK_BLKPTR_LO)) - return MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1); + addr = MSR_AMD64_SMCA_MCx_MISCy(bank, block - 1); +out: + smca_bank_addrs[bank][block] = addr; return addr; } @@ -468,18 +479,6 @@ static u32 get_block_address(unsigned int cpu, u32 current_addr, u32 low, u32 hi if ((bank >= mca_cfg.banks) || (block >= NR_BLOCKS)) return addr; - /* Get address from already initialized block. */ - if (per_cpu(threshold_banks, cpu)) { - struct threshold_bank *bankp = per_cpu(threshold_banks, cpu)[bank]; - - if (bankp && bankp->blocks) { - struct threshold_block *blockp = &bankp->blocks[block]; - - if (blockp) - return blockp->address; - } - } - if (mce_flags.smca) return smca_get_block_address(cpu, bank, block);
next prev parent reply other threads:[~2018-05-17 18:31 UTC|newest] Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-02-01 18:48 [PATCH 1/3] x86/MCE/AMD: Redo function to get SMCA bank type Yazen Ghannam 2018-02-01 18:48 ` [1/3] " Yazen Ghannam 2018-02-01 18:48 ` [PATCH 2/3] x86/MCE/AMD, EDAC/mce_amd: Enumerate Reserved " Yazen Ghannam 2018-02-01 18:48 ` [2/3] " Yazen Ghannam 2018-02-08 15:15 ` [PATCH 2/3] " Borislav Petkov 2018-02-08 15:15 ` [2/3] " Borislav Petkov 2018-02-14 16:28 ` [PATCH 2/3] " Ghannam, Yazen 2018-02-14 16:28 ` [2/3] " Yazen Ghannam 2018-02-01 18:48 ` [PATCH 3/3] x86/MCE/AMD: Get address from already initialized block Yazen Ghannam 2018-02-01 18:48 ` [3/3] " Yazen Ghannam 2018-02-08 15:26 ` [PATCH 3/3] " Borislav Petkov 2018-02-08 15:26 ` [3/3] " Borislav Petkov 2018-04-14 0:42 ` [PATCH 3/3] " Johannes Hirte 2018-04-14 0:42 ` [3/3] " Johannes Hirte 2018-04-16 11:56 ` [PATCH 3/3] " Johannes Hirte 2018-04-16 11:56 ` [3/3] " Johannes Hirte 2018-04-17 13:31 ` [PATCH 3/3] " Ghannam, Yazen 2018-04-17 13:31 ` [3/3] " Yazen Ghannam 2018-05-15 9:39 ` [PATCH 3/3] " Johannes Hirte 2018-05-15 9:39 ` [3/3] " Johannes Hirte 2018-05-16 22:46 ` [PATCH 3/3] " Borislav Petkov 2018-05-16 22:46 ` [3/3] " Boris Petkov 2018-05-17 6:49 ` [PATCH 3/3] " Johannes Hirte 2018-05-17 6:49 ` [3/3] " Johannes Hirte 2018-05-17 10:41 ` [PATCH 3/3] " Borislav Petkov 2018-05-17 10:41 ` [3/3] " Boris Petkov 2018-05-17 13:04 ` [PATCH 3/3] " Ghannam, Yazen 2018-05-17 13:04 ` [3/3] " Yazen Ghannam 2018-05-17 13:44 ` [PATCH 3/3] " Borislav Petkov 2018-05-17 13:44 ` [3/3] " Boris Petkov 2018-05-17 14:05 ` [PATCH 3/3] " Ghannam, Yazen 2018-05-17 14:05 ` [3/3] " Yazen Ghannam 2018-05-17 18:30 ` Borislav Petkov [this message] 2018-05-17 18:30 ` [1/2] x86/MCE/AMD: Cache SMCA MISC block addresses Boris Petkov 2018-05-17 18:31 ` [PATCH 2/2] x86/MCE/AMD: Read MCx_MISC block addresses on any CPU Borislav Petkov 2018-05-17 18:31 ` [2/2] " Boris Petkov 2018-05-17 19:29 ` [PATCH 3/3] x86/MCE/AMD: Get address from already initialized block Johannes Hirte 2018-05-17 19:29 ` [3/3] " Johannes Hirte 2018-05-17 19:33 ` [PATCH 3/3] " Borislav Petkov 2018-05-17 19:33 ` [3/3] " Boris Petkov 2018-05-19 13:21 ` [tip:ras/urgent] x86/MCE/AMD: Cache SMCA MISC block addresses tip-bot for Borislav Petkov 2018-02-08 15:04 ` [PATCH 1/3] x86/MCE/AMD: Redo function to get SMCA bank type Borislav Petkov 2018-02-08 15:04 ` [1/3] " Borislav Petkov 2018-02-14 16:38 ` [PATCH 1/3] " Ghannam, Yazen 2018-02-14 16:38 ` [1/3] " Yazen Ghannam 2018-02-14 19:35 ` [PATCH 1/3] " Borislav Petkov 2018-02-14 19:35 ` [1/3] " Boris Petkov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20180517183058.GA24312@pd.tnic \ --to=bp@suse.de \ --cc=Yazen.Ghannam@amd.com \ --cc=johannes.hirte@datenkhaos.de \ --cc=linux-edac@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=tony.luck@intel.com \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.