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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 564C3CD3436 for ; Tue, 19 Sep 2023 02:21:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BA0556B0489; Mon, 18 Sep 2023 22:21:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B4F996B048A; Mon, 18 Sep 2023 22:21:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9F03B6B048B; Mon, 18 Sep 2023 22:21:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 8FE476B0489 for ; Mon, 18 Sep 2023 22:21:44 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 571CF803CB for ; Tue, 19 Sep 2023 02:21:44 +0000 (UTC) X-FDA: 81251746128.25.21E7276 Received: from out30-119.freemail.mail.aliyun.com (out30-119.freemail.mail.aliyun.com [115.124.30.119]) by imf27.hostedemail.com (Postfix) with ESMTP id 2A02540029 for ; Tue, 19 Sep 2023 02:21:41 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=none; spf=pass (imf27.hostedemail.com: domain of xueshuai@linux.alibaba.com designates 115.124.30.119 as permitted sender) smtp.mailfrom=xueshuai@linux.alibaba.com; dmarc=pass (policy=none) header.from=alibaba.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1695090102; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DSefbZUgM6CMA/BFrZX+s4ID4eK6yX9wioRUOXqDeWE=; b=4SMb3OjC+YNa6DQxSi6L2y8SGxSbngaqya8hXVGnnMzaRx1gMlt2ezSjFVabry5WHjEl5W tUJgjDcFIYmTocEwMXmZfuvmaZV19a3EvYUeM74ggOviVKOH0uQmIDZF95ybfUGPyvnmxm Y3EOw6AYoBkxTm/EK4jwD1EAxadH9y0= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1695090102; a=rsa-sha256; cv=none; b=km8oCJURA4WWAOm1S5PYv+MDnb7NAC84QpqkcepcoE2Y+P40OkCezKU2jiE8l84QrtkkiO ksh2IXKCiqmc8O2AoI2kNfmA0hy6vAoJOwHQlA9REGy9F2Xkh7VKIGvA+AtSQduY6Pa7HC biayhkbZYyvCpbGBxE9/3eKQ0vMtTk8= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=none; spf=pass (imf27.hostedemail.com: domain of xueshuai@linux.alibaba.com designates 115.124.30.119 as permitted sender) smtp.mailfrom=xueshuai@linux.alibaba.com; dmarc=pass (policy=none) header.from=alibaba.com X-Alimail-AntiSpam:AC=PASS;BC=-1|-1;BR=01201311R211e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018045176;MF=xueshuai@linux.alibaba.com;NM=1;PH=DS;RN=35;SR=0;TI=SMTPD_---0VsPUaju_1695090094; Received: from localhost.localdomain(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0VsPUaju_1695090094) by smtp.aliyun-inc.com; Tue, 19 Sep 2023 10:21:37 +0800 From: Shuai Xue To: rafael@kernel.org, wangkefeng.wang@huawei.com, tanxiaofei@huawei.com, mawupeng1@huawei.com, tony.luck@intel.com, linmiaohe@huawei.com, naoya.horiguchi@nec.com, james.morse@arm.com, gregkh@linuxfoundation.org, will@kernel.org Cc: linux-acpi@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, linux-edac@vger.kernel.org, acpica-devel@lists.linuxfoundation.org, stable@vger.kernel.org, x86@kernel.org, xueshuai@linux.alibaba.com, justin.he@arm.com, ardb@kernel.org, ying.huang@intel.com, ashish.kalra@amd.com, baolin.wang@linux.alibaba.com, bp@alien8.de, tglx@linutronix.de, mingo@redhat.com, dave.hansen@linux.intel.com, jarkko@kernel.org, lenb@kernel.org, hpa@zytor.com, robert.moore@intel.com, lvying6@huawei.com, xiexiuqi@huawei.com, zhuo.song@linux.alibaba.com Subject: [RESEND PATCH v8 1/2] ACPI: APEI: set memory failure flags as MF_ACTION_REQUIRED on synchronous events Date: Tue, 19 Sep 2023 10:21:26 +0800 Message-Id: <20230919022127.69732-2-xueshuai@linux.alibaba.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221027042445.60108-1-xueshuai@linux.alibaba.com> References: <20221027042445.60108-1-xueshuai@linux.alibaba.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: gxsc3odbmjfphgyn1gbnnaoo54ukfukn X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 2A02540029 X-Rspam-User: X-HE-Tag: 1695090101-743355 X-HE-Meta: U2FsdGVkX1/w9uDr4LCnpxZnPxhVGjsvayj9aBsJHjQMlHe9o2C1N8F4RSCI4vkm7nSZHq9+E1DCcCCx8XLC9IQ/gV9kWu4MePs/gSbdY9/wzvcWlbFCRWT5G75rZcXXPIhiZHWqqyBhsXxtRRG14r+UKSkdtL9+0t0hkSxqzQcnnWDI6N/ewjccbBueI3yAZxdbEMy5UCDvEkoZTr6w5c9YCknW2azymY2l0qTyaqVSinrEsu8ZnNDMedc+AJ7rb/BZaYMdiBpYtShXGuCNCLKJ8UXo/kDoFs98T6xLloZLjcUQ+xwqEMJNIVKSMZ6Ae78Nh1MFjSlLWwQLSsXbWZvVcSUFKJvUeij+vxhP6RxCD5MsoaYUwgsJDoBVxTZowCEietms5hbg7GgT1CsjhrNCvma+HPOuFqVMJxHOERiwYwOA7KnQrjsHJLyrUID0ZcI16yIvxKvJ2+N2OfOeseGG23ioN/0mALkoUWWgvjJepSkxwUz1H8ygAegL0HrPlgWV2O78UC87v5PtAuS+HvaP8XikdGZxmQ+vOiap3+LrwAUC0tWmeLeYivLPIBT3/rFskq59R5XyTsTfx2Bjcrug265m91vOgW+8qWEFPAoNod7ZDxHhh7DpisvbIKgdkEluXptrv1SG7/HG3SGVMx8cvo0SXITSrCJFzQpPQbnfVWbJjz/S0lN53Qv+5Whmik05o4xOWSPp18u6OI7S0plXVYsaBtcxDvdc+Bl7Y0Qvx9kUy6jqycb0cSe+HAxVNEC2jH43YygxSZrQC2327FFBfiv8hdSjhAH79Hgw8d7xL1XO26li3YcvrTAzP9ldHmMy2E6lsCByyYISRU0iYbWddKjwnMeohp4lMxTOjgiA8DT1bhTH9VZ/61AKjbDTiEz28Hlb5+rvDZOpJBz5qQLv9DzjyD51IYib1o6i6UcqHGhtbWNi0H3sGkWsynPoyCrupzQqolB5cxKYh7L VLHjTeyp fxkeVihBZiqLskEMfCLI/NuJvvEWe6dd9UDmr7OFSyC9CJkfMdklSdsyEq0kL+0K+4bE6wA2gSbyTw7EcGTJTcOb8miYMMedShNT348/aqyNHofSTs/0QehY20af22TPHlgN3TeEKyfxooZrDsCD7fhtS0K9seL9w1nz5CH48WA4+BG4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: There are two major types of uncorrected recoverable (UCR) errors : - Action Required (AR): The error is detected and the processor already consumes the memory. OS requires to take action (for example, offline failure page/kill failure thread) to recover this uncorrectable error. - Action Optional (AO): The error is detected out of processor execution context. Some data in the memory are corrupted. But the data have not been consumed. OS is optional to take action to recover this uncorrectable error. The essential difference between AR and AO errors is that AR is a synchronous event, while AO is an asynchronous event. The hardware will signal a synchronous exception (Machine Check Exception on X86 and Synchronous External Abort on Arm64) when an error is detected and the memory access has been architecturally executed. When APEI firmware first is enabled, a platform may describe one error source for the handling of synchronous errors (e.g. MCE or SEA notification ), or for handling asynchronous errors (e.g. SCI or External Interrupt notification). In other words, we can distinguish synchronous errors by APEI notification. For AR errors, kernel will kill current process accessing the poisoned page by sending SIGBUS with BUS_MCEERR_AR. In addition, for AO errors, kernel will notify the process who owns the poisoned page by sending SIGBUS with BUS_MCEERR_AO in early kill mode. However, the GHES driver always sets mf_flags to 0 so that all UCR errors are handled as AO errors in memory failure. To this end, set memory failure flags as MF_ACTION_REQUIRED on synchronous events. Fixes: ba61ca4aab47 ("ACPI, APEI, GHES: Add hardware memory error recovery support")' Signed-off-by: Shuai Xue Tested-by: Ma Wupeng Reviewed-by: Kefeng Wang Reviewed-by: Xiaofei Tan Reviewed-by: Baolin Wang --- drivers/acpi/apei/ghes.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index ef59d6ea16da..88178aa6222d 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -101,6 +101,20 @@ static inline bool is_hest_type_generic_v2(struct ghes *ghes) return ghes->generic->header.type == ACPI_HEST_TYPE_GENERIC_ERROR_V2; } +/* + * A platform may describe one error source for the handling of synchronous + * errors (e.g. MCE or SEA), or for handling asynchronous errors (e.g. SCI + * or External Interrupt). On x86, the HEST notifications are always + * asynchronous, so only SEA on ARM is delivered as a synchronous + * notification. + */ +static inline bool is_hest_sync_notify(struct ghes *ghes) +{ + u8 notify_type = ghes->generic->notify.type; + + return notify_type == ACPI_HEST_NOTIFY_SEA; +} + /* * This driver isn't really modular, however for the time being, * continuing to use module_param is the easiest way to remain @@ -475,7 +489,7 @@ static bool ghes_do_memory_failure(u64 physical_addr, int flags) } static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, - int sev) + int sev, bool sync) { int flags = -1; int sec_sev = ghes_severity(gdata->error_severity); @@ -489,7 +503,7 @@ static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED)) flags = MF_SOFT_OFFLINE; if (sev == GHES_SEV_RECOVERABLE && sec_sev == GHES_SEV_RECOVERABLE) - flags = 0; + flags = sync ? MF_ACTION_REQUIRED : 0; if (flags != -1) return ghes_do_memory_failure(mem_err->physical_addr, flags); @@ -497,9 +511,11 @@ static bool ghes_handle_memory_failure(struct acpi_hest_generic_data *gdata, return false; } -static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, int sev) +static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, + int sev, bool sync) { struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata); + int flags = sync ? MF_ACTION_REQUIRED : 0; bool queued = false; int sec_sev, i; char *p; @@ -524,7 +540,7 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, int s * and don't filter out 'corrected' error here. */ if (is_cache && has_pa) { - queued = ghes_do_memory_failure(err_info->physical_fault_addr, 0); + queued = ghes_do_memory_failure(err_info->physical_fault_addr, flags); p += err_info->length; continue; } @@ -645,6 +661,7 @@ static bool ghes_do_proc(struct ghes *ghes, const guid_t *fru_id = &guid_null; char *fru_text = ""; bool queued = false; + bool sync = is_hest_sync_notify(ghes); sev = ghes_severity(estatus->error_severity); apei_estatus_for_each_section(estatus, gdata) { @@ -662,13 +679,13 @@ static bool ghes_do_proc(struct ghes *ghes, atomic_notifier_call_chain(&ghes_report_chain, sev, mem_err); arch_apei_report_mem_error(sev, mem_err); - queued = ghes_handle_memory_failure(gdata, sev); + queued = ghes_handle_memory_failure(gdata, sev, sync); } else if (guid_equal(sec_type, &CPER_SEC_PCIE)) { ghes_handle_aer(gdata); } else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) { - queued = ghes_handle_arm_hw_error(gdata, sev); + queued = ghes_handle_arm_hw_error(gdata, sev, sync); } else { void *err = acpi_hest_get_payload(gdata); -- 2.39.3