[PATCH v1 12/12] net/iavf: decouple hash uninit from parser uninit

Anatoly Burakov
2026-02-09T14:15:29Z

Currently, parser deinitialization will trigger removal of current RSS
configuration. This should not be done as part of parser deinitialization,
but should rather be a separate step in dev close flow.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
drivers/net/intel/iavf/iavf_ethdev.c | 4 ++++
drivers/net/intel/iavf/iavf_hash.c | 13 +++++++++----
drivers/net/intel/iavf/iavf_hash.h | 13 +++++++++++++
3 files changed, 26 insertions(+), 4 deletions(-)
create mode 100644 drivers/net/intel/iavf/iavf_hash.h

diff --git a/drivers/net/intel/iavf/iavf_ethdev.c b/drivers/net/intel/iavf/iavf_ethdev.c
index 802e095174..70eb7e7ec5 100644
--- a/drivers/net/intel/iavf/iavf_ethdev.c
+++ b/drivers/net/intel/iavf/iavf_ethdev.c
@@ -35,6 +35,7 @@
#include "iavf_generic_flow.h"
#include "rte_pmd_iavf.h"
#include "iavf_ipsec_crypto.h"
+#include "iavf_hash.h"

/* devargs */
#define IAVF_PROTO_XTR_ARG "proto_xtr"
@@ -2972,6 +2973,9 @@ iavf_dev_close(struct rte_eth_dev *dev)
/* free iAVF security device context all related resources */
iavf_security_ctx_destroy(adapter);

+ /* remove RSS configuration */
+ iavf_hash_uninit(adapter);
+
iavf_flow_flush(dev, NULL);
iavf_flow_uninit(adapter);

diff --git a/drivers/net/intel/iavf/iavf_hash.c b/drivers/net/intel/iavf/iavf_hash.c
index a40fed7542..d864998402 100644
--- a/drivers/net/intel/iavf/iavf_hash.c
+++ b/drivers/net/intel/iavf/iavf_hash.c
@@ -22,6 +22,7 @@
#include "iavf_log.h"
#include "iavf.h"
#include "iavf_generic_flow.h"
+#include "iavf_hash.h"

#define IAVF_PHINT_NONE 0
#define IAVF_PHINT_GTPU BIT_ULL(0)
@@ -77,7 +78,7 @@ static int
iavf_hash_destroy(struct iavf_adapter *ad, struct rte_flow *flow,
struct rte_flow_error *error);
static void
-iavf_hash_uninit(struct iavf_adapter *ad);
+iavf_hash_uninit_parser(struct iavf_adapter *ad);
static void
iavf_hash_free(struct rte_flow *flow);
static int
@@ -680,7 +681,7 @@ static struct iavf_flow_engine iavf_hash_engine = {
.init = iavf_hash_init,
.create = iavf_hash_create,
.destroy = iavf_hash_destroy,
- .uninit = iavf_hash_uninit,
+ .uninit = iavf_hash_uninit_parser,
.free = iavf_hash_free,
.type = IAVF_FLOW_ENGINE_HASH,
};
@@ -1641,6 +1642,12 @@ iavf_hash_destroy(__rte_unused struct iavf_adapter *ad,
}

static void
+iavf_hash_uninit_parser(struct iavf_adapter *ad)
+{
+ iavf_unregister_parser(&iavf_hash_parser, ad);
+}
+
+void
iavf_hash_uninit(struct iavf_adapter *ad)
{
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
@@ -1658,8 +1665,6 @@ iavf_hash_uninit(struct iavf_adapter *ad)
rss_conf = &ad->dev_data->dev_conf.rx_adv_conf.rss_conf;
if (iavf_rss_hash_set(ad, rss_conf->rss_hf, false))
PMD_DRV_LOG(ERR, "fail to delete default RSS");
-
- iavf_unregister_parser(&iavf_hash_parser, ad);
}

static void
diff --git a/drivers/net/intel/iavf/iavf_hash.h b/drivers/net/intel/iavf/iavf_hash.h
new file mode 100644
index 0000000000..2348f32673
--- /dev/null
+++ b/drivers/net/intel/iavf/iavf_hash.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2025 Intel Corporation
+ */
+
+#ifndef _IAVF_HASH_H_
+#define _IAVF_HASH_H_
+
+#include "iavf.h"
+
+void
+iavf_hash_uninit(struct iavf_adapter *ad);
+
+#endif /* _IAVF_HASH_H_ */
--
2.47.3