From patchwork Mon Dec 18 06:45:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shuai Xue X-Patchwork-Id: 13496262 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 0FB16C46CA2 for ; Mon, 18 Dec 2023 06:45:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C457C8D0003; Mon, 18 Dec 2023 01:45:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BF3CB8D0001; Mon, 18 Dec 2023 01:45:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A6D398D0003; Mon, 18 Dec 2023 01:45:36 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 92D3F8D0001 for ; Mon, 18 Dec 2023 01:45:36 -0500 (EST) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 6C64F160902 for ; Mon, 18 Dec 2023 06:45:36 +0000 (UTC) X-FDA: 81579003072.02.3ED82F8 Received: from out30-124.freemail.mail.aliyun.com (out30-124.freemail.mail.aliyun.com [115.124.30.124]) by imf05.hostedemail.com (Postfix) with ESMTP id 5419E10001D for ; Mon, 18 Dec 2023 06:45:32 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=none; spf=pass (imf05.hostedemail.com: domain of xueshuai@linux.alibaba.com designates 115.124.30.124 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=1702881934; 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=Dmo984G5mwPCnoRdf4fg8QVNVQmj1rHZ+N1iQt3bl54=; b=SYwYxGPYp/m6mLTctbI8Ld3YvMevHfH8SnBW3wltdU/g8Jx0SRQpbHW2dUGn2X4aVoRJJ1 UtGX1h2ab6mREI44C56SI+FJGJNMA8CI9p9beDgXA3JCoU/AbywZ+7qoFcjmQ0SwKkcpgB yDyBzGo/yB0ssgf5U9Kyp9Dzqq8HtEk= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=none; spf=pass (imf05.hostedemail.com: domain of xueshuai@linux.alibaba.com designates 115.124.30.124 as permitted sender) smtp.mailfrom=xueshuai@linux.alibaba.com; dmarc=pass (policy=none) header.from=alibaba.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1702881934; a=rsa-sha256; cv=none; b=LPLwfTFVzMIJHnbOBuVBx3xlMCaxxtAEgGEk1+zfVvQ1Tb5w//sy1VCMVP1C6hvcpDGm9w 3qN0hLTi0CUDfU7EFfdzQlhWicol3rvzOYglZBbWqkZ8qPxT5s8DSSLANVw4lgIzum1sbo mQIE6pHQVv//nMCWCw/eJ68ftyh+ocA= X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R141e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046060;MF=xueshuai@linux.alibaba.com;NM=1;PH=DS;RN=35;SR=0;TI=SMTPD_---0VygHazY_1702881927; Received: from localhost.localdomain(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0VygHazY_1702881927) by smtp.aliyun-inc.com; Mon, 18 Dec 2023 14:45:28 +0800 From: Shuai Xue To: bp@alien8.de, 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, jarkko@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, tglx@linutronix.de, mingo@redhat.com, dave.hansen@linux.intel.com, lenb@kernel.org, hpa@zytor.com, robert.moore@intel.com, lvying6@huawei.com, xiexiuqi@huawei.com, zhuo.song@linux.alibaba.com Subject: [PATCH v10 1/4] ACPI: APEI: set memory failure flags as MF_ACTION_REQUIRED on synchronous events Date: Mon, 18 Dec 2023 14:45:18 +0800 Message-Id: <20231218064521.37324-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 X-Rspamd-Queue-Id: 5419E10001D X-Rspam-User: X-Stat-Signature: ajz73dg365bgdgwyxdfccrfzj8f7rbe3 X-Rspamd-Server: rspam01 X-HE-Tag: 1702881932-912425 X-HE-Meta: U2FsdGVkX191dB/upXhpn0FZktJBlNAZme8jM5VCua1YrTnO5IgcwGpLwUriVX3gOcz5GSgn5JCMFmUMSzFILIcdFgtaflcHkwYYiizZIk7cGQgXEOaeIuV3VgKgqZKJyplNe6QjC7s+9+FAVLnPp4z8aZJeoGcMANttnyFHgSLbzm+rA00hRmUDJMRLRhWOvV0d/6WkycfadjxnvAXabRQ+nR1e5wv4bc2lB1jr3x69U4EPTLRl9gH9CUAHfulsa3Di9Tex6Qlra4mPBWsOjkgJ5/420nXW4UbUvd7QA9x21RbAASdnAVRUS+wyxVPH9RtFAJbNBY5B/Edh8Q/iyq50U0FS3mIkRalCMolDbzU+avKKb/FHralpbbjRDtJzK1QuP9yeCiLzQuIakks56th+vPYPM58Q8VrBnfRTDzINgpJ4GzQ3h7GVg2JGbWF0EMYUmBsoVV/b7oC4Kt+E+vvGvyq4phfMxXDhbLodNgI8bsoK8fdAIrA/dBjCElF7S7H02pTXnktsWnzJI/M6lUYPmDKpiPWCyB8XIQhe7l7teqFrin9NSwMcs5HI02kCCjVqza9rUMPzD3gOBg6wCACLd1m9LLYDH8UMGQC8iu/Z2obr1+mXAlGAv8yquBh44V+CHKaezD0ZbE8YXRJ62hCOwVBALDI5xORUuMXAENZJoMtsZ1HddZ/mQn4PC8ab4VhQCxhxKTHxDDiou5uKCIpRD0o//clas3kBG+uxHLL2BFK/p6xf0eDeQboF5RQ9jTCY9sDiyPMNef8cuZGgLcf0xqQ9mWyMMoD7zH5BR8hry/wNK1lqiLVN29cNXXzlVcmhV4rb8Vw7YPTX3Fy1pW3wYUv43wgGqIR9vgjmZfTcJDGMA4BuHr4b6Xrd6bPxsqP0YIfC+nhUuUI5dMZQLxC70M/BRKy5JI8S3RGzWOeINb20T9Ipc0U12O1O3XoDjBMQU2aFMMFBAxagiXf geecYfN2 DU4ogjUQaNg9Exq+yMoKQJD6kptL6pk3muzdMRds5KarIlCedCmeoqmjjCSvzWiI4o2/pvflQzHlMxmycFU2U/RUfAvg1JT8l9lHvxe85D8Jm6U4NpRqoOJpNvOVgiFoxiHNxlp+OXCG5DxxPa/NKv+/mFRZShHUu5c5rYrYAhyIhHZH5UP3gGLqPJ04msg2VHPHmRc7hY2LtlouWAbPae8xRITA9FelSM9h33NYSnrYuVVicFQKVSQrLDOiRjH7MEFu2 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: List-Subscribe: List-Unsubscribe: There are two major types of uncorrected recoverable (UCR) errors : - Synchronous error: The error is detected and raised at the point of the consumption in the execution flow, e.g. when a CPU tries to access a poisoned cache line. The CPU will take a synchronous error exception such as Synchronous External Abort (SEA) on Arm64 and Machine Check Exception (MCE) on X86. OS requires to take action (for example, offline failure page/kill failure thread) to recover this uncorrectable error. - Asynchronous error: The error is detected out of processor execution context, e.g. when an error is detected by a background scrubber. 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. 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 synchronous errors, kernel will kill the current process which accessing the poisoned page by sending SIGBUS with BUS_MCEERR_AR. In addition, for asynchronous 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 synchronous errors are handled as asynchronous errors in memory failure. To this end, set memory failure flags as MF_ACTION_REQUIRED on synchronous events. Signed-off-by: Shuai Xue Tested-by: Ma Wupeng Reviewed-by: Kefeng Wang Reviewed-by: Xiaofei Tan Reviewed-by: Baolin Wang Reviewed-by: James Morse --- 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 63ad0541db38..ab2a82cb1b0b 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 @@ -489,7 +503,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); @@ -503,7 +517,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); @@ -511,9 +525,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; @@ -538,7 +554,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; } @@ -666,6 +682,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) { @@ -683,13 +700,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);