On 05/21, Jeff Guo wrote:
>When hash init, the default rss rules would be added, while hash uninit,
>the default rss rules should be deleted. Add the missing part in the hash
>uninit process. Also add invalid flow checking func in iavf generic flow
>to avoid the error of "Cannot access memory at address 0xXXXXXX" occur.
>
>Fixes: 5ea614254332 ("net/iavf: fix VF reset for RSS")
>Fixes: ff2d0c345c3b ("net/iavf: support generic flow API")
>
>Signed-off-by: Jeff Guo <jia....@intel.com>
>---
> drivers/net/iavf/iavf_generic_flow.c | 24 ++++++++++++++++++++----
> drivers/net/iavf/iavf_hash.c         | 12 ++++++++----
> 2 files changed, 28 insertions(+), 8 deletions(-)
>
>diff --git a/drivers/net/iavf/iavf_generic_flow.c 
>b/drivers/net/iavf/iavf_generic_flow.c
>index c0c67d0c7..b6c26c4fd 100644
>--- a/drivers/net/iavf/iavf_generic_flow.c
>+++ b/drivers/net/iavf/iavf_generic_flow.c
>@@ -935,6 +935,22 @@ iavf_flow_create(struct rte_eth_dev *dev,
>       return flow;
> }
> 
>+static bool
>+iavf_flow_is_valid(struct rte_flow *flow)
>+{
>+      struct iavf_flow_engine *engine;
>+      void *temp;
>+
>+      if (flow && flow->engine) {
>+              TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
>+                      if (engine == flow->engine)
>+                              return true;
>+              }
>+      }
>+
>+      return false;
>+}
>+
> static int
> iavf_flow_destroy(struct rte_eth_dev *dev,
>                 struct rte_flow *flow,
>@@ -945,10 +961,10 @@ iavf_flow_destroy(struct rte_eth_dev *dev,
>       struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(ad);
>       int ret = 0;
> 
>-      if (!flow || !flow->engine || !flow->engine->destroy) {
>+      if (!iavf_flow_is_valid(flow) || !flow->engine->destroy) {
>               rte_flow_error_set(error, EINVAL,
>                                  RTE_FLOW_ERROR_TYPE_HANDLE,
>-                                 NULL, "Invalid flow");
>+                                 NULL, "Invalid flow destroy");
>               return -rte_errno;
>       }
> 
>@@ -1002,10 +1018,10 @@ iavf_flow_query(struct rte_eth_dev *dev,
>               IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
>       struct rte_flow_query_count *count = data;
> 
>-      if (!flow || !flow->engine || !flow->engine->query_count) {
>+      if (!iavf_flow_is_valid(flow) || !flow->engine->query_count) {
>               rte_flow_error_set(error, EINVAL,
>                                  RTE_FLOW_ERROR_TYPE_HANDLE,
>-                                 NULL, "Invalid flow");
>+                                 NULL, "Invalid flow query");
>               return -rte_errno;
>       }
> 
>diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
>index 56ab170d8..af528863b 100644
>--- a/drivers/net/iavf/iavf_hash.c
>+++ b/drivers/net/iavf/iavf_hash.c
>@@ -887,7 +887,7 @@ static struct iavf_flow_parser iavf_hash_parser = {
> };
> 
> static int
>-iavf_hash_default_set(struct iavf_adapter *ad)
>+iavf_hash_default_set(struct iavf_adapter *ad, bool add)
> {
>       struct virtchnl_rss_cfg *rss_cfg;
>       uint16_t i;
>@@ -902,9 +902,10 @@ iavf_hash_default_set(struct iavf_adapter *ad)
>               rss_cfg->proto_hdrs = *iavf_hash_default_hdrs[i];
>               rss_cfg->rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
> 
>-              ret = iavf_add_del_rss_cfg(ad, rss_cfg, true);
>+              ret = iavf_add_del_rss_cfg(ad, rss_cfg, add);
>               if (ret) {
>-                      PMD_DRV_LOG(ERR, "fail to add RSS configure");
>+                      PMD_DRV_LOG(ERR, "fail to %s RSS configure",
>+                                  add ? "add" : "delete");
>                       rte_free(rss_cfg);
>                       return ret;
>               }
>@@ -941,7 +942,7 @@ iavf_hash_init(struct iavf_adapter *ad)
>               return ret;
>       }
> 
>-      ret = iavf_hash_default_set(ad);
>+      ret = iavf_hash_default_set(ad, true);
>       if (ret) {
>               PMD_DRV_LOG(ERR, "fail to set default RSS");
>               iavf_unregister_parser(parser, ad);
>@@ -1222,6 +1223,9 @@ iavf_hash_destroy(__rte_unused struct iavf_adapter *ad,
> static void
> iavf_hash_uninit(struct iavf_adapter *ad)
> {
>+      if (iavf_hash_default_set(ad, false))
>+              PMD_DRV_LOG(ERR, "fail to delete default RSS");
>+
>       iavf_unregister_parser(&iavf_hash_parser, ad);
> }
> 
>-- 
>2.20.1
>

Applied to dpdk-next-net-intel, Thanks.

Reply via email to