]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cxl: Add helper to delete dport
authorDave Jiang <dave.jiang@intel.com>
Fri, 29 Aug 2025 18:09:20 +0000 (11:09 -0700)
committerDave Jiang <dave.jiang@intel.com>
Wed, 17 Sep 2025 15:51:33 +0000 (08:51 -0700)
Refactor the code in reap_dports() out to provide a helper function that
reaps a single dport. This will be used later in the cleanup path for
allocating a dport. Renaming to del_port() and del_dports() to mirror
devm_cxl_add_dport().

[dj] Fixed up subject per Robert

Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: Li Ming <ming.li@zohomail.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Tested-by: Robert Richter <rrichter@amd.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/port.c

index 855623cebd7d0ce0b08e223a8f39009f400330fc..88f19abf33273abcc789ca13d6e29633a15e0e17 100644 (file)
@@ -1432,7 +1432,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, "CXL");
  * through ->remove(). This "bottom-up" removal selectively removes individual
  * child ports manually. This depends on devm_cxl_add_port() to not change is
  * devm action registration order, and for dports to have already been
- * destroyed by reap_dports().
+ * destroyed by del_dports().
  */
 static void delete_switch_port(struct cxl_port *port)
 {
@@ -1441,18 +1441,24 @@ static void delete_switch_port(struct cxl_port *port)
        devm_release_action(port->dev.parent, unregister_port, port);
 }
 
-static void reap_dports(struct cxl_port *port)
+static void del_dport(struct cxl_dport *dport)
+{
+       struct cxl_port *port = dport->port;
+
+       devm_release_action(&port->dev, cxl_dport_unlink, dport);
+       devm_release_action(&port->dev, cxl_dport_remove, dport);
+       devm_kfree(&port->dev, dport);
+}
+
+static void del_dports(struct cxl_port *port)
 {
        struct cxl_dport *dport;
        unsigned long index;
 
        device_lock_assert(&port->dev);
 
-       xa_for_each(&port->dports, index, dport) {
-               devm_release_action(&port->dev, cxl_dport_unlink, dport);
-               devm_release_action(&port->dev, cxl_dport_remove, dport);
-               devm_kfree(&port->dev, dport);
-       }
+       xa_for_each(&port->dports, index, dport)
+               del_dport(dport);
 }
 
 struct detach_ctx {
@@ -1510,7 +1516,7 @@ static void cxl_detach_ep(void *data)
                         */
                        died = true;
                        port->dead = true;
-                       reap_dports(port);
+                       del_dports(port);
                }
                device_unlock(&port->dev);