Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751282AbbEDRIc (ORCPT ); Mon, 4 May 2015 13:08:32 -0400 Received: from mail-bn1bon0145.outbound.protection.outlook.com ([157.56.111.145]:5251 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750798AbbEDRIZ (ORCPT ); Mon, 4 May 2015 13:08:25 -0400 Authentication-Results: spf=none (sender IP is 165.204.84.221) smtp.mailfrom=amd.com; alien8.de; dkim=none (message not signed) header.d=none; X-WSS-ID: 0NNU4XU-07-LEJ-02 X-M-MSG: Message-ID: <5547A780.8080800@amd.com> Date: Mon, 4 May 2015 12:08:16 -0500 From: Aravind Gopalakrishnan User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0 MIME-Version: 1.0 To: Borislav Petkov CC: , , , , , , , , , , , , , , , , , , , , , , , Robert Richter Subject: Re: [PATCH 2/4] x86/mce/amd: Introduce deferred error interrupt handler References: <1430405365-4473-1-git-send-email-Aravind.Gopalakrishnan@amd.com> <1430405365-4473-3-git-send-email-Aravind.Gopalakrishnan@amd.com> <20150503092212.GC18048@pd.tnic> <5547906E.3060701@amd.com> <20150504154652.GF3829@pd.tnic> In-Reply-To: <20150504154652.GF3829@pd.tnic> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.180.168.240] X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:165.204.84.221;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(428002)(377454003)(199003)(479174004)(189002)(51704005)(164054003)(24454002)(46102003)(80316001)(83506001)(59896002)(93886004)(110136002)(36756003)(120886001)(65956001)(33656002)(87936001)(105586002)(47776003)(54356999)(4001350100001)(50986999)(101416001)(50466002)(77156002)(92566002)(64126003)(76176999)(86362001)(23676002)(2950100001)(62966003)(77096005);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR02MB067;H:atltwp01.amd.com;FPR:;SPF:None;MLV:sfv;A:1;MX:1;LANG:en; X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB067; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(5005006)(3002001);SRVR:BLUPR02MB067;BCL:0;PCL:0;RULEID:;SRVR:BLUPR02MB067; X-Forefront-PRVS: 05669A7924 X-OriginatorOrg: amd4.onmicrosoft.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 May 2015 17:08:20.7545 (UTC) X-MS-Exchange-CrossTenant-Id: fde4dada-be84-483f-92cc-e026cbee8e96 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=fde4dada-be84-483f-92cc-e026cbee8e96;Ip=[165.204.84.221];Helo=[atltwp01.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR02MB067 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4215 Lines: 100 On 5/4/2015 10:46 AM, Borislav Petkov wrote: > On Mon, May 04, 2015 at 10:29:50AM -0500, Aravind Gopalakrishnan wrote: >>> What's the family check for? for BIOSes which don't set the LVT offset >>> to 2, as they should? >>> >>> If so, we probably should say >>> >>> pr_err(FW_BUG "Your BIOS is not setting up LVT offset 0x2 for deferred error IRQs correctly.\n"); >>> >>> or similar... >> Yeah. I meant to provide a comment at least for this. >> Forgot to do that. >> >> I'll print out a error message as you suggested (considering we do this in >> other places like threshold setup or IBS setup..) > lvt_off_valid() does that already. Adding Robert. Not sure if lvt_off_valid() can be reused for deferred error interrupt setup. It expects some some of info to be in struct threshold_block which is fine for threshold errors and the shifts for offset are different too. For deferred errors, the workaround is a little different as it applies to only the given family/model right now. If the workaround needs to be applied for future processors, we can extend the family check for those right? >> Right. I think a __log_error() is a good idea. >> Except, in amd_threshold_interrupt(), we have- >> m.misc = ((u64)high << 32) | low; >> >> which, is actually useless as we don't use m.misc anywhere in >> amd_decode_mce() or anywhere else in the decoding pipeline AFAICT. >> We only print out if 'misc' is valid and we only need status bits for that- >> ((m->status & MCI_STATUS_MISCV) ? "MiscV" : "-"), >> >> But, more importantly, we don't setup 'm.addr' here (in >> amd_threshold_interrupt() or in amd_deferred_error_interrupt()) >> Which means anytime we pass an error to be decoded from the interrupt >> handlers, we don't get any info about the error address. > So what are we reporting with a deferred error if it is not a > full-fledged MCE? We better fix that otherwise we probably shouldn't > even report those. I mean, userspace is supposed to do some error > handling based on error info but if that info's missing, we might just > as well panic right then and there, right? Oh no.. It is a proper MCE. I was simply saying that when we look at dmesg logs after an error happens, we would not see any useful info regarding the error address. Here's an example- [ 1314.651485] [Hardware Error]: Deferred error. [ 1314.651611] [Hardware Error]: CPU:0 (15:60:0) MC4_STATUS[Over|CE|MiscV|-|AddrV|Deferred|-|UECC]: 0xdc04b00005080813 [ 1314.651898] [Hardware Error]: MC4 Error Address: 0x0000000000000000 ^^^^^^^^^^^^^^^^^^^^ The Error Address will always be logged as 0x0 as m->addr in amd_decode_mce() is 0x0. If we setup 'm.addr' in amd_threshold_interrupt() and amd_deferred_error_interrupt() properly, then amd_decode_mce() would actually have some value in m->addr to report. I didn't mean to say HW doesn't provide us the information in the addr and/or the misc registers. >> So, we can do one of these- >> 1. Remove m.misc setup in amd_threshold_interrupt() and >> rdmsrl(MSR_IA32_MCx_ADDR(bank), m.addr) before we call mce_log() >> 2. Since we have mce_read_aux() that reads misc and addr registers, we can >> move the mce_[rd|wr]msrl wrappers and mce_read_aux() into mce.h and use it >> here in mce_amd.c >> >> Thoughts? > Makes sense but you need to first check though, which registers are > valid in the hw when a threshold/deferred error happens and collect > them. Only then we can do proper recovery. > > The addr, misc registers are still valid for threshold, deferred errors. (Of course, misc is valid only if m->status & MCI_STATUS_MISCV) My point was, in __log_error(), we can read relevant status and addr MSRs to be passed to mce_log() as those are the only pieces of information we use in the decoding chain; and discard the m.misc assignment we do for threshold errors. If userspace tools absolutely need 'misc' info too, we can go with option (2) as mentioned above.. Thanks, -Aravind. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/