IB/mlx4: Add support to RSS hash for inner headers
authorGuy Levi <guyle@mellanox.com>
Sun, 24 Dec 2017 12:51:24 +0000 (14:51 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 28 Dec 2017 18:33:14 +0000 (11:33 -0700)
Support RSS hash for inner headers according to a new flag,
MLX4_IB_RX_HASH_INNER provided by the vendor channel.

In case the flag is set, RSS hash will be done on the inner headers of
VXLAN packets (which are encapsulated).
Non-encapsulated packets will be hashed according to the outer headers.

Signed-off-by: Guy Levi <guyle@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/qp.c
include/uapi/rdma/mlx4-abi.h

index 8c8a167..5695ce5 100644 (file)
@@ -589,6 +589,7 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
                if (props->rss_caps.supported_qpts) {
                        resp.rss_caps.rx_hash_function =
                                MLX4_IB_RX_HASH_FUNC_TOEPLITZ;
+
                        resp.rss_caps.rx_hash_fields_mask =
                                MLX4_IB_RX_HASH_SRC_IPV4 |
                                MLX4_IB_RX_HASH_DST_IPV4 |
@@ -598,6 +599,11 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
                                MLX4_IB_RX_HASH_DST_PORT_TCP |
                                MLX4_IB_RX_HASH_SRC_PORT_UDP |
                                MLX4_IB_RX_HASH_DST_PORT_UDP;
+
+                       if (dev->dev->caps.tunnel_offload_mode ==
+                           MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
+                               resp.rss_caps.rx_hash_fields_mask |=
+                                       MLX4_IB_RX_HASH_INNER;
                }
        }
 
index f5f5c59..f045491 100644 (file)
@@ -734,6 +734,20 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
                return (-EOPNOTSUPP);
        }
 
+       if (ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_INNER) {
+               if (dev->dev->caps.tunnel_offload_mode ==
+                   MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
+                       /*
+                        * Hash according to inner headers if exist, otherwise
+                        * according to outer headers.
+                        */
+                       rss_ctx->flags |= MLX4_RSS_BY_INNER_HEADERS_IPONLY;
+               } else {
+                       pr_debug("RSS Hash for inner headers isn't supported\n");
+                       return (-EOPNOTSUPP);
+               }
+       }
+
        return 0;
 }
 
index 224b52b..7f9c373 100644 (file)
@@ -97,8 +97,8 @@ struct mlx4_ib_create_srq_resp {
 };
 
 struct mlx4_ib_create_qp_rss {
-       __u64   rx_hash_fields_mask;
-       __u8    rx_hash_function;
+       __u64   rx_hash_fields_mask; /* Use  enum mlx4_ib_rx_hash_fields */
+       __u8    rx_hash_function; /* Use enum mlx4_ib_rx_hash_function_flags */
        __u8    reserved[7];
        __u8    rx_hash_key[40];
        __u32   comp_mask;
@@ -152,7 +152,8 @@ enum mlx4_ib_rx_hash_fields {
        MLX4_IB_RX_HASH_SRC_PORT_TCP    = 1 << 4,
        MLX4_IB_RX_HASH_DST_PORT_TCP    = 1 << 5,
        MLX4_IB_RX_HASH_SRC_PORT_UDP    = 1 << 6,
-       MLX4_IB_RX_HASH_DST_PORT_UDP    = 1 << 7
+       MLX4_IB_RX_HASH_DST_PORT_UDP    = 1 << 7,
+       MLX4_IB_RX_HASH_INNER           = 1ULL << 31,
 };
 
 #endif /* MLX4_ABI_USER_H */