Commit dd2617eb authored by Li Ming's avatar Li Ming Committed by Dave Jiang

cxl/port: Use __free() to drop put_device() for cxl_port

Using scope-based resource management __free() marco with a new helper
called put_cxl_port() to drop open coded the put_device() used to
dereference the 'struct device' in cxl_port.
Suggested-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarLi Ming <ming4.li@intel.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://patch.msgid.link/20240830013138.2256244-1-ming4.li@intel.comSigned-off-by: default avatarDave Jiang <dave.jiang@intel.com>
parent fa724cd7
...@@ -915,15 +915,13 @@ static void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds) ...@@ -915,15 +915,13 @@ static void cxl_handle_rdport_errors(struct cxl_dev_state *cxlds)
struct pci_dev *pdev = to_pci_dev(cxlds->dev); struct pci_dev *pdev = to_pci_dev(cxlds->dev);
struct aer_capability_regs aer_regs; struct aer_capability_regs aer_regs;
struct cxl_dport *dport; struct cxl_dport *dport;
struct cxl_port *port;
int severity; int severity;
port = cxl_pci_find_port(pdev, &dport); struct cxl_port *port __free(put_cxl_port) =
cxl_pci_find_port(pdev, &dport);
if (!port) if (!port)
return; return;
put_device(&port->dev);
if (!cxl_rch_get_aer_info(dport->regs.dport_aer, &aer_regs)) if (!cxl_rch_get_aer_info(dport->regs.dport_aer, &aer_regs))
return; return;
......
...@@ -1477,12 +1477,11 @@ static void cxl_detach_ep(void *data) ...@@ -1477,12 +1477,11 @@ static void cxl_detach_ep(void *data)
.cxlmd = cxlmd, .cxlmd = cxlmd,
.depth = i, .depth = i,
}; };
struct device *dev;
struct cxl_ep *ep; struct cxl_ep *ep;
bool died = false; bool died = false;
dev = bus_find_device(&cxl_bus_type, NULL, &ctx, struct device *dev __free(put_device) =
port_has_memdev); bus_find_device(&cxl_bus_type, NULL, &ctx, port_has_memdev);
if (!dev) if (!dev)
continue; continue;
port = to_cxl_port(dev); port = to_cxl_port(dev);
...@@ -1512,7 +1511,6 @@ static void cxl_detach_ep(void *data) ...@@ -1512,7 +1511,6 @@ static void cxl_detach_ep(void *data)
dev_name(&port->dev)); dev_name(&port->dev));
delete_switch_port(port); delete_switch_port(port);
} }
put_device(&port->dev);
device_unlock(&parent_port->dev); device_unlock(&parent_port->dev);
} }
} }
...@@ -1540,7 +1538,6 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd, ...@@ -1540,7 +1538,6 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
struct device *dport_dev) struct device *dport_dev)
{ {
struct device *dparent = grandparent(dport_dev); struct device *dparent = grandparent(dport_dev);
struct cxl_port *port, *parent_port = NULL;
struct cxl_dport *dport, *parent_dport; struct cxl_dport *dport, *parent_dport;
resource_size_t component_reg_phys; resource_size_t component_reg_phys;
int rc; int rc;
...@@ -1556,12 +1553,18 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd, ...@@ -1556,12 +1553,18 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
return -ENXIO; return -ENXIO;
} }
parent_port = find_cxl_port(dparent, &parent_dport); struct cxl_port *parent_port __free(put_cxl_port) =
find_cxl_port(dparent, &parent_dport);
if (!parent_port) { if (!parent_port) {
/* iterate to create this parent_port */ /* iterate to create this parent_port */
return -EAGAIN; return -EAGAIN;
} }
/*
* Definition with __free() here to keep the sequence of
* dereferencing the device of the port before the parent_port releasing.
*/
struct cxl_port *port __free(put_cxl_port) = NULL;
device_lock(&parent_port->dev); device_lock(&parent_port->dev);
if (!parent_port->dev.driver) { if (!parent_port->dev.driver) {
dev_warn(&cxlmd->dev, dev_warn(&cxlmd->dev,
...@@ -1596,10 +1599,8 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd, ...@@ -1596,10 +1599,8 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
*/ */
rc = -ENXIO; rc = -ENXIO;
} }
put_device(&port->dev);
} }
put_device(&parent_port->dev);
return rc; return rc;
} }
...@@ -1630,7 +1631,6 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd) ...@@ -1630,7 +1631,6 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd)
struct device *dport_dev = grandparent(iter); struct device *dport_dev = grandparent(iter);
struct device *uport_dev; struct device *uport_dev;
struct cxl_dport *dport; struct cxl_dport *dport;
struct cxl_port *port;
/* /*
* The terminal "grandparent" in PCI is NULL and @platform_bus * The terminal "grandparent" in PCI is NULL and @platform_bus
...@@ -1649,7 +1649,8 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd) ...@@ -1649,7 +1649,8 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd)
dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n", dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n",
dev_name(iter), dev_name(dport_dev), dev_name(iter), dev_name(dport_dev),
dev_name(uport_dev)); dev_name(uport_dev));
port = find_cxl_port(dport_dev, &dport); struct cxl_port *port __free(put_cxl_port) =
find_cxl_port(dport_dev, &dport);
if (port) { if (port) {
dev_dbg(&cxlmd->dev, dev_dbg(&cxlmd->dev,
"found already registered port %s:%s\n", "found already registered port %s:%s\n",
...@@ -1664,18 +1665,13 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd) ...@@ -1664,18 +1665,13 @@ int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd)
* the parent_port lock as the current port may be being * the parent_port lock as the current port may be being
* reaped. * reaped.
*/ */
if (rc && rc != -EBUSY) { if (rc && rc != -EBUSY)
put_device(&port->dev);
return rc; return rc;
}
/* Any more ports to add between this one and the root? */ /* Any more ports to add between this one and the root? */
if (!dev_is_cxl_root_child(&port->dev)) { if (!dev_is_cxl_root_child(&port->dev))
put_device(&port->dev);
continue; continue;
}
put_device(&port->dev);
return 0; return 0;
} }
......
...@@ -744,6 +744,7 @@ struct cxl_root *find_cxl_root(struct cxl_port *port); ...@@ -744,6 +744,7 @@ struct cxl_root *find_cxl_root(struct cxl_port *port);
void put_cxl_root(struct cxl_root *cxl_root); void put_cxl_root(struct cxl_root *cxl_root);
DEFINE_FREE(put_cxl_root, struct cxl_root *, if (_T) put_cxl_root(_T)) DEFINE_FREE(put_cxl_root, struct cxl_root *, if (_T) put_cxl_root(_T))
DEFINE_FREE(put_cxl_port, struct cxl_port *, if (!IS_ERR_OR_NULL(_T)) put_device(&_T->dev))
int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd); int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
void cxl_bus_rescan(void); void cxl_bus_rescan(void);
void cxl_bus_drain(void); void cxl_bus_drain(void);
......
...@@ -109,7 +109,6 @@ static int cxl_mem_probe(struct device *dev) ...@@ -109,7 +109,6 @@ static int cxl_mem_probe(struct device *dev)
struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds); struct cxl_memdev_state *mds = to_cxl_memdev_state(cxlmd->cxlds);
struct cxl_dev_state *cxlds = cxlmd->cxlds; struct cxl_dev_state *cxlds = cxlmd->cxlds;
struct device *endpoint_parent; struct device *endpoint_parent;
struct cxl_port *parent_port;
struct cxl_dport *dport; struct cxl_dport *dport;
struct dentry *dentry; struct dentry *dentry;
int rc; int rc;
...@@ -146,7 +145,8 @@ static int cxl_mem_probe(struct device *dev) ...@@ -146,7 +145,8 @@ static int cxl_mem_probe(struct device *dev)
if (rc) if (rc)
return rc; return rc;
parent_port = cxl_mem_find_port(cxlmd, &dport); struct cxl_port *parent_port __free(put_cxl_port) =
cxl_mem_find_port(cxlmd, &dport);
if (!parent_port) { if (!parent_port) {
dev_err(dev, "CXL port topology not found\n"); dev_err(dev, "CXL port topology not found\n");
return -ENXIO; return -ENXIO;
...@@ -179,7 +179,6 @@ static int cxl_mem_probe(struct device *dev) ...@@ -179,7 +179,6 @@ static int cxl_mem_probe(struct device *dev)
rc = devm_cxl_add_endpoint(endpoint_parent, cxlmd, dport); rc = devm_cxl_add_endpoint(endpoint_parent, cxlmd, dport);
unlock: unlock:
device_unlock(endpoint_parent); device_unlock(endpoint_parent);
put_device(&parent_port->dev);
if (rc) if (rc)
return rc; return rc;
......
...@@ -473,7 +473,6 @@ static bool is_cxl_restricted(struct pci_dev *pdev) ...@@ -473,7 +473,6 @@ static bool is_cxl_restricted(struct pci_dev *pdev)
static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev, static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev,
struct cxl_register_map *map) struct cxl_register_map *map)
{ {
struct cxl_port *port;
struct cxl_dport *dport; struct cxl_dport *dport;
resource_size_t component_reg_phys; resource_size_t component_reg_phys;
...@@ -482,14 +481,12 @@ static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev, ...@@ -482,14 +481,12 @@ static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev,
.resource = CXL_RESOURCE_NONE, .resource = CXL_RESOURCE_NONE,
}; };
port = cxl_pci_find_port(pdev, &dport); struct cxl_port *port __free(put_cxl_port) =
cxl_pci_find_port(pdev, &dport);
if (!port) if (!port)
return -EPROBE_DEFER; return -EPROBE_DEFER;
component_reg_phys = cxl_rcd_component_reg_phys(&pdev->dev, dport); component_reg_phys = cxl_rcd_component_reg_phys(&pdev->dev, dport);
put_device(&port->dev);
if (component_reg_phys == CXL_RESOURCE_NONE) if (component_reg_phys == CXL_RESOURCE_NONE)
return -ENXIO; return -ENXIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment