From: Alison Schofield <alison.schofield@intel.com>
To: Richard Cheng <icheng@nvidia.com>
Cc: <dave@stgolabs.net>, <jic23@kernel.org>, <dave.jiang@intel.com>,
<vishal.l.verma@intel.com>, <iweiny@kernel.org>,
<ming.li@zohomail.com>, <gourry@gourry.net>, <rrichter@amd.com>,
<linux-cxl@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<kees@kernel.org>, <newtonl@nvidia.com>, <kristinc@nvidia.com>,
<kaihengf@nvidia.com>, <kobak@nvidia.com>
Subject: Re: [PATCH v7 6/7] cxl/region: Reject poison scan for decoder without a partition
Date: Thu, 3 Sep 2026 22:57:05 -0700 [thread overview]
Message-ID: <appdsV1_A-Tu_j9j@aschofie-mobl2.lan> (raw)
In-Reply-To: <20260902053839.25595-7-icheng@nvidia.com>
On Wed, Sep 02, 2026 at 01:38:38PM +0800, Richard Cheng wrote:
> __cxl_dpa_reserve() may leave cxled->part at -1 when a decoder's DPA
> range doesn't map to any reported partition, while still keeping
> dpa_res. poison_by_decoder() then indexes cxlds->part[-1], causing an
> out-of-bounds read when poison collection is triggered.
>
> Return -ENODEV before accessing the partition array when no partition was
> assigned.
>
> Fixes: be5cbd084027 ("cxl: Kill enum cxl_decoder_mode")
> Signed-off-by: Richard Cheng <icheng@nvidia.com>
> ---
> drivers/cxl/core/region.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index b7dc5d4988da..afe3fb57b7fe 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -2954,6 +2954,8 @@ static int poison_by_decoder(struct device *dev, void *arg)
> cxled = to_cxl_endpoint_decoder(dev);
> if (!cxled->dpa_res)
> return rc;
> + if (cxled->part < 0)
> + return -ENODEV;
-ENODEV disables poison listing for the whole memdev since this is a
device_for_each_child() callback.
Before be5cbd084027 that decoder was scanned like any other and the mode was
only ever compared, never used as an index, so CXL_DECODER_NONE and
CXL_DECODER_DEAD both still got their DPA read and the walk continued.
Can the fix be less instrusive and not fail the scan?
Here's a diff, totally untested:
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index afe3fb57b7fe..ebf06edf23be 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -2942,9 +2942,9 @@ static int poison_by_decoder(struct device *dev, void *arg)
{
struct cxl_poison_context *ctx = arg;
struct cxl_endpoint_decoder *cxled;
- enum cxl_partition_mode mode;
struct cxl_dev_state *cxlds;
struct cxl_memdev *cxlmd;
+ bool tolerate_efault;
u64 offset, length;
int rc = 0;
@@ -2954,18 +2954,18 @@ static int poison_by_decoder(struct device *dev, void *arg)
cxled = to_cxl_endpoint_decoder(dev);
if (!cxled->dpa_res)
return rc;
- if (cxled->part < 0)
- return -ENODEV;
cxlmd = cxled_to_memdev(cxled);
cxlds = cxlmd->cxlds;
- mode = cxlds->part[cxled->part].mode;
+ /* Without a partition the mode is unknown, do not tolerate -EFAULT */
+ tolerate_efault = cxled->part >= 0 &&
+ cxlds->part[cxled->part].mode == CXL_PARTMODE_RAM;
if (cxled->skip) {
offset = cxled->dpa_res->start - cxled->skip;
length = cxled->skip;
rc = cxl_mem_get_poison(cxlmd, offset, length, NULL);
- if (rc == -EFAULT && mode == CXL_PARTMODE_RAM)
+ if (rc == -EFAULT && tolerate_efault)
rc = 0;
if (rc)
return rc;
@@ -2974,7 +2974,7 @@ static int poison_by_decoder(struct device *dev, void *arg)
offset = cxled->dpa_res->start;
length = cxled->dpa_res->end - offset + 1;
rc = cxl_mem_get_poison(cxlmd, offset, length, cxled->cxld.region);
- if (rc == -EFAULT && mode == CXL_PARTMODE_RAM)
+ if (rc == -EFAULT && tolerate_efault)
rc = 0;
if (rc)
return rc;
(END)
>
> cxlmd = cxled_to_memdev(cxled);
> cxlds = cxlmd->cxlds;
> --
> 2.53.0
>
next prev parent reply other threads:[~2026-09-04 5:57 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 5:38 [PATCH v7 0/7] cxl: Sashiko bug fixes Richard Cheng
2026-09-02 5:38 ` [PATCH v7 1/7] cxl/features: Reject feature offset that overflows 16-bit field Richard Cheng
2026-09-04 5:23 ` Alison Schofield
2026-09-02 5:38 ` [PATCH v7 2/7] cxl/region: Scan all partitions for unmapped poison Richard Cheng
2026-09-02 5:38 ` [PATCH v7 3/7] cxl/region: Don't leak tolerated RAM -EFAULT from unmapped poison scan Richard Cheng
2026-09-04 5:25 ` Alison Schofield
2026-09-02 5:38 ` [PATCH v7 4/7] cxl/region: Start unmapped poison scan at the committed decoder boundary Richard Cheng
2026-09-02 5:38 ` [PATCH v7 5/7] cxl/memdev: Don't overwrite the error from an earlier partition poison query Richard Cheng
2026-09-04 5:31 ` Alison Schofield
2026-09-02 5:38 ` [PATCH v7 6/7] cxl/region: Reject poison scan for decoder without a partition Richard Cheng
2026-09-02 5:52 ` sashiko-bot
2026-09-04 5:57 ` Alison Schofield [this message]
2026-09-02 5:38 ` [PATCH v7 7/7] cxl/fwctl: Propagate feature RPC delivery errors Richard Cheng
2026-09-04 5:21 ` Alison Schofield
2026-09-04 5:20 ` [PATCH v7 0/7] cxl: Sashiko bug fixes Alison Schofield
2026-09-04 16:19 ` Dave Jiang
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=appdsV1_A-Tu_j9j@aschofie-mobl2.lan \
--to=alison.schofield@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=gourry@gourry.net \
--cc=icheng@nvidia.com \
--cc=iweiny@kernel.org \
--cc=jic23@kernel.org \
--cc=kaihengf@nvidia.com \
--cc=kees@kernel.org \
--cc=kobak@nvidia.com \
--cc=kristinc@nvidia.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.li@zohomail.com \
--cc=newtonl@nvidia.com \
--cc=rrichter@amd.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox