eth_hn_dev_uninit() only closes the primary channel but never
closes subchannels allocated during hn_dev_configure(). This
leaks VMBus subchannel resources on device removal.

Close all subchannels before closing the primary channel to
prevent resource leaks.

Fixes: 4e9c73e96e83 ("net/netvsc: add Hyper-V network device")
Cc: [email protected]

Signed-off-by: Long Li <[email protected]>
---
 drivers/net/netvsc/hn_ethdev.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c
index 6584819f4f..798b4c9023 100644
--- a/drivers/net/netvsc/hn_ethdev.c
+++ b/drivers/net/netvsc/hn_ethdev.c
@@ -1433,6 +1433,7 @@ eth_hn_dev_uninit(struct rte_eth_dev *eth_dev)
 {
        struct hn_data *hv = eth_dev->data->dev_private;
        int ret, ret_stop;
+       int i;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -1444,6 +1445,15 @@ eth_hn_dev_uninit(struct rte_eth_dev *eth_dev)
 
        hn_detach(hv);
        hn_chim_uninit(eth_dev);
+
+       /* Close any subchannels before closing the primary channel */
+       for (i = 1; i < HN_MAX_CHANNELS; i++) {
+               if (hv->channels[i] != NULL) {
+                       rte_vmbus_chan_close(hv->channels[i]);
+                       hv->channels[i] = NULL;
+               }
+       }
+
        rte_vmbus_chan_close(hv->channels[0]);
        rte_free(hv->primary);
        ret = rte_eth_dev_owner_delete(hv->owner.id);
-- 
2.43.0

Reply via email to