Skip to content

Commit 7f569e9

Browse files
ming4lidavejiang
authored andcommitted
cxl/port: Use scoped_guard()/guard() to drop device_lock() for cxl_port
A device_lock() and device_unlock() pair can be replaced by a cleanup helper scoped_guard() or guard(), that can enhance code readability. In CXL subsystem, still use device_lock() and device_unlock() pairs for cxl port resource protection, most of them can be replaced by a scoped_guard() or a guard() simply. Suggested-by: Dan Williams <[email protected]> Signed-off-by: Li Ming <[email protected]> Reviewed-by: Jonathan Cameron <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Dave Jiang <[email protected]>
1 parent dd2617e commit 7f569e9

File tree

5 files changed

+72
-87
lines changed

5 files changed

+72
-87
lines changed

drivers/cxl/core/mbox.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,7 +1214,7 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd)
12141214
int rc;
12151215

12161216
/* synchronize with cxl_mem_probe() and decoder write operations */
1217-
device_lock(&cxlmd->dev);
1217+
guard(device)(&cxlmd->dev);
12181218
endpoint = cxlmd->endpoint;
12191219
down_read(&cxl_region_rwsem);
12201220
/*
@@ -1226,7 +1226,6 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd)
12261226
else
12271227
rc = -EBUSY;
12281228
up_read(&cxl_region_rwsem);
1229-
device_unlock(&cxlmd->dev);
12301229

12311230
return rc;
12321231
}

drivers/cxl/core/port.c

Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,18 +1258,13 @@ EXPORT_SYMBOL_NS_GPL(devm_cxl_add_rch_dport, CXL);
12581258
static int add_ep(struct cxl_ep *new)
12591259
{
12601260
struct cxl_port *port = new->dport->port;
1261-
int rc;
12621261

1263-
device_lock(&port->dev);
1264-
if (port->dead) {
1265-
device_unlock(&port->dev);
1262+
guard(device)(&port->dev);
1263+
if (port->dead)
12661264
return -ENXIO;
1267-
}
1268-
rc = xa_insert(&port->endpoints, (unsigned long)new->ep, new,
1269-
GFP_KERNEL);
1270-
device_unlock(&port->dev);
12711265

1272-
return rc;
1266+
return xa_insert(&port->endpoints, (unsigned long)new->ep,
1267+
new, GFP_KERNEL);
12731268
}
12741269

12751270
/**
@@ -1393,14 +1388,14 @@ static void delete_endpoint(void *data)
13931388
struct cxl_port *endpoint = cxlmd->endpoint;
13941389
struct device *host = endpoint_host(endpoint);
13951390

1396-
device_lock(host);
1397-
if (host->driver && !endpoint->dead) {
1398-
devm_release_action(host, cxl_unlink_parent_dport, endpoint);
1399-
devm_release_action(host, cxl_unlink_uport, endpoint);
1400-
devm_release_action(host, unregister_port, endpoint);
1391+
scoped_guard(device, host) {
1392+
if (host->driver && !endpoint->dead) {
1393+
devm_release_action(host, cxl_unlink_parent_dport, endpoint);
1394+
devm_release_action(host, cxl_unlink_uport, endpoint);
1395+
devm_release_action(host, unregister_port, endpoint);
1396+
}
1397+
cxlmd->endpoint = NULL;
14011398
}
1402-
cxlmd->endpoint = NULL;
1403-
device_unlock(host);
14041399
put_device(&endpoint->dev);
14051400
put_device(host);
14061401
}
@@ -1565,40 +1560,38 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
15651560
* dereferencing the device of the port before the parent_port releasing.
15661561
*/
15671562
struct cxl_port *port __free(put_cxl_port) = NULL;
1568-
device_lock(&parent_port->dev);
1569-
if (!parent_port->dev.driver) {
1570-
dev_warn(&cxlmd->dev,
1571-
"port %s:%s disabled, failed to enumerate CXL.mem\n",
1572-
dev_name(&parent_port->dev), dev_name(uport_dev));
1573-
port = ERR_PTR(-ENXIO);
1574-
goto out;
1575-
}
1563+
scoped_guard(device, &parent_port->dev) {
1564+
if (!parent_port->dev.driver) {
1565+
dev_warn(&cxlmd->dev,
1566+
"port %s:%s disabled, failed to enumerate CXL.mem\n",
1567+
dev_name(&parent_port->dev), dev_name(uport_dev));
1568+
return -ENXIO;
1569+
}
1570+
1571+
port = find_cxl_port_at(parent_port, dport_dev, &dport);
1572+
if (!port) {
1573+
component_reg_phys = find_component_registers(uport_dev);
1574+
port = devm_cxl_add_port(&parent_port->dev, uport_dev,
1575+
component_reg_phys, parent_dport);
1576+
if (IS_ERR(port))
1577+
return PTR_ERR(port);
15761578

1577-
port = find_cxl_port_at(parent_port, dport_dev, &dport);
1578-
if (!port) {
1579-
component_reg_phys = find_component_registers(uport_dev);
1580-
port = devm_cxl_add_port(&parent_port->dev, uport_dev,
1581-
component_reg_phys, parent_dport);
1582-
/* retry find to pick up the new dport information */
1583-
if (!IS_ERR(port))
1579+
/* retry find to pick up the new dport information */
15841580
port = find_cxl_port_at(parent_port, dport_dev, &dport);
1581+
if (!port)
1582+
return -ENXIO;
1583+
}
15851584
}
1586-
out:
1587-
device_unlock(&parent_port->dev);
15881585

1589-
if (IS_ERR(port))
1590-
rc = PTR_ERR(port);
1591-
else {
1592-
dev_dbg(&cxlmd->dev, "add to new port %s:%s\n",
1593-
dev_name(&port->dev), dev_name(port->uport_dev));
1594-
rc = cxl_add_ep(dport, &cxlmd->dev);
1595-
if (rc == -EBUSY) {
1596-
/*
1597-
* "can't" happen, but this error code means
1598-
* something to the caller, so translate it.
1599-
*/
1600-
rc = -ENXIO;
1601-
}
1586+
dev_dbg(&cxlmd->dev, "add to new port %s:%s\n",
1587+
dev_name(&port->dev), dev_name(port->uport_dev));
1588+
rc = cxl_add_ep(dport, &cxlmd->dev);
1589+
if (rc == -EBUSY) {
1590+
/*
1591+
* "can't" happen, but this error code means
1592+
* something to the caller, so translate it.
1593+
*/
1594+
rc = -ENXIO;
16021595
}
16031596

16041597
return rc;
@@ -1979,7 +1972,6 @@ EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, CXL);
19791972
int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)
19801973
{
19811974
struct cxl_port *port;
1982-
int rc;
19831975

19841976
if (WARN_ON_ONCE(!cxld))
19851977
return -EINVAL;
@@ -1989,11 +1981,8 @@ int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)
19891981

19901982
port = to_cxl_port(cxld->dev.parent);
19911983

1992-
device_lock(&port->dev);
1993-
rc = cxl_decoder_add_locked(cxld, target_map);
1994-
device_unlock(&port->dev);
1995-
1996-
return rc;
1984+
guard(device)(&port->dev);
1985+
return cxl_decoder_add_locked(cxld, target_map);
19971986
}
19981987
EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, CXL);
19991988

drivers/cxl/core/region.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3094,11 +3094,11 @@ static void cxlr_release_nvdimm(void *_cxlr)
30943094
struct cxl_region *cxlr = _cxlr;
30953095
struct cxl_nvdimm_bridge *cxl_nvb = cxlr->cxl_nvb;
30963096

3097-
device_lock(&cxl_nvb->dev);
3098-
if (cxlr->cxlr_pmem)
3099-
devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister,
3100-
cxlr->cxlr_pmem);
3101-
device_unlock(&cxl_nvb->dev);
3097+
scoped_guard(device, &cxl_nvb->dev) {
3098+
if (cxlr->cxlr_pmem)
3099+
devm_release_action(&cxl_nvb->dev, cxlr_pmem_unregister,
3100+
cxlr->cxlr_pmem);
3101+
}
31023102
cxlr->cxl_nvb = NULL;
31033103
put_device(&cxl_nvb->dev);
31043104
}
@@ -3134,13 +3134,14 @@ static int devm_cxl_add_pmem_region(struct cxl_region *cxlr)
31343134
dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent),
31353135
dev_name(dev));
31363136

3137-
device_lock(&cxl_nvb->dev);
3138-
if (cxl_nvb->dev.driver)
3139-
rc = devm_add_action_or_reset(&cxl_nvb->dev,
3140-
cxlr_pmem_unregister, cxlr_pmem);
3141-
else
3142-
rc = -ENXIO;
3143-
device_unlock(&cxl_nvb->dev);
3137+
scoped_guard(device, &cxl_nvb->dev) {
3138+
if (cxl_nvb->dev.driver)
3139+
rc = devm_add_action_or_reset(&cxl_nvb->dev,
3140+
cxlr_pmem_unregister,
3141+
cxlr_pmem);
3142+
else
3143+
rc = -ENXIO;
3144+
}
31443145

31453146
if (rc)
31463147
goto err_bridge;

drivers/cxl/mem.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -168,19 +168,17 @@ static int cxl_mem_probe(struct device *dev)
168168

169169
cxl_setup_parent_dport(dev, dport);
170170

171-
device_lock(endpoint_parent);
172-
if (!endpoint_parent->driver) {
173-
dev_err(dev, "CXL port topology %s not enabled\n",
174-
dev_name(endpoint_parent));
175-
rc = -ENXIO;
176-
goto unlock;
177-
}
171+
scoped_guard(device, endpoint_parent) {
172+
if (!endpoint_parent->driver) {
173+
dev_err(dev, "CXL port topology %s not enabled\n",
174+
dev_name(endpoint_parent));
175+
return -ENXIO;
176+
}
178177

179-
rc = devm_cxl_add_endpoint(endpoint_parent, cxlmd, dport);
180-
unlock:
181-
device_unlock(endpoint_parent);
182-
if (rc)
183-
return rc;
178+
rc = devm_cxl_add_endpoint(endpoint_parent, cxlmd, dport);
179+
if (rc)
180+
return rc;
181+
}
184182

185183
/*
186184
* The kernel may be operating out of CXL memory on this device,

drivers/cxl/pmem.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -233,15 +233,13 @@ static int detach_nvdimm(struct device *dev, void *data)
233233
if (!is_cxl_nvdimm(dev))
234234
return 0;
235235

236-
device_lock(dev);
237-
if (!dev->driver)
238-
goto out;
239-
240-
cxl_nvd = to_cxl_nvdimm(dev);
241-
if (cxl_nvd->cxlmd && cxl_nvd->cxlmd->cxl_nvb == data)
242-
release = true;
243-
out:
244-
device_unlock(dev);
236+
scoped_guard(device, dev) {
237+
if (dev->driver) {
238+
cxl_nvd = to_cxl_nvdimm(dev);
239+
if (cxl_nvd->cxlmd && cxl_nvd->cxlmd->cxl_nvb == data)
240+
release = true;
241+
}
242+
}
245243
if (release)
246244
device_release_driver(dev);
247245
return 0;

0 commit comments

Comments
 (0)