]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cxl/port: Use __free() to drop put_device() for cxl_port
authorLi Ming <ming4.li@intel.com>
Fri, 30 Aug 2024 01:31:36 +0000 (01:31 +0000)
committerDave Jiang <dave.jiang@intel.com>
Tue, 3 Sep 2024 21:49:48 +0000 (14:49 -0700)
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: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Li Ming <ming4.li@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://patch.msgid.link/20240830013138.2256244-1-ming4.li@intel.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/pci.c
drivers/cxl/core/port.c
drivers/cxl/cxl.h
drivers/cxl/mem.c
drivers/cxl/pci.c

index 51132a575b2766a6409124e894d340903bff64bb..4725e37d90fb10f3962c486fa327771c73272f45 100644 (file)
@@ -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 aer_capability_regs aer_regs;
        struct cxl_dport *dport;
-       struct cxl_port *port;
        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)
                return;
 
-       put_device(&port->dev);
-
        if (!cxl_rch_get_aer_info(dport->regs.dport_aer, &aer_regs))
                return;
 
index bdd3275ad417e1cea188cc096ecac9cc45b77279..e1e7620764766ee1c7efadaed8ca388c1fcad758 100644 (file)
@@ -1477,12 +1477,11 @@ static void cxl_detach_ep(void *data)
                        .cxlmd = cxlmd,
                        .depth = i,
                };
-               struct device *dev;
                struct cxl_ep *ep;
                bool died = false;
 
-               dev = bus_find_device(&cxl_bus_type, NULL, &ctx,
-                                     port_has_memdev);
+               struct device *dev __free(put_device) =
+                       bus_find_device(&cxl_bus_type, NULL, &ctx, port_has_memdev);
                if (!dev)
                        continue;
                port = to_cxl_port(dev);
@@ -1512,7 +1511,6 @@ static void cxl_detach_ep(void *data)
                                dev_name(&port->dev));
                        delete_switch_port(port);
                }
-               put_device(&port->dev);
                device_unlock(&parent_port->dev);
        }
 }
@@ -1540,7 +1538,6 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
                              struct device *dport_dev)
 {
        struct device *dparent = grandparent(dport_dev);
-       struct cxl_port *port, *parent_port = NULL;
        struct cxl_dport *dport, *parent_dport;
        resource_size_t component_reg_phys;
        int rc;
@@ -1556,12 +1553,18 @@ static int add_port_attach_ep(struct cxl_memdev *cxlmd,
                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) {
                /* iterate to create this parent_port */
                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);
        if (!parent_port->dev.driver) {
                dev_warn(&cxlmd->dev,
@@ -1596,10 +1599,8 @@ out:
                         */
                        rc = -ENXIO;
                }
-               put_device(&port->dev);
        }
 
-       put_device(&parent_port->dev);
        return rc;
 }
 
@@ -1630,7 +1631,6 @@ retry:
                struct device *dport_dev = grandparent(iter);
                struct device *uport_dev;
                struct cxl_dport *dport;
-               struct cxl_port *port;
 
                /*
                 * The terminal "grandparent" in PCI is NULL and @platform_bus
@@ -1649,7 +1649,8 @@ retry:
                dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n",
                        dev_name(iter), dev_name(dport_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) {
                        dev_dbg(&cxlmd->dev,
                                "found already registered port %s:%s\n",
@@ -1664,18 +1665,13 @@ retry:
                         * the parent_port lock as the current port may be being
                         * reaped.
                         */
-                       if (rc && rc != -EBUSY) {
-                               put_device(&port->dev);
+                       if (rc && rc != -EBUSY)
                                return rc;
-                       }
 
                        /* Any more ports to add between this one and the root? */
-                       if (!dev_is_cxl_root_child(&port->dev)) {
-                               put_device(&port->dev);
+                       if (!dev_is_cxl_root_child(&port->dev))
                                continue;
-                       }
 
-                       put_device(&port->dev);
                        return 0;
                }
 
index 9afb407d438faea6f845a39459447810212f951f..84cf3b4d60a183440f35b4c17a9cb148d0b7c1ca 100644 (file)
@@ -744,6 +744,7 @@ struct cxl_root *find_cxl_root(struct cxl_port *port);
 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_port, struct cxl_port *, if (!IS_ERR_OR_NULL(_T)) put_device(&_T->dev))
 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd);
 void cxl_bus_rescan(void);
 void cxl_bus_drain(void);
index 7de232eaeb1747a928f1d2585579e2941e690005..ab9b8ab8df44ee24d7e057a618a40bbdaaabdced 100644 (file)
@@ -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_dev_state *cxlds = cxlmd->cxlds;
        struct device *endpoint_parent;
-       struct cxl_port *parent_port;
        struct cxl_dport *dport;
        struct dentry *dentry;
        int rc;
@@ -146,7 +145,8 @@ static int cxl_mem_probe(struct device *dev)
        if (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) {
                dev_err(dev, "CXL port topology not found\n");
                return -ENXIO;
@@ -179,7 +179,6 @@ static int cxl_mem_probe(struct device *dev)
        rc = devm_cxl_add_endpoint(endpoint_parent, cxlmd, dport);
 unlock:
        device_unlock(endpoint_parent);
-       put_device(&parent_port->dev);
        if (rc)
                return rc;
 
index 4be35dc22202dfb70d6a50122eda1fb0c4ff630e..26e75499abddbadd0ea160f43cca13f7cd02eb17 100644 (file)
@@ -473,7 +473,6 @@ static bool is_cxl_restricted(struct pci_dev *pdev)
 static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev,
                                  struct cxl_register_map *map)
 {
-       struct cxl_port *port;
        struct cxl_dport *dport;
        resource_size_t component_reg_phys;
 
@@ -482,14 +481,12 @@ static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev,
                .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)
                return -EPROBE_DEFER;
 
        component_reg_phys = cxl_rcd_component_reg_phys(&pdev->dev, dport);
-
-       put_device(&port->dev);
-
        if (component_reg_phys == CXL_RESOURCE_NONE)
                return -ENXIO;