]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown
authorKoichiro Den <den@valinux.co.jp>
Thu, 26 Feb 2026 08:41:39 +0000 (17:41 +0900)
committerManivannan Sadhasivam <mani@kernel.org>
Wed, 4 Mar 2026 06:39:49 +0000 (12:09 +0530)
epf_ntb_epc_destroy() duplicates the teardown that the caller is
supposed to do later. This leads to an oops when .allow_link fails or
when .drop_link is performed. Remove the helper.

Also drop pci_epc_put(). EPC device refcounting is tied to configfs EPC
group lifetime, and pci_epc_put() in the .drop_link path is sufficient.

Fixes: 8b821cf76150 ("PCI: endpoint: Add EP function driver to provide NTB functionality")
Signed-off-by: Koichiro Den <den@valinux.co.jp>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20260226084142.2226875-3-den@valinux.co.jp
drivers/pci/endpoint/functions/pci-epf-ntb.c

index a3a588e522e715199b0baec06970b4d836cf2725..2bdcc35b652cfb4d72f93c2d3a5dffb6a2d5258b 100644 (file)
@@ -1494,47 +1494,6 @@ err_alloc_peer_mem:
        return ret;
 }
 
-/**
- * epf_ntb_epc_destroy_interface() - Cleanup NTB EPC interface
- * @ntb: NTB device that facilitates communication between HOST1 and HOST2
- * @type: PRIMARY interface or SECONDARY interface
- *
- * Unbind NTB function device from EPC and relinquish reference to pci_epc
- * for each of the interface.
- */
-static void epf_ntb_epc_destroy_interface(struct epf_ntb *ntb,
-                                         enum pci_epc_interface_type type)
-{
-       struct epf_ntb_epc *ntb_epc;
-       struct pci_epc *epc;
-       struct pci_epf *epf;
-
-       if (type < 0)
-               return;
-
-       epf = ntb->epf;
-       ntb_epc = ntb->epc[type];
-       if (!ntb_epc)
-               return;
-       epc = ntb_epc->epc;
-       pci_epc_remove_epf(epc, epf, type);
-       pci_epc_put(epc);
-}
-
-/**
- * epf_ntb_epc_destroy() - Cleanup NTB EPC interface
- * @ntb: NTB device that facilitates communication between HOST1 and HOST2
- *
- * Wrapper for epf_ntb_epc_destroy_interface() to cleanup all the NTB interfaces
- */
-static void epf_ntb_epc_destroy(struct epf_ntb *ntb)
-{
-       enum pci_epc_interface_type type;
-
-       for (type = PRIMARY_INTERFACE; type <= SECONDARY_INTERFACE; type++)
-               epf_ntb_epc_destroy_interface(ntb, type);
-}
-
 /**
  * epf_ntb_epc_create_interface() - Create and initialize NTB EPC interface
  * @ntb: NTB device that facilitates communication between HOST1 and HOST2
@@ -1614,15 +1573,8 @@ static int epf_ntb_epc_create(struct epf_ntb *ntb)
 
        ret = epf_ntb_epc_create_interface(ntb, epf->sec_epc,
                                           SECONDARY_INTERFACE);
-       if (ret) {
+       if (ret)
                dev_err(dev, "SECONDARY intf: Fail to create NTB EPC\n");
-               goto err_epc_create;
-       }
-
-       return 0;
-
-err_epc_create:
-       epf_ntb_epc_destroy_interface(ntb, PRIMARY_INTERFACE);
 
        return ret;
 }
@@ -1887,7 +1839,7 @@ static int epf_ntb_bind(struct pci_epf *epf)
        ret = epf_ntb_init_epc_bar(ntb);
        if (ret) {
                dev_err(dev, "Failed to create NTB EPC\n");
-               goto err_bar_init;
+               return ret;
        }
 
        ret = epf_ntb_config_spad_bar_alloc_interface(ntb);
@@ -1909,9 +1861,6 @@ static int epf_ntb_bind(struct pci_epf *epf)
 err_bar_alloc:
        epf_ntb_config_spad_bar_free(ntb);
 
-err_bar_init:
-       epf_ntb_epc_destroy(ntb);
-
        return ret;
 }
 
@@ -1927,7 +1876,6 @@ static void epf_ntb_unbind(struct pci_epf *epf)
 
        epf_ntb_epc_cleanup(ntb);
        epf_ntb_config_spad_bar_free(ntb);
-       epf_ntb_epc_destroy(ntb);
 }
 
 #define EPF_NTB_R(_name)                                               \