Re: [PATCH v2] cxl/port: Restart port enumeration when a sibling adds the dport first
Dave Jiang <[email protected]>
| Newsgroups | org.kernel.vger.linux-cxl |
|---|---|
| Message-ID | <[email protected]> |
On 7/13/26 7:04 PM, Alison Schofield wrote:
> Endpoint probes can race while enumerating a shared switch. If a
> sibling probe adds the dport first, the losing probe finds the dport
> already present, gets -EBUSY, and fails to enumerate the endpoint.
>
> Treat this race the same as the existing port-created case by
> restarting the port walk, allowing it to find the existing dport
> and continue enumeration.
>
> This race was discovered while testing a cxl_test mixed-granularity
> topology, where twelve endpoints behind shared switches are probed in
> parallel during module load.
>
> Fixes: 4f06d81e7c6a ("cxl: Defer dport allocation for switch ports")
> Signed-off-by: Alison Schofield <[email protected]>
Applied to cxl/next
a623128bc2a1
> ---
>
> Changes in v2:
> - Commit log: note that race is btw different dport add paths for the
> same shared dport (Ming)
>
> drivers/cxl/core/port.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
> index 1215ee4f4035..65f2d2f1eb00 100644
> --- a/drivers/cxl/core/port.c
> +++ b/drivers/cxl/core/port.c
> @@ -1749,8 +1749,8 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
> parent_dport, uport_dev,
> dport_dev);
> if (IS_ERR(dport)) {
> - /* Port already exists, restart iteration */
> - if (PTR_ERR(dport) == -EAGAIN)
> + /* Port or dport already exists, restart iteration */
> + if (PTR_ERR(dport) == -EAGAIN || PTR_ERR(dport) == -EBUSY)
> return 0;
> return PTR_ERR(dport);
> }
>
> base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482