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 154A9C27C4F for ; Fri, 21 Jun 2024 10:16:47 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 85CAB8D014F; Fri, 21 Jun 2024 06:16:46 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 80B278D0138; Fri, 21 Jun 2024 06:16:46 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6AB118D014F; Fri, 21 Jun 2024 06:16:46 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 4E1128D0138 for ; Fri, 21 Jun 2024 06:16:46 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 092DAA0D2A for ; Fri, 21 Jun 2024 10:16:46 +0000 (UTC) X-FDA: 82254492012.26.296DF6F Received: from esa10.hc1455-7.c3s2.iphmx.com (esa10.hc1455-7.c3s2.iphmx.com [139.138.36.225]) by imf12.hostedemail.com (Postfix) with ESMTP id 0CEBB40009 for ; Fri, 21 Jun 2024 10:16:41 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=fujitsu.com header.s=fj2 header.b=O0WopPt7; dmarc=pass (policy=quarantine) header.from=fujitsu.com; spf=pass (imf12.hostedemail.com: domain of ruansy.fnst@fujitsu.com designates 139.138.36.225 as permitted sender) smtp.mailfrom=ruansy.fnst@fujitsu.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1718964995; a=rsa-sha256; cv=none; b=6EjfRka+ViV7CvjzsBndGaAeqD0PBEmtBQc334QrydG5HHfYrYvwILPw0t4bUQLcNCOM1N Xydi41dwY4iJpRwUaw/4mdemzrsqVauWRB2IFDQE36EFpiO8zZkPHn0sFQ79ZgECicMxFc 5wMVuWjSVp/qj7kyBWzMbjDhrMQuPwQ= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=fujitsu.com header.s=fj2 header.b=O0WopPt7; dmarc=pass (policy=quarantine) header.from=fujitsu.com; spf=pass (imf12.hostedemail.com: domain of ruansy.fnst@fujitsu.com designates 139.138.36.225 as permitted sender) smtp.mailfrom=ruansy.fnst@fujitsu.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1718964995; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=oquObTo5YacBSNaDGbf84hEaSiN0FF+E16EEV9T199Y=; b=FsLC6yR6J9J3L4OyJl7GWGcAgk36lh7gI+TxLNQa9qZHsklqZjGJ/DYJRJEwsVv6zzr7Ql amL1Fu7kIZOoPzHWjIEaCW3oejy9sbUDJ0SGolgqnUHUvZZfbwnmqZRWIztvEBtuXtSRXN AaOqliXloGH5Wy7sh31twtyhzHLxEXc= DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=fujitsu.com; i=@fujitsu.com; q=dns/txt; s=fj2; t=1718965002; x=1750501002; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=FL0ybe9oSjt/xHXdA51SYGX9XM4ph1qt9P2lcHNgOg4=; b=O0WopPt7uppqobvlait258L8SkthXhrfg16Lkqo1lEGA49EwFYXXHwh7 IuSnsJw8QCn3iLM5EIA5Gn9CnMC9puwUZuScx+oge4ZQlWlkjExtp5EUU reIP/sl0epIK0tTzm81I9H14uznIEberbzspa4azx/bdDZKXNtV7a+N9u kabGBs+WfaAtlB1gQh55heVEpCzkzg0BI79p/TEdz0C6b9MiDmgoCxsW+ jdC5/rR47nDzrB97sL7uUJQTAPfBXOinGPA6IKjKFZTT7e7KsFLoJauyu QvpJTAOBryCiBOlpUk9PWoPmssp7L063/gxIvpiCLPSkPbV8R2x6B10BP w==; X-IronPort-AV: E=McAfee;i="6700,10204,11109"; a="151913739" X-IronPort-AV: E=Sophos;i="6.08,254,1712588400"; d="scan'208";a="151913739" Received: from unknown (HELO oym-r4.gw.nic.fujitsu.com) ([210.162.30.92]) by esa10.hc1455-7.c3s2.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2024 19:16:39 +0900 Received: from oym-m3.gw.nic.fujitsu.com (oym-nat-oym-m3.gw.nic.fujitsu.com [192.168.87.60]) by oym-r4.gw.nic.fujitsu.com (Postfix) with ESMTP id 78A0BD8008 for ; Fri, 21 Jun 2024 19:16:37 +0900 (JST) Received: from kws-ab4.gw.nic.fujitsu.com (kws-ab4.gw.nic.fujitsu.com [192.51.206.22]) by oym-m3.gw.nic.fujitsu.com (Postfix) with ESMTP id BCAD4D7298 for ; Fri, 21 Jun 2024 19:16:36 +0900 (JST) Received: from edo.cn.fujitsu.com (edo.cn.fujitsu.com [10.167.33.5]) by kws-ab4.gw.nic.fujitsu.com (Postfix) with ESMTP id 55B25E51B6 for ; Fri, 21 Jun 2024 19:16:36 +0900 (JST) Received: from [192.168.50.5] (unknown [10.167.226.114]) by edo.cn.fujitsu.com (Postfix) with ESMTP id B55371A0002; Fri, 21 Jun 2024 18:16:34 +0800 (CST) Message-ID: <83c705ce-a013-4a88-adcd-18dbc16d88df@fujitsu.com> Date: Fri, 21 Jun 2024 18:16:33 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC PATCH] cxl: avoid duplicating report from MCE & device To: Jonathan Cameron Cc: qemu-devel@nongnu.org, linux-cxl@vger.kernel.org, dan.j.williams@intel.com, dave@stgolabs.net, ira.weiny@intel.com, alison.schofield@intel.com, dave.jiang@intel.com, vishal.l.verma@intel.com, Borislav Petkov , Tony Luck , James Morse , Mauro Carvalho Chehab , Robert Richter , linux-edac@vger.kernel.org, Miaohe Lin , Naoya Horiguchi , linux-mm@kvack.org References: <20240618165310.877974-1-ruansy.fnst@fujitsu.com> <20240620180239.00004d41@Huawei.com> From: Shiyang Ruan In-Reply-To: <20240620180239.00004d41@Huawei.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 X-TM-AS-Product-Ver: IMSS-9.1.0.1417-9.0.0.1002-28468.004 X-TM-AS-User-Approved-Sender: Yes X-TMASE-Version: IMSS-9.1.0.1417-9.0.1002-28468.004 X-TMASE-Result: 10--30.233600-10.000000 X-TMASE-MatchedRID: OnXFgg5KIq2PvrMjLFD6eKn9fPsu8s0a2q80vLACqaeqvcIF1TcLYLBk jjdoOP1bp3Z/y3zTL9+zN6XcSN8uuHerlGbz8OXFolVO7uyOCDUXivwflisSrEJsNXD374+pO+W Rk1kOc5MCcJ+0x3yT8twnF1a+MpDfC5dVqsgzBjuOFfLQqF6P0tUEOicf335WUoV94zwLp3VJ9L 43nm/22bqZhYf6F5ZElyW1ZrZx68b/awIuxLRW1EhwlOfYeSqxlDt5PQMgj00zAwv94MqCLh8aR hKglPt8mNVEdxRO2BKiQrGQ0QrIUcfdkIlEiI2knVTWWiNp+v/0swHSFcVJ6DxzAG47ocHfBk0s RysFrTA+flhazaw2+PtIw293QqFjj4s0JN6UudnfqVBdB7I8UeTuQvwGTH36sqiKlYBJQxguJaP bC+kbrOmOkdLRzR1Y63smvwVtnbpFFCG8sIFUT7nHu4BcYSmtwTlc9CcHMZerwqxtE531VBFup4 CINH3JYGFrrc6fVM/HUvCTKXIuFlE/ARLVFdXaA3HGs3zFTqgGsbP1/fAnOf/PlfQrPF26UqOSl IOIhgkKJfF2LeZOj/OKfz3NcveUOn+bl8FgKwanOYknDZ/QocMKxxeacM3vqU5CNByvM6VNMJgQ uMz4JUFg+UhPNwox9J777fUg1RCR9GF2J2xqM4MbH85DUZXyudR/NJw2JHcNYpvo9xW+mI6HM5r qDwqtlExlQIQeRG0= X-TMASE-SNAP-Result: 1.821001.0001-0-1-22:0,33:0,34:0-0 X-Rspamd-Queue-Id: 0CEBB40009 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 96qstygoaeciig3cmuf4oxuzp7erycwk X-HE-Tag: 1718965001-785210 X-HE-Meta: U2FsdGVkX1/lCfe0wf5RPwladZ2olucJc0K42rhEGttpOeSH6L8uOg/msuIXlexqZmaWcTokmxPhbz1PEKYdTuYkyG0YPlQZ/5yvqtqYEa2/UpUZ2Q5qYcQhi7y4z1mYzMlzRMS9IlcjvXcqs1XnrW07kqrIVWg0/6VOMA/m4DVWU0h+l3hPKK7qPBsWKlQo4FrA9+NWkpgLYuMLQu7N/ZSjY9+sN1Mv5XuHu2vprAw+z+MRcgt+qmTbqAGMBNHSa5nEubavQ1yrhnGkO+1nmHPAMw1JnudDV0vg3Mbld4Xyd858uLb1FawqJ9fyUOTjm1sOqMaC+w4juV/Oklzbuwet2v5w7bYCkkXG3MHWqyynEWu38jiq0TwwwVjQ4PzOk+jHtp5OPuqRaRbpUIg0It/P+bvEdOpXbq14MWchpOkJMYEVTeCzsq0rrslrDk7Oqn/VYKVwtvgqgt1VvgBca3axAZldy/JwiTpeA7KZC8/jV4HRRb8sqZigxFTu/uvHeM4rjprnt7Pr1HYBmwDVcY6zz1PWOcDkI5xjl1x9u6phGTP12dwqV5aPGicYtaHHSohm76SitQ3hnzluec/1CAIbG7fEfnipRjt+UB1FzZkwNd0jsMK1fE3Y8fSDOPM42Drh1Chq5txjUwrklysfRF/lAvnqxSnD1XyKkfQ2iH+261fZwEY5vwb1kQlsvJvTUC3umJe2lWpmkPBVPeDlfBPfsFyo4ze86dhghcPlGSwDUgUOtthFBKq/anc+/2CAWKed7rT1M8asIQTtiok3GJ0TJZtMPukx0zcUW8NcXVRWYOg2Fn3dDPg6ZIic+Euoqa77GBuc0hStr8OS+0s5+Wo7Zm/sUon3qQ+iE7/BNvOdFAid4+fyFsnzehaBpOiZyLj9FkeLWQ9LSzrNhZBvIEc2kVGRzdRXQHOSNfuUk3O4MlQqEnk78MbnUtMTajNAj7dTvpord8aQMnU4jd/ snwhu/8L M1Fna52b2/KAZ7nCGnsjcuJB1okIwAXZz3TZiqryODaG2EN3EUBUzB2BtLRIWtzeDIDZ+Dtik6dbhRwwm/hPrAsN2MN9hA9uIUUbCbPBNDzEaR78zUf0Ff4x++EKcWzlenQLmOO3UvIosez5nKx5vz0ipu1PiwHBMZMDeo8a/TvfER+TJ0UQCQD4+v0GdBI4pyOOxi0CDFYWmFdr6wX4lrO1Fw3dsjcFFr7kHbNa3MfcSxyLHDx2IgWCZVPgnPg+B3n8Y69dFGhRqez860LdwP+mMlYUZ8LDxTlnhJ5qP5XiLz/sfj0r942plPoe8ma/6AFX9CSsSNukNuTc/zorA0InfJmie8OFUicvVZs8bS4mjJ2aa41gh5iuqDJ2/ryCoiG5GSD2GDcR4N7wyuInAxElhEJCpwCgDzL0rqjw3mPlhX4utrFHhIIYkJnZcYIcDYMisy/X57D4Myelzr5uhimq5vDl6t3TS5OzR 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: 在 2024/6/21 1:02, Jonathan Cameron 写道: > On Wed, 19 Jun 2024 00:53:10 +0800 > Shiyang Ruan wrote: > >> Background: >> Since CXL device is a memory device, while CPU consumes a poison page of >> CXL device, it always triggers a MCE by interrupt (INT18), no matter >> which-First path is configured. This is the first report. Then >> currently, in FW-First path, the poison event is transferred according >> to the following process: CXL device -> firmware -> OS:ACPI->APEI->GHES >> -> CPER -> trace report. This is the second one. These two reports >> are indicating the same poisoning page, which is the so-called "duplicate >> report"[1]. And the memory_failure() handling I'm trying to add in >> OS-First path could also be another duplicate report. >> >> Hope the flow below could make it easier to understand: >> CPU accesses bad memory on CXL device, then >> -> MCE (INT18), *always* report (1) >> -> * FW-First (implemented now) >> -> CXL device -> FW >> -> OS:ACPI->APEI->GHES->CPER -> trace report (2.a) >> * OS-First (not implemented yet, I'm working on it) >> -> CXL device -> MSI >> -> OS:CXL driver -> memory_failure() (2.b) >> so, the (1) and (2.a/b) are duplicated. >> >> (I didn't get response in my reply for [1] while I have to make patch to >> solve this problem, so please correct me if my understanding is wrong.) >> >> This patch adds a new notifier_block and MCE_PRIO_CXL, for CXL memdev >> to check whether the current poison page has been reported (if yes, >> stop the notifier chain, won't call the following memory_failure() >> to report), into `x86_mce_decoder_chain`. In this way, if the poison >> page already handled(recorded and reported) in (1) or (2), the other one >> won't duplicate the report. The record could be clear when >> cxl_clear_poison() is called. >> >> [1] https://lore.kernel.org/linux-cxl/664d948fb86f0_e8be294f8@dwillia2-mobl3.amr.corp.intel.com.notmuch/ >> >> Signed-off-by: Shiyang Ruan > > So poison can be cleared in a number of ways and a CXL poison clear command > is unfortunately only one of them. Some architectures have instructions > that guarantee to write a whole cacheline and can clear things as well. > I believe x86 does for starters. According to the CXL Spec, to clear an error record on device, an explicit clear operation is required (I think this means sending a mbox command). I'm not sure if it is able to clear device error by just writing a whole cacheline. > > +CC linux-edac and related maintainers / reviewers. > linux-mm and hwpoison maintainer. > > So I think this needs a more general solution that encompasses > more general cleanup of poison. > > Trivial comments inline. Thanks > > Jonathan > > >> --- >> arch/x86/include/asm/mce.h | 1 + >> drivers/cxl/core/mbox.c | 130 +++++++++++++++++++++++++++++++++++++ >> drivers/cxl/core/memdev.c | 6 +- >> drivers/cxl/cxlmem.h | 3 + >> 4 files changed, 139 insertions(+), 1 deletion(-) >> >> diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h >> index dfd2e9699bd7..d8109c48e7d9 100644 >> --- a/arch/x86/include/asm/mce.h >> +++ b/arch/x86/include/asm/mce.h >> @@ -182,6 +182,7 @@ enum mce_notifier_prios { >> MCE_PRIO_NFIT, >> MCE_PRIO_EXTLOG, >> MCE_PRIO_UC, >> + MCE_PRIO_CXL, >> MCE_PRIO_EARLY, >> MCE_PRIO_CEC, >> MCE_PRIO_HIGHEST = MCE_PRIO_CEC >> diff --git a/drivers/cxl/core/mbox.c b/drivers/cxl/core/mbox.c >> index 2626f3fff201..0eb3c5401e81 100644 >> --- a/drivers/cxl/core/mbox.c >> +++ b/drivers/cxl/core/mbox.c >> @@ -4,6 +4,8 @@ >> #include >> #include >> #include >> +#include >> +#include >> #include >> #include >> #include >> @@ -880,6 +882,9 @@ void cxl_event_trace_record(const struct cxl_memdev *cxlmd, >> if (cxlr) >> hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); >> >> + if (hpa != ULLONG_MAX && cxl_mce_recorded(hpa)) >> + return; >> + >> if (event_type == CXL_CPER_EVENT_GEN_MEDIA) >> trace_cxl_general_media(cxlmd, type, cxlr, hpa, >> &evt->gen_media); >> @@ -1408,6 +1413,127 @@ int cxl_poison_state_init(struct cxl_memdev_state *mds) >> } >> EXPORT_SYMBOL_NS_GPL(cxl_poison_state_init, CXL); >> >> +struct cxl_mce_record { >> + struct list_head node; >> + u64 hpa; >> +}; >> +LIST_HEAD(cxl_mce_records); >> +DEFINE_MUTEX(cxl_mce_mutex); >> + >> +bool cxl_mce_recorded(u64 hpa) >> +{ >> + struct cxl_mce_record *cur, *next, *rec; >> + int rc; >> + >> + rc = mutex_lock_interruptible(&cxl_mce_mutex); > > guard(mutex)(&cxl_mce_muted); > >> + if (rc) >> + return false; >> + >> + list_for_each_entry_safe(cur, next, &cxl_mce_records, node) { >> + if (cur->hpa == hpa) { >> + mutex_unlock(&cxl_mce_mutex); >> + return true; >> + } >> + } >> + >> + rec = kmalloc(sizeof(struct cxl_mce_record), GFP_KERNEL); >> + rec->hpa = hpa; >> + list_add(&cxl_mce_records, &rec->node); >> + >> + mutex_unlock(&cxl_mce_mutex); >> + >> + return false; >> +} >> + >> +void cxl_mce_clear(u64 hpa) >> +{ >> + struct cxl_mce_record *cur, *next; >> + int rc; >> + >> + rc = mutex_lock_interruptible(&cxl_mce_mutex); > > Maybe cond_guard(). Ok, this is better. I'll use automatic clean locks instead. -- Thanks, Ruan. > >> + if (rc) >> + return; >> + >> + list_for_each_entry_safe(cur, next, &cxl_mce_records, node) { >> + if (cur->hpa == hpa) { >> + list_del(&cur->node); >> + break; >> + } >> + } >> + >> + mutex_unlock(&cxl_mce_mutex); >> +} >> + >> +struct cxl_contains_hpa_context { >> + bool contains; >> + u64 hpa; >> +}; >> + >> +static int __cxl_contains_hpa(struct device *dev, void *arg) >> +{ >> + struct cxl_contains_hpa_context *ctx = arg; >> + struct cxl_endpoint_decoder *cxled; >> + struct range *range; >> + u64 hpa = ctx->hpa; >> + >> + if (!is_endpoint_decoder(dev)) >> + return 0; >> + >> + cxled = to_cxl_endpoint_decoder(dev); >> + range = &cxled->cxld.hpa_range; >> + >> + if (range->start <= hpa && hpa <= range->end) { >> + ctx->contains = true; >> + return 1; >> + } >> + >> + return 0; >> +} >> + >> +static bool cxl_contains_hpa(const struct cxl_memdev *cxlmd, u64 hpa) >> +{ >> + struct cxl_contains_hpa_context ctx = { >> + .contains = false, >> + .hpa = hpa, >> + }; >> + struct cxl_port *port; >> + >> + port = cxlmd->endpoint; >> + if (port && is_cxl_endpoint(port) && cxl_num_decoders_committed(port)) >> + device_for_each_child(&port->dev, &ctx, __cxl_contains_hpa); >> + >> + return ctx.contains; >> +} >> + >> +static int cxl_handle_mce(struct notifier_block *nb, unsigned long val, >> + void *data) >> +{ >> + struct mce *mce = (struct mce *)data; >> + struct cxl_memdev_state *mds = container_of(nb, struct cxl_memdev_state, >> + mce_notifier); >> + u64 hpa; >> + >> + if (!mce || !mce_usable_address(mce)) >> + return NOTIFY_DONE; >> + >> + hpa = mce->addr & MCI_ADDR_PHYSADDR; >> + >> + /* Check if the PFN is located on this CXL device */ >> + if (!pfn_valid(hpa >> PAGE_SHIFT) && >> + !cxl_contains_hpa(mds->cxlds.cxlmd, hpa)) >> + return NOTIFY_DONE; >> + >> + /* >> + * Search PFN in the cxl_mce_records, if already exists, don't continue >> + * to do memory_failure() to avoid a poison address being reported >> + * more than once. >> + */ >> + if (cxl_mce_recorded(hpa)) >> + return NOTIFY_STOP; >> + else >> + return NOTIFY_OK; >> +} >> + >> struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev) >> { >> struct cxl_memdev_state *mds; >> @@ -1427,6 +1553,10 @@ struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev) >> mds->ram_perf.qos_class = CXL_QOS_CLASS_INVALID; >> mds->pmem_perf.qos_class = CXL_QOS_CLASS_INVALID; >> >> + mds->mce_notifier.notifier_call = cxl_handle_mce; >> + mds->mce_notifier.priority = MCE_PRIO_CXL; >> + mce_register_decode_chain(&mds->mce_notifier); >> + >> return mds; >> } >> EXPORT_SYMBOL_NS_GPL(cxl_memdev_state_create, CXL); >> diff --git a/drivers/cxl/core/memdev.c b/drivers/cxl/core/memdev.c >> index 0277726afd04..aa3ac89d17be 100644 >> --- a/drivers/cxl/core/memdev.c >> +++ b/drivers/cxl/core/memdev.c >> @@ -376,10 +376,14 @@ int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa) >> goto out; >> >> cxlr = cxl_dpa_to_region(cxlmd, dpa); >> - if (cxlr) >> + if (cxlr) { >> + u64 hpa = cxl_trace_hpa(cxlr, cxlmd, dpa); >> + >> + cxl_mce_clear(hpa); >> dev_warn_once(mds->cxlds.dev, >> "poison clear dpa:%#llx region: %s\n", dpa, >> dev_name(&cxlr->dev)); >> + } >> >> record = (struct cxl_poison_record) { >> .address = cpu_to_le64(dpa), >> diff --git a/drivers/cxl/cxlmem.h b/drivers/cxl/cxlmem.h >> index 19aba81cdf13..fbf8d9f46984 100644 >> --- a/drivers/cxl/cxlmem.h >> +++ b/drivers/cxl/cxlmem.h >> @@ -501,6 +501,7 @@ struct cxl_memdev_state { >> struct cxl_fw_state fw; >> >> struct rcuwait mbox_wait; >> + struct notifier_block mce_notifier; >> int (*mbox_send)(struct cxl_memdev_state *mds, >> struct cxl_mbox_cmd *cmd); >> }; >> @@ -836,6 +837,8 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len, >> int cxl_trigger_poison_list(struct cxl_memdev *cxlmd); >> int cxl_inject_poison(struct cxl_memdev *cxlmd, u64 dpa); >> int cxl_clear_poison(struct cxl_memdev *cxlmd, u64 dpa); >> +bool cxl_mce_recorded(u64 pfn); >> +void cxl_mce_clear(u64 pfn); >> >> #ifdef CONFIG_CXL_SUSPEND >> void cxl_mem_active_inc(void); >