From: Jongwon Lee <ai@linux.com>
To: Davidlohr Bueso <dave@stgolabs.net>,
Jonathan Cameron <jic23@kernel.org>,
Dave Jiang <dave.jiang@intel.com>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Dan Williams <djbw@kernel.org>
Cc: Ira Weiny <iweiny@kernel.org>, Li Ming <ming.li@zohomail.com>,
Richard Cheng <icheng@nvidia.com>,
linux-cxl@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v5 2/3] cxl/edac: Skip event records marked NOT_REPAIRABLE
Date: Sun, 08 Nov 2026 11:20:24 +0900 [thread overview]
Message-ID: <20261108022022.3352-3-ai@linux.com> (raw)
In-Reply-To: <20261108022022.3352-1-ai@linux.com>
Bit 1 of the DPA field in General Media and DRAM event records is the
NOT_REPAIRABLE flag. The device sets it when the memory at that DPA
cannot be repaired.
cxl_find_rec_gen_media() and cxl_find_rec_dram() do not check this flag.
A repair request that matches such a record passes the lookup and is
sent to the device. Since the records are keyed by the raw DPA, this
happens today when user space writes the DPA with bit 1 set.
Skip these records in both lookups, so the repair request fails with
-EINVAL. The trace events already show dpa_flags='NOT_REPAIRABLE' for
them, so user space can tell before it asks for a repair.
cxl_find_rec_gen_media() now reads the record, so take the xarray lock
there too, as cxl_find_rec_dram() does. Also make it return bool, since
its only caller just checks the result.
Fixes: 0b5ccb0de1e2 ("cxl/edac: Support for finding memory operation attributes from the current boot")
Signed-off-by: Jongwon Lee <ai@linux.com>
---
drivers/cxl/core/edac.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/drivers/cxl/core/edac.c b/drivers/cxl/core/edac.c
index 4624ab4644..42683b7c54 100644
--- a/drivers/cxl/core/edac.c
+++ b/drivers/cxl/core/edac.c
@@ -918,24 +918,27 @@ struct cxl_mem_repair_attrbs {
enum cxl_mem_repair_type repair_type;
};
-static struct cxl_event_gen_media *
-cxl_find_rec_gen_media(struct cxl_memdev *cxlmd,
- struct cxl_mem_repair_attrbs *attrbs)
+static inline bool cxl_rec_not_repairable(const struct cxl_event_media_hdr *hdr)
+{
+ return le64_to_cpu(hdr->phys_addr) & CXL_DPA_NOT_REPAIRABLE;
+}
+
+static bool cxl_find_rec_gen_media(struct cxl_memdev *cxlmd,
+ struct cxl_mem_repair_attrbs *attrbs)
{
struct cxl_mem_err_rec *array_rec = cxlmd->err_rec_array;
struct cxl_event_gen_media *rec;
+ bool found;
- if (!array_rec)
- return NULL;
+ if (!array_rec || attrbs->repair_type != CXL_PPR)
+ return false;
+ xa_lock(&array_rec->rec_gen_media);
rec = xa_load(&array_rec->rec_gen_media, attrbs->dpa);
- if (!rec)
- return NULL;
-
- if (attrbs->repair_type == CXL_PPR)
- return rec;
+ found = rec && !cxl_rec_not_repairable(&rec->media_hdr);
+ xa_unlock(&array_rec->rec_gen_media);
- return NULL;
+ return found;
}
/* Caller holds the xarray lock. The record may be freed once it is dropped. */
@@ -949,7 +952,7 @@ __cxl_find_rec_dram(struct xarray *rec_xarray,
lockdep_assert_held(&rec_xarray->xa_lock);
rec = xa_load(rec_xarray, attrbs->dpa);
- if (!rec)
+ if (!rec || cxl_rec_not_repairable(&rec->media_hdr))
return NULL;
validity_flags = get_unaligned_le16(rec->media_hdr.validity_flags);
--
2.55.0
next prev parent reply other threads:[~2026-11-08 2:20 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-08 2:20 [PATCH v5 0/3] cxl/edac: Fix event record lookups for memory repair Jongwon Lee
2026-11-08 2:20 ` [PATCH v5 1/3] cxl/edac: Read cached DRAM event records under the xarray lock Jongwon Lee
2026-11-08 2:20 ` Jongwon Lee [this message]
2026-11-10 12:53 ` [PATCH v5 2/3] cxl/edac: Skip event records marked NOT_REPAIRABLE Li Ming
2026-11-08 2:20 ` [PATCH v5 3/3] cxl/edac: Mask DPA flags in the event record cache key Jongwon Lee
2026-11-10 12:54 ` Li Ming
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=20261108022022.3352-3-ai@linux.com \
--to=ai@linux.com \
--cc=alison.schofield@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=djbw@kernel.org \
--cc=icheng@nvidia.com \
--cc=iweiny@kernel.org \
--cc=jic23@kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.li@zohomail.com \
--cc=vishal.l.verma@intel.com \
/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: link
Be 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.