VYPR
Unrated severityNVD Advisory· Published May 27, 2026· Updated May 27, 2026

CVE-2026-46009

CVE-2026-46009

Description

In the Linux kernel, the following vulnerability has been resolved:

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.

Affected products

1

Patches

10
72099f015d3c

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitKoichiro DenFeb 26, 2026Fixed in 6.6.140via kernel-cna
2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index 9aac2c6f3bb99d..b759b4e0bfb598 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index 9aac2c6f3bb99d..b759b4e0bfb598 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
65fc57c8b8f0

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitKoichiro DenFeb 26, 2026Fixed in 6.18.27via kernel-cna
2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
3446beddba45

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitKoichiro DenFeb 26, 2026Fixed in 7.1-rc1via kernel-cna
2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
756ca5e7ed22

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitKoichiro DenFeb 26, 2026Fixed in 6.12.86via kernel-cna
2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
e813c95e4c8e

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitKoichiro DenFeb 26, 2026Fixed in 7.0.4via kernel-cna
2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
72099f015d3c

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index 9aac2c6f3bb99d..b759b4e0bfb598 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index 9aac2c6f3bb99d..b759b4e0bfb598 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
e813c95e4c8e

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
65fc57c8b8f0

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
756ca5e7ed22

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index e01a98e74d2111..7702ebb81d9964 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
3446beddba45

PCI: endpoint: pci-epf-ntb: Remove duplicate resource teardown

2 files changed · +4 110
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    
  • drivers/pci/endpoint/functions/pci-epf-ntb.c+2 55 modified
    diff --git a/drivers/pci/endpoint/functions/pci-epf-ntb.c b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    index a3a588e522e715..2bdcc35b652cfb 100644
    --- a/drivers/pci/endpoint/functions/pci-epf-ntb.c
    +++ b/drivers/pci/endpoint/functions/pci-epf-ntb.c
    @@ -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)						\
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Duplicate resource teardown in the PCI endpoint NTB function driver causes a use-after-free oops."

Attack vector

The helper function epf_ntb_epc_destroy() calls pci_epc_remove_epf() and pci_epc_put() for each interface, duplicating teardown that the caller (epf_ntb_bind() or epf_ntb_unbind()) is supposed to perform later. When .allow_link fails (e.g., epf_ntb_init_epc_bar() returns an error) or when .drop_link is performed, the duplicate teardown triggers an oops due to use-after-free of the EPC data structures [patch_id=2660477]. The attacker does not need special privileges; triggering the NTB allow_link or drop_link operations via configfs is sufficient.

Affected code

The vulnerable code is in drivers/pci/endpoint/functions/pci-epf-ntb.c. The removed functions are epf_ntb_epc_destroy_interface() and epf_ntb_epc_destroy(), which were called from epf_ntb_bind() (via the err_bar_init label) and epf_ntb_unbind() [patch_id=2660477].

What the fix does

The patch removes the entire epf_ntb_epc_destroy() function and its helper epf_ntb_epc_destroy_interface(), along with all call sites in epf_ntb_bind() and epf_ntb_unbind() [patch_id=2660477]. Error paths in epf_ntb_epc_create() and epf_ntb_bind() are simplified to return directly instead of jumping to a cleanup label that called the duplicate teardown. The pci_epc_put() calls are also dropped because EPC device refcounting is tied to the configfs EPC group lifetime, and the pci_epc_put() in the .drop_link path is sufficient.

Preconditions

  • configThe kernel must have the PCI endpoint NTB function driver (pci-epf-ntb) loaded and configured.
  • inputAn attacker must be able to trigger .allow_link failure or .drop_link operations via configfs on the NTB endpoint function.

Generated on May 27, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.