]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: support default RSS key as null
authorOphir Munk <ophirmu@mellanox.com>
Sun, 4 Nov 2018 12:10:20 +0000 (12:10 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 5 Nov 2018 14:01:25 +0000 (15:01 +0100)
Applications which add RSS rules must supply an RSS key and length.
If an application is only interested in default RSS operation it
should not care about the exact RSS key.
By setting the key to NULL - the PMD will use the default RSS key.
In addition if the application does not care about the RSS type it can
set it to 0 and the PMD will use the default type (ETH_RSS_IP).

Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Acked-by: Shahaf Shuler <shahafs@mellanox.com>
doc/guides/nics/mlx5.rst
drivers/net/mlx5/mlx5_flow.c
drivers/net/mlx5/mlx5_flow_dv.c
drivers/net/mlx5/mlx5_flow_verbs.c
drivers/net/mlx5/mlx5_rxq.c

index 7379cf39b0e3a46eb329e2e5972cdd2e04991be5..7af5ead81368875a45cb8583d8259b5fad0622d9 100644 (file)
@@ -54,6 +54,7 @@ Features
 - Support for scattered TX and RX frames.
 - IPv4, IPv6, TCPv4, TCPv6, UDPv4 and UDPv6 RSS on any number of queues.
 - Several RSS hash keys, one for each flow type.
+- Default RSS operation with no hash key specification.
 - Configurable RETA table.
 - Support for multiple MAC addresses.
 - VLAN filtering.
index 107a4f02f86a9a498a9f060def2393da71508382..be2cc6b93f1a2e08cf07a1e0e3e388e049cb995a 100644 (file)
@@ -912,7 +912,13 @@ mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
                                          RTE_FLOW_ERROR_TYPE_ACTION_CONF,
                                          &rss->level,
                                          "tunnel RSS is not supported");
-       if (rss->key_len < MLX5_RSS_HASH_KEY_LEN)
+       /* allow RSS key_len 0 in case of NULL (default) RSS key. */
+       if (rss->key_len == 0 && rss->key != NULL)
+               return rte_flow_error_set(error, ENOTSUP,
+                                         RTE_FLOW_ERROR_TYPE_ACTION_CONF,
+                                         &rss->key_len,
+                                         "RSS hash key length 0");
+       if (rss->key_len > 0 && rss->key_len < MLX5_RSS_HASH_KEY_LEN)
                return rte_flow_error_set(error, ENOTSUP,
                                          RTE_FLOW_ERROR_TYPE_ACTION_CONF,
                                          &rss->key_len,
index c11ecd4c1f0eeac9af073fe5502e17857ce50d9d..1d5b6bf60ac1e941362c943172979eaceaca0fa3 100644 (file)
@@ -1722,6 +1722,7 @@ flow_dv_create_action(struct rte_eth_dev *dev,
        int actions_n = dev_flow->dv.actions_n;
        struct rte_flow *flow = dev_flow->flow;
        const struct rte_flow_action *action_ptr = action;
+       const uint8_t *rss_key;
 
        switch (action->type) {
        case RTE_FLOW_ACTION_TYPE_VOID:
@@ -1758,8 +1759,11 @@ flow_dv_create_action(struct rte_eth_dev *dev,
                        memcpy((*flow->queue), rss->queue,
                               rss->queue_num * sizeof(uint16_t));
                flow->rss.queue_num = rss->queue_num;
-               memcpy(flow->key, rss->key, MLX5_RSS_HASH_KEY_LEN);
-               flow->rss.types = rss->types;
+               /* NULL RSS key indicates default RSS key. */
+               rss_key = !rss->key ? rss_hash_default_key : rss->key;
+               memcpy(flow->key, rss_key, MLX5_RSS_HASH_KEY_LEN);
+               /* RSS type 0 indicates default RSS type ETH_RSS_IP. */
+               flow->rss.types = !rss->types ? ETH_RSS_IP : rss->types;
                flow->rss.level = rss->level;
                /* Added to array only in apply since we need the QP */
                flow->actions |= MLX5_FLOW_ACTION_RSS;
index 2e506b91adcc750cfecbb948398497ee3de2e56a..54ac620c72035bb5b0346d74a222bbe6f5c01bb9 100644 (file)
@@ -925,14 +925,18 @@ flow_verbs_translate_action_rss(const struct rte_flow_action *action,
                                struct mlx5_flow *dev_flow)
 {
        const struct rte_flow_action_rss *rss = action->conf;
+       const uint8_t *rss_key;
        struct rte_flow *flow = dev_flow->flow;
 
        if (flow->queue)
                memcpy((*flow->queue), rss->queue,
                       rss->queue_num * sizeof(uint16_t));
        flow->rss.queue_num = rss->queue_num;
-       memcpy(flow->key, rss->key, MLX5_RSS_HASH_KEY_LEN);
-       flow->rss.types = rss->types;
+       /* NULL RSS key indicates default RSS key. */
+       rss_key = !rss->key ? rss_hash_default_key : rss->key;
+       memcpy(flow->key, rss_key, MLX5_RSS_HASH_KEY_LEN);
+       /* RSS type 0 indicates default RSS type (ETH_RSS_IP). */
+       flow->rss.types = !rss->types ? ETH_RSS_IP : rss->types;
        flow->rss.level = rss->level;
        *action_flags |= MLX5_FLOW_ACTION_RSS;
 }
index 6df89974efa1fd8dfbac57d65e654eb9ae55500e..eef48502149b7b3949123fcd9b8787d4ef5125da 100644 (file)
@@ -1794,10 +1794,6 @@ mlx5_hrxq_new(struct rte_eth_dev *dev,
                rte_errno = ENOMEM;
                return NULL;
        }
-       if (!rss_key_len) {
-               rss_key_len = MLX5_RSS_HASH_KEY_LEN;
-               rss_key = rss_hash_default_key;
-       }
 #ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT
        if (tunnel) {
                qp_init_attr.comp_mask =
@@ -1823,11 +1819,8 @@ mlx5_hrxq_new(struct rte_eth_dev *dev,
                                IBV_QP_INIT_ATTR_RX_HASH,
                        .rx_hash_conf = (struct ibv_rx_hash_conf){
                                .rx_hash_function = IBV_RX_HASH_FUNC_TOEPLITZ,
-                               .rx_hash_key_len = rss_key_len ? rss_key_len :
-                                                  MLX5_RSS_HASH_KEY_LEN,
-                               .rx_hash_key = rss_key ?
-                                              (void *)(uintptr_t)rss_key :
-                                              rss_hash_default_key,
+                               .rx_hash_key_len = rss_key_len,
+                               .rx_hash_key = (void *)(uintptr_t)rss_key,
                                .rx_hash_fields_mask = hash_fields,
                        },
                        .rwq_ind_tbl = ind_tbl->ind_table,
@@ -1845,11 +1838,8 @@ mlx5_hrxq_new(struct rte_eth_dev *dev,
                                IBV_QP_INIT_ATTR_RX_HASH,
                        .rx_hash_conf = (struct ibv_rx_hash_conf){
                                .rx_hash_function = IBV_RX_HASH_FUNC_TOEPLITZ,
-                               .rx_hash_key_len = rss_key_len ? rss_key_len :
-                                                  MLX5_RSS_HASH_KEY_LEN,
-                               .rx_hash_key = rss_key ?
-                                              (void *)(uintptr_t)rss_key :
-                                              rss_hash_default_key,
+                               .rx_hash_key_len = rss_key_len,
+                               .rx_hash_key = (void *)(uintptr_t)rss_key,
                                .rx_hash_fields_mask = hash_fields,
                        },
                        .rwq_ind_tbl = ind_tbl->ind_table,