Skip to content

Commit db9a3a3

Browse files
jic23djbw
authored andcommitted
cxl: Fix cleanup of port devices on failure to probe driver.
The device is created, and then there is a check if a driver succesfully bound to it. In event of failing the bind (e.g. failure in cxl_port_probe()) the device is left registered. When a bus rescan later occurs, fresh devices are created leading to a multiple device representing the same underlying hardware. Bad things may follow and at very least we have far too many devices. Fix by ensuring autoremove is registered if the device create succeeds, but doesn't depend on sucessful binding to a driver. Bug was observed as side effect of incorrect ownership in [PATCH v9 6/9] cxl/port: Read CDAT table but will result from any failure to in cxl_port_probe(). Fixes: 8dd2bc0 ("cxl/mem: Add the cxl_mem driver") Signed-off-by: Jonathan Cameron <[email protected]> Reviewed-by: Ira Weiny <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dan Williams <[email protected]>
1 parent f6f0dab commit db9a3a3

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/cxl/mem.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ static int create_endpoint(struct cxl_memdev *cxlmd,
2929
{
3030
struct cxl_dev_state *cxlds = cxlmd->cxlds;
3131
struct cxl_port *endpoint;
32+
int rc;
3233

3334
endpoint = devm_cxl_add_port(&parent_port->dev, &cxlmd->dev,
3435
cxlds->component_reg_phys, parent_port);
@@ -37,13 +38,17 @@ static int create_endpoint(struct cxl_memdev *cxlmd,
3738

3839
dev_dbg(&cxlmd->dev, "add: %s\n", dev_name(&endpoint->dev));
3940

41+
rc = cxl_endpoint_autoremove(cxlmd, endpoint);
42+
if (rc)
43+
return rc;
44+
4045
if (!endpoint->dev.driver) {
4146
dev_err(&cxlmd->dev, "%s failed probe\n",
4247
dev_name(&endpoint->dev));
4348
return -ENXIO;
4449
}
4550

46-
return cxl_endpoint_autoremove(cxlmd, endpoint);
51+
return 0;
4752
}
4853

4954
static void enable_suspend(void *data)

0 commit comments

Comments
 (0)