Skip to content

Commit 3d6ebf1

Browse files
djbwweiny2
authored andcommitted
cxl/port: Fix cxl_bus_rescan() vs bus_rescan_devices()
It turns out since its original introduction, pre-2.6.12, bus_rescan_devices() has skipped devices that might be in the process of attaching or detaching from their driver. For CXL this behavior is unwanted and expects that cxl_bus_rescan() is a probe barrier. That behavior is simple enough to achieve with bus_for_each_dev() paired with call to device_attach(), and it is unclear why bus_rescan_devices() took the position of lockless consumption of dev->driver which is racy. The "Fixes:" but no "Cc: stable" on this patch reflects that the issue is merely by inspection since the bug that triggered the discovery of this potential problem [1] is fixed by other means. However, a stable backport should do no harm. Fixes: 8dd2bc0 ("cxl/mem: Add the cxl_mem driver") Link: http://lore.kernel.org/[email protected] [1] Signed-off-by: Dan Williams <[email protected]> Tested-by: Gregory Price <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]> Reviewed-by: Ira Weiny <[email protected]> Link: https://patch.msgid.link/172964781104.81806.4277549800082443769.stgit@dwillia2-xfh.jf.intel.com Signed-off-by: Ira Weiny <[email protected]>
1 parent 6575b26 commit 3d6ebf1

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

drivers/cxl/core/port.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2084,11 +2084,18 @@ static void cxl_bus_remove(struct device *dev)
20842084

20852085
static struct workqueue_struct *cxl_bus_wq;
20862086

2087-
static void cxl_bus_rescan_queue(struct work_struct *w)
2087+
static int cxl_rescan_attach(struct device *dev, void *data)
20882088
{
2089-
int rc = bus_rescan_devices(&cxl_bus_type);
2089+
int rc = device_attach(dev);
2090+
2091+
dev_vdbg(dev, "rescan: %s\n", rc ? "attach" : "detached");
20902092

2091-
pr_debug("CXL bus rescan result: %d\n", rc);
2093+
return 0;
2094+
}
2095+
2096+
static void cxl_bus_rescan_queue(struct work_struct *w)
2097+
{
2098+
bus_for_each_dev(&cxl_bus_type, NULL, NULL, cxl_rescan_attach);
20922099
}
20932100

20942101
void cxl_bus_rescan(void)

0 commit comments

Comments
 (0)