mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-06-01 11:33:59 +02:00
PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown
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: 8b821cf761 ("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
This commit is contained in:
committed by
Manivannan Sadhasivam
parent
0da63230d3
commit
3446beddba
@@ -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) \
|
||||
|
||||
Reference in New Issue
Block a user