Currently, the RSS filter structure includes an rte_flow RSS conf structure
directly. This is suboptimal, because that structure has pointers in it,
which makes copying data out of this structure a non-trivial operation that
may introduce potentially dangling pointers to queue lists or RSS key.

Replace it with direct members of the RSS config struct, and adjust all
users accordingly.

Signed-off-by: Anatoly Burakov <[email protected]>
---
 drivers/net/intel/i40e/i40e_ethdev.h | 11 +++++---
 drivers/net/intel/i40e/i40e_flow.c   | 13 +++++++---
 drivers/net/intel/i40e/i40e_hash.c   | 39 ++++++++++++----------------
 drivers/net/intel/i40e/i40e_hash.h   |  1 -
 4 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/drivers/net/intel/i40e/i40e_ethdev.h 
b/drivers/net/intel/i40e/i40e_ethdev.h
index 9d9bde6aeb..b6f341169f 100644
--- a/drivers/net/intel/i40e/i40e_ethdev.h
+++ b/drivers/net/intel/i40e/i40e_ethdev.h
@@ -1053,12 +1053,15 @@ struct i40e_customized_pctype {
        bool valid;   /* Check if it's valid */
 };
 
+#define I40E_RSS_KEY_LEN ((I40E_PFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t))
+
 struct i40e_rte_flow_rss_conf {
-       struct rte_flow_action_rss conf;        /**< RSS parameters. */
+       enum rte_eth_hash_function func;
+       uint64_t types; /**< Specific RSS hash types (see RTE_ETH_RSS_*). */
+       uint32_t key_len; /**< Hash key length in bytes. */
+       uint32_t queue_num; /**< Number of entries in @p queue. */
 
-       uint8_t key[(I40E_VFQF_HKEY_MAX_INDEX > I40E_PFQF_HKEY_MAX_INDEX ?
-                    I40E_VFQF_HKEY_MAX_INDEX : I40E_PFQF_HKEY_MAX_INDEX + 1) *
-                   sizeof(uint32_t)];          /**< Hash key. */
+       uint8_t key[I40E_RSS_KEY_LEN];          /**< Hash key. */
        uint16_t queue[RTE_ETH_RSS_RETA_SIZE_512];      /**< Queues indices to 
use. */
 
        bool symmetric_enable;          /**< true, if enable symmetric */
diff --git a/drivers/net/intel/i40e/i40e_flow.c 
b/drivers/net/intel/i40e/i40e_flow.c
index 6eb85a7d0d..a017d3cd44 100644
--- a/drivers/net/intel/i40e/i40e_flow.c
+++ b/drivers/net/intel/i40e/i40e_flow.c
@@ -4338,9 +4338,16 @@ i40e_flow_query(struct rte_eth_dev *dev __rte_unused,
                                                   "action not supported");
                                return -rte_errno;
                        }
-                       memcpy(rss_conf,
-                                  &rss_rule->rss_filter_info.conf,
-                                  sizeof(struct rte_flow_action_rss));
+                       *rss_conf = (struct rte_flow_action_rss){
+                               .func = rss_rule->rss_filter_info.func,
+                               .types = rss_rule->rss_filter_info.types,
+                               .key_len = rss_rule->rss_filter_info.key_len,
+                               .queue_num = 
rss_rule->rss_filter_info.queue_num,
+                               .key = rss_rule->rss_filter_info.key_len ?
+                                       rss_rule->rss_filter_info.key : NULL,
+                               .queue = rss_rule->rss_filter_info.queue_num ?
+                                       rss_rule->rss_filter_info.queue : NULL,
+                       };
                        break;
                default:
                        return rte_flow_error_set(error, ENOTSUP,
diff --git a/drivers/net/intel/i40e/i40e_hash.c 
b/drivers/net/intel/i40e/i40e_hash.c
index 6a23e2bf7f..2887460125 100644
--- a/drivers/net/intel/i40e/i40e_hash.c
+++ b/drivers/net/intel/i40e/i40e_hash.c
@@ -747,7 +747,7 @@ i40e_hash_config_pctype(struct i40e_hw *hw,
                        struct i40e_rte_flow_rss_conf *rss_conf,
                        uint32_t pctype)
 {
-       uint64_t rss_types = rss_conf->conf.types;
+       uint64_t rss_types = rss_conf->types;
        int ret;
 
        if (rss_types == 0) {
@@ -829,17 +829,16 @@ static int
 i40e_hash_config(struct i40e_pf *pf,
                 struct i40e_rte_flow_rss_conf *rss_conf)
 {
-       struct rte_flow_action_rss *rss_info = &rss_conf->conf;
        struct i40e_hw *hw = &pf->adapter->hw;
        uint64_t pctypes;
        int ret;
 
-       if (rss_info->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
-               ret = i40e_hash_config_func(hw, rss_info->func);
+       if (rss_conf->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
+               ret = i40e_hash_config_func(hw, rss_conf->func);
                if (ret)
                        return ret;
 
-               if (rss_info->func != RTE_ETH_HASH_FUNCTION_TOEPLITZ)
+               if (rss_conf->func != RTE_ETH_HASH_FUNCTION_TOEPLITZ)
                        rss_conf->misc_reset_flags |=
                                        I40E_HASH_FLOW_RESET_FLAG_FUNC;
        }
@@ -852,9 +851,9 @@ i40e_hash_config(struct i40e_pf *pf,
                rss_conf->misc_reset_flags |= I40E_HASH_FLOW_RESET_FLAG_REGION;
        }
 
-       if (rss_info->key_len > 0) {
+       if (rss_conf->key_len > 0) {
                ret = i40e_set_rss_key(pf->main_vsi, rss_conf->key,
-                                      rss_info->key_len);
+                                      rss_conf->key_len);
                if (ret)
                        return ret;
 
@@ -862,13 +861,13 @@ i40e_hash_config(struct i40e_pf *pf,
        }
 
        /* Update lookup table */
-       if (rss_info->queue_num > 0) {
+       if (rss_conf->queue_num > 0) {
                uint8_t lut[RTE_ETH_RSS_RETA_SIZE_512];
                uint32_t i, j = 0;
 
                for (i = 0; i < hw->func_caps.rss_table_size; i++) {
-                       lut[i] = (uint8_t)rss_info->queue[j];
-                       j = (j == rss_info->queue_num - 1) ? 0 : (j + 1);
+                       lut[i] = (uint8_t)rss_conf->queue[j];
+                       j = (j == rss_conf->queue_num - 1) ? 0 : (j + 1);
                }
 
                ret = i40e_set_rss_lut(pf->main_vsi, lut, (uint16_t)i);
@@ -876,7 +875,7 @@ i40e_hash_config(struct i40e_pf *pf,
                        return ret;
 
                pf->hash_enabled_queues = 0;
-               for (i = 0; i < rss_info->queue_num; i++)
+               for (i = 0; i < rss_conf->queue_num; i++)
                        pf->hash_enabled_queues |= BIT_ULL(lut[i]);
 
                pf->adapter->rss_reta_updated = 0;
@@ -933,8 +932,7 @@ i40e_hash_parse_key(const struct rte_flow_action_rss 
*rss_act,
                memcpy(rss_conf->key, key, sizeof(rss_conf->key));
        }
 
-       rss_conf->conf.key = rss_conf->key;
-       rss_conf->conf.key_len = sizeof(rss_conf->key);
+       rss_conf->key_len = sizeof(rss_conf->key);
 }
 
 static int
@@ -949,8 +947,8 @@ i40e_hash_parse_pattern_act(const struct rte_eth_dev *dev,
        if (rss_act->key_len)
                i40e_hash_parse_key(rss_act, rss_conf);
 
-       rss_conf->conf.func = rss_act->func;
-       rss_conf->conf.types = rss_act->types;
+       rss_conf->func = rss_act->func;
+       rss_conf->types = rss_act->types;
        rss_conf->inset = i40e_hash_get_inset(rss_act->types, 
rss_conf->symmetric_enable);
 
        return i40e_hash_get_pattern_pctypes(dev, pattern, rss_act,
@@ -963,8 +961,7 @@ i40e_hash_parse_queues(const struct rte_flow_action_rss 
*rss_act,
 {
        memcpy(rss_conf->queue, rss_act->queue,
               rss_act->queue_num * sizeof(rss_conf->queue[0]));
-       rss_conf->conf.queue = rss_conf->queue;
-       rss_conf->conf.queue_num = rss_act->queue_num;
+       rss_conf->queue_num = rss_act->queue_num;
        return 0;
 }
 
@@ -1277,7 +1274,7 @@ i40e_hash_parse(struct rte_eth_dev *dev,
                        return ret;
                rss_act = parsed_actions.actions[0]->conf;
                /* set up RSS functions */
-               rss_conf->conf.func = rss_act->func;
+               rss_conf->func = rss_act->func;
                return i40e_hash_parse_queue_region(pattern, rss_act, rss_conf, 
error);
        }
        /* Empty pattern path */
@@ -1287,7 +1284,7 @@ i40e_hash_parse(struct rte_eth_dev *dev,
                if (ret)
                        return ret;
                rss_act = parsed_actions.actions[0]->conf;
-               rss_conf->conf.func = rss_act->func;
+               rss_conf->func = rss_act->func;
                /* if there is a queue list, take that path */
                if (rss_act->queue != NULL)
                        return i40e_hash_parse_queues(rss_act, rss_conf);
@@ -1379,10 +1376,6 @@ i40e_hash_filter_create(struct i40e_pf *pf,
        new_conf = &filter->rss_filter_info;
 
        memcpy(new_conf, rss_conf, sizeof(*new_conf));
-       if (new_conf->conf.queue_num)
-               new_conf->conf.queue = new_conf->queue;
-       if (new_conf->conf.key_len)
-               new_conf->conf.key = new_conf->key;
 
        ret = i40e_hash_config(pf, new_conf);
        if (ret) {
diff --git a/drivers/net/intel/i40e/i40e_hash.h 
b/drivers/net/intel/i40e/i40e_hash.h
index 99df4bccd0..3bf30cdee5 100644
--- a/drivers/net/intel/i40e/i40e_hash.h
+++ b/drivers/net/intel/i40e/i40e_hash.h
@@ -27,7 +27,6 @@ int i40e_hash_filter_destroy(struct i40e_pf *pf,
                             const struct i40e_rss_filter *rss_filter);
 int i40e_hash_filter_flush(struct i40e_pf *pf);
 
-#define I40E_RSS_KEY_LEN ((I40E_PFQF_HKEY_MAX_INDEX + 1) * sizeof(uint32_t))
 extern const uint8_t i40e_rss_key_default[I40E_RSS_KEY_LEN];
 
 #ifdef __cplusplus
-- 
2.52.0

Reply via email to