The flow rule wrappers each held one filter structure after their
list links were removed. Store the filter structure directly in
rte_flow. RSS still goes through txgbe_rss_conf_init() so the saved
key and queue pointers refer to that stored copy.

Signed-off-by: Zhang Tengfei <[email protected]>
---
 drivers/net/txgbe/txgbe_flow.c | 105 ++++++++++++---------------------
 1 file changed, 38 insertions(+), 67 deletions(-)

diff --git a/drivers/net/txgbe/txgbe_flow.c b/drivers/net/txgbe/txgbe_flow.c
index 64128dfc27..39d94eb1ea 100644
--- a/drivers/net/txgbe/txgbe_flow.c
+++ b/drivers/net/txgbe/txgbe_flow.c
@@ -16,30 +16,6 @@
 #define TXGBE_MAX_N_TUPLE_PRIO 7
 #define TXGBE_MAX_FLX_SOURCE_OFF 62
 
-/* ntuple filter list structure */
-struct txgbe_ntuple_filter_ele {
-       struct rte_eth_ntuple_filter filter_info;
-};
-/* ethertype filter list structure */
-struct txgbe_ethertype_filter_ele {
-       struct rte_eth_ethertype_filter filter_info;
-};
-/* syn filter list structure */
-struct txgbe_eth_syn_filter_ele {
-       struct rte_eth_syn_filter filter_info;
-};
-/* fdir filter list structure */
-struct txgbe_fdir_rule_ele {
-       struct txgbe_fdir_rule filter_info;
-};
-/* l2_tunnel filter list structure */
-struct txgbe_eth_l2_tunnel_conf_ele {
-       struct txgbe_l2_tunnel_conf filter_info;
-};
-/* rss filter list structure */
-struct txgbe_rss_conf_ele {
-       struct txgbe_rte_flow_rss_conf filter_info;
-};
 /* txgbe_flow memory list structure */
 struct txgbe_flow_mem {
        TAILQ_ENTRY(txgbe_flow_mem) entries;
@@ -3136,12 +3112,12 @@ txgbe_flow_create(struct rte_eth_dev *dev,
        struct rte_eth_fdir_conf *fdir_conf = TXGBE_DEV_FDIR_CONF(dev);
        struct txgbe_rte_flow_rss_conf rss_conf;
        struct rte_flow *flow = NULL;
-       struct txgbe_ntuple_filter_ele *ntuple_filter_ptr;
-       struct txgbe_ethertype_filter_ele *ethertype_filter_ptr;
-       struct txgbe_eth_syn_filter_ele *syn_filter_ptr;
-       struct txgbe_eth_l2_tunnel_conf_ele *l2_tn_filter_ptr;
-       struct txgbe_fdir_rule_ele *fdir_rule_ptr = NULL;
-       struct txgbe_rss_conf_ele *rss_filter_ptr;
+       struct rte_eth_ntuple_filter *ntuple_filter_ptr;
+       struct rte_eth_ethertype_filter *ethertype_filter_ptr;
+       struct rte_eth_syn_filter *syn_filter_ptr;
+       struct txgbe_l2_tunnel_conf *l2_tn_filter_ptr;
+       struct txgbe_fdir_rule *fdir_rule_ptr = NULL;
+       struct txgbe_rte_flow_rss_conf *rss_filter_ptr;
        struct txgbe_flow_mem *txgbe_flow_mem_ptr;
        struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
        struct txgbe_filter_info *filter_info = TXGBE_DEV_FILTER(dev);
@@ -3175,13 +3151,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
 
        if (!ret) {
                ntuple_filter_ptr = rte_zmalloc("txgbe_ntuple_filter",
-                       sizeof(struct txgbe_ntuple_filter_ele), 0);
+                       sizeof(struct rte_eth_ntuple_filter), 0);
                if (!ntuple_filter_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
                        goto out;
                }
-               ntuple_filter_ptr->filter_info = ntuple_filter;
+               *ntuple_filter_ptr = ntuple_filter;
                ret = txgbe_add_del_ntuple_filter(dev, &ntuple_filter, TRUE);
                if (ret) {
                        rte_free(ntuple_filter_ptr);
@@ -3200,13 +3176,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                                actions, &ethertype_filter, error);
        if (!ret) {
                ethertype_filter_ptr = rte_zmalloc("txgbe_ethertype_filter",
-                       sizeof(struct txgbe_ethertype_filter_ele), 0);
+                       sizeof(struct rte_eth_ethertype_filter), 0);
                if (!ethertype_filter_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
                        goto out;
                }
-               ethertype_filter_ptr->filter_info = ethertype_filter;
+               *ethertype_filter_ptr = ethertype_filter;
                ret = txgbe_add_del_ethertype_filter(dev,
                                &ethertype_filter, TRUE);
                if (ret) {
@@ -3223,13 +3199,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                                actions, &syn_filter, error);
        if (!ret) {
                syn_filter_ptr = rte_zmalloc("txgbe_syn_filter",
-                       sizeof(struct txgbe_eth_syn_filter_ele), 0);
+                       sizeof(struct rte_eth_syn_filter), 0);
                if (!syn_filter_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
                        goto out;
                }
-               syn_filter_ptr->filter_info = syn_filter;
+               *syn_filter_ptr = syn_filter;
                ret = txgbe_syn_filter_set(dev, &syn_filter, TRUE);
                if (ret) {
                        rte_free(syn_filter_ptr);
@@ -3246,7 +3222,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
        if (!ret) {
                if (!txgbe_is_pf(TXGBE_DEV_HW(dev))) {
                        fdir_rule_ptr = rte_zmalloc("txgbe_fdir_filter",
-                                       sizeof(struct txgbe_fdir_rule_ele), 0);
+                                       sizeof(struct txgbe_fdir_rule), 0);
                        if (!fdir_rule_ptr) {
                                PMD_DRV_LOG(ERR, "failed to allocate memory");
                                ret = -ENOMEM;
@@ -3260,7 +3236,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                                goto out;
                        }
 
-                       fdir_rule_ptr->filter_info = fdir_rule;
+                       *fdir_rule_ptr = fdir_rule;
                        flow->rule = fdir_rule_ptr;
                        flow->filter_type = RTE_ETH_FILTER_FDIR;
                        return flow;
@@ -3272,7 +3248,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                }
 
                fdir_rule_ptr = rte_zmalloc("txgbe_fdir_filter",
-                               sizeof(struct txgbe_fdir_rule_ele), 0);
+                               sizeof(struct txgbe_fdir_rule), 0);
                if (!fdir_rule_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
@@ -3345,7 +3321,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                if (ret)
                        goto fdir_out;
 
-               fdir_rule_ptr->filter_info = fdir_rule;
+               *fdir_rule_ptr = fdir_rule;
                flow->rule = fdir_rule_ptr;
                flow->filter_type = RTE_ETH_FILTER_FDIR;
 
@@ -3357,13 +3333,13 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                                        actions, &l2_tn_filter, error);
        if (!ret) {
                l2_tn_filter_ptr = rte_zmalloc("txgbe_l2_tn_filter",
-                       sizeof(struct txgbe_eth_l2_tunnel_conf_ele), 0);
+                       sizeof(struct txgbe_l2_tunnel_conf), 0);
                if (!l2_tn_filter_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
                        goto out;
                }
-               l2_tn_filter_ptr->filter_info = l2_tn_filter;
+               *l2_tn_filter_ptr = l2_tn_filter;
                ret = txgbe_dev_l2_tunnel_filter_add(dev, &l2_tn_filter, FALSE);
                if (ret) {
                        rte_free(l2_tn_filter_ptr);
@@ -3379,7 +3355,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                                        actions, &rss_conf, error);
        if (!ret) {
                rss_filter_ptr = rte_zmalloc("txgbe_rss_filter",
-                       sizeof(struct txgbe_rss_conf_ele), 0);
+                       sizeof(struct txgbe_rte_flow_rss_conf), 0);
                if (!rss_filter_ptr) {
                        PMD_DRV_LOG(ERR, "failed to allocate memory");
                        ret = -ENOMEM;
@@ -3390,7 +3366,7 @@ txgbe_flow_create(struct rte_eth_dev *dev,
                        rte_free(rss_filter_ptr);
                        goto out;
                }
-               txgbe_rss_conf_init(&rss_filter_ptr->filter_info,
+               txgbe_rss_conf_init(rss_filter_ptr,
                                    &rss_conf.conf);
                flow->rule = rss_filter_ptr;
                flow->filter_type = RTE_ETH_FILTER_HASH;
@@ -3486,16 +3462,16 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
        struct rte_eth_syn_filter syn_filter;
        struct txgbe_fdir_rule fdir_rule;
        struct txgbe_l2_tunnel_conf l2_tn_filter;
-       struct txgbe_ntuple_filter_ele *ntuple_filter_ptr;
-       struct txgbe_ethertype_filter_ele *ethertype_filter_ptr;
-       struct txgbe_eth_syn_filter_ele *syn_filter_ptr;
-       struct txgbe_eth_l2_tunnel_conf_ele *l2_tn_filter_ptr;
-       struct txgbe_fdir_rule_ele *fdir_rule_ptr;
+       struct rte_eth_ntuple_filter *ntuple_filter_ptr;
+       struct rte_eth_ethertype_filter *ethertype_filter_ptr;
+       struct rte_eth_syn_filter *syn_filter_ptr;
+       struct txgbe_l2_tunnel_conf *l2_tn_filter_ptr;
+       struct txgbe_fdir_rule *fdir_rule_ptr;
        struct txgbe_flow_mem *txgbe_flow_mem_ptr;
        struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
        struct txgbe_hw_fdir_info *fdir_info = TXGBE_DEV_FDIR(dev);
        struct rte_eth_fdir_conf *fdir_conf = TXGBE_DEV_FDIR_CONF(dev);
-       struct txgbe_rss_conf_ele *rss_filter_ptr;
+       struct txgbe_rte_flow_rss_conf *rss_filter_ptr;
 
        /*
         * Confirm the handle is on this port before changing hardware.
@@ -3513,20 +3489,18 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
        filter_type = pmd_flow->filter_type;
        switch (filter_type) {
        case RTE_ETH_FILTER_NTUPLE:
-               ntuple_filter_ptr = (struct txgbe_ntuple_filter_ele *)
+               ntuple_filter_ptr = (struct rte_eth_ntuple_filter *)
                                        pmd_flow->rule;
-               rte_memcpy(&ntuple_filter,
-                       &ntuple_filter_ptr->filter_info,
+               rte_memcpy(&ntuple_filter, ntuple_filter_ptr,
                        sizeof(struct rte_eth_ntuple_filter));
                ret = txgbe_add_del_ntuple_filter(dev, &ntuple_filter, FALSE);
                if (!ret)
                        rte_free(ntuple_filter_ptr);
                break;
        case RTE_ETH_FILTER_ETHERTYPE:
-               ethertype_filter_ptr = (struct txgbe_ethertype_filter_ele *)
+               ethertype_filter_ptr = (struct rte_eth_ethertype_filter *)
                                        pmd_flow->rule;
-               rte_memcpy(&ethertype_filter,
-                       &ethertype_filter_ptr->filter_info,
+               rte_memcpy(&ethertype_filter, ethertype_filter_ptr,
                        sizeof(struct rte_eth_ethertype_filter));
                ret = txgbe_add_del_ethertype_filter(dev,
                                &ethertype_filter, FALSE);
@@ -3534,19 +3508,17 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
                        rte_free(ethertype_filter_ptr);
                break;
        case RTE_ETH_FILTER_SYN:
-               syn_filter_ptr = (struct txgbe_eth_syn_filter_ele *)
+               syn_filter_ptr = (struct rte_eth_syn_filter *)
                                pmd_flow->rule;
-               rte_memcpy(&syn_filter,
-                       &syn_filter_ptr->filter_info,
+               rte_memcpy(&syn_filter, syn_filter_ptr,
                        sizeof(struct rte_eth_syn_filter));
                ret = txgbe_syn_filter_set(dev, &syn_filter, FALSE);
                if (!ret)
                        rte_free(syn_filter_ptr);
                break;
        case RTE_ETH_FILTER_FDIR:
-               fdir_rule_ptr = (struct txgbe_fdir_rule_ele *)pmd_flow->rule;
-               rte_memcpy(&fdir_rule,
-                       &fdir_rule_ptr->filter_info,
+               fdir_rule_ptr = (struct txgbe_fdir_rule *)pmd_flow->rule;
+               rte_memcpy(&fdir_rule, fdir_rule_ptr,
                        sizeof(struct txgbe_fdir_rule));
                if (txgbe_is_pf(TXGBE_DEV_HW(dev)))
                        ret = txgbe_fdir_filter_program(dev, &fdir_rule,
@@ -3570,19 +3542,18 @@ txgbe_flow_destroy(struct rte_eth_dev *dev,
                }
                break;
        case RTE_ETH_FILTER_L2_TUNNEL:
-               l2_tn_filter_ptr = (struct txgbe_eth_l2_tunnel_conf_ele *)
+               l2_tn_filter_ptr = (struct txgbe_l2_tunnel_conf *)
                                pmd_flow->rule;
-               rte_memcpy(&l2_tn_filter, &l2_tn_filter_ptr->filter_info,
+               rte_memcpy(&l2_tn_filter, l2_tn_filter_ptr,
                        sizeof(struct txgbe_l2_tunnel_conf));
                ret = txgbe_dev_l2_tunnel_filter_del(dev, &l2_tn_filter);
                if (!ret)
                        rte_free(l2_tn_filter_ptr);
                break;
        case RTE_ETH_FILTER_HASH:
-               rss_filter_ptr = (struct txgbe_rss_conf_ele *)
+               rss_filter_ptr = (struct txgbe_rte_flow_rss_conf *)
                                pmd_flow->rule;
-               ret = txgbe_config_rss_filter(dev,
-                                       &rss_filter_ptr->filter_info, FALSE);
+               ret = txgbe_config_rss_filter(dev, rss_filter_ptr, FALSE);
                if (!ret)
                        rte_free(rss_filter_ptr);
                break;
-- 
2.53.0

Reply via email to