Linux CXL
 help / color / mirror / Atom feed
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
> 

  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