aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Bloch <markb@mellanox.com>2018-01-29 05:40:37 -0500
committerSaeed Mahameed <saeedm@mellanox.com>2018-02-23 15:36:39 -0500
commitb96c9dde17359520d6a5a8eb6d56d91f22c5a413 (patch)
treead9a5077e2af22bb9acfd3c41b589a69e622b360
parent72afcf82477a58f40d748271a4a78755983203ef (diff)
IB/mlx5: E-Switch, Add rule to forward traffic to vport
In order to forward traffic from representor's SQ to the right virtual function, every time an SQ is created also add the corresponding flow rule to the FDB. Signed-off-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
-rw-r--r--drivers/infiniband/hw/mlx5/ib_rep.c20
-rw-r--r--drivers/infiniband/hw/mlx5/ib_rep.h8
-rw-r--r--drivers/infiniband/hw/mlx5/mlx5_ib.h1
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c16
4 files changed, 45 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/ib_rep.c b/drivers/infiniband/hw/mlx5/ib_rep.c
index adf2439ddacb..a5d0c3917568 100644
--- a/drivers/infiniband/hw/mlx5/ib_rep.c
+++ b/drivers/infiniband/hw/mlx5/ib_rep.c
@@ -102,3 +102,23 @@ struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw, int vport)
102{ 102{
103 return mlx5_eswitch_vport_rep(esw, vport); 103 return mlx5_eswitch_vport_rep(esw, vport);
104} 104}
105
106int create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
107 struct mlx5_ib_sq *sq)
108{
109 struct mlx5_flow_handle *flow_rule;
110 struct mlx5_eswitch *esw = dev->mdev->priv.eswitch;
111
112 if (!dev->rep)
113 return 0;
114
115 flow_rule =
116 mlx5_eswitch_add_send_to_vport_rule(esw,
117 dev->rep->vport,
118 sq->base.mqp.qpn);
119 if (IS_ERR(flow_rule))
120 return PTR_ERR(flow_rule);
121 sq->flow_rule = flow_rule;
122
123 return 0;
124}
diff --git a/drivers/infiniband/hw/mlx5/ib_rep.h b/drivers/infiniband/hw/mlx5/ib_rep.h
index 923ad4cba941..832cfd382ecc 100644
--- a/drivers/infiniband/hw/mlx5/ib_rep.h
+++ b/drivers/infiniband/hw/mlx5/ib_rep.h
@@ -17,6 +17,8 @@ struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
17 int vport_index); 17 int vport_index);
18void mlx5_ib_register_vport_reps(struct mlx5_ib_dev *dev); 18void mlx5_ib_register_vport_reps(struct mlx5_ib_dev *dev);
19void mlx5_ib_unregister_vport_reps(struct mlx5_ib_dev *dev); 19void mlx5_ib_unregister_vport_reps(struct mlx5_ib_dev *dev);
20int create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
21 struct mlx5_ib_sq *sq);
20struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw, 22struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
21 int vport_index); 23 int vport_index);
22#else /* CONFIG_MLX5_ESWITCH */ 24#else /* CONFIG_MLX5_ESWITCH */
@@ -41,6 +43,12 @@ struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
41 43
42static inline void mlx5_ib_register_vport_reps(struct mlx5_ib_dev *dev) {} 44static inline void mlx5_ib_register_vport_reps(struct mlx5_ib_dev *dev) {}
43static inline void mlx5_ib_unregister_vport_reps(struct mlx5_ib_dev *dev) {} 45static inline void mlx5_ib_unregister_vport_reps(struct mlx5_ib_dev *dev) {}
46static inline int create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
47 struct mlx5_ib_sq *sq)
48{
49 return 0;
50}
51
44static inline 52static inline
45struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw, 53struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
46 int vport_index) 54 int vport_index)
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index 4dd98b1e9165..86d07670bfeb 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -343,6 +343,7 @@ struct mlx5_ib_sq {
343 struct mlx5_ib_wq *sq; 343 struct mlx5_ib_wq *sq;
344 struct mlx5_ib_ubuffer ubuffer; 344 struct mlx5_ib_ubuffer ubuffer;
345 struct mlx5_db *doorbell; 345 struct mlx5_db *doorbell;
346 struct mlx5_flow_handle *flow_rule;
346 u32 tisn; 347 u32 tisn;
347 u8 state; 348 u8 state;
348}; 349};
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 39d24bf694a8..8aed091036c6 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -36,6 +36,7 @@
36#include <rdma/ib_user_verbs.h> 36#include <rdma/ib_user_verbs.h>
37#include <linux/mlx5/fs.h> 37#include <linux/mlx5/fs.h>
38#include "mlx5_ib.h" 38#include "mlx5_ib.h"
39#include "ib_rep.h"
39 40
40/* not supported currently */ 41/* not supported currently */
41static int wq_signature; 42static int wq_signature;
@@ -1082,6 +1083,13 @@ static void destroy_raw_packet_qp_tis(struct mlx5_ib_dev *dev,
1082 mlx5_core_destroy_tis(dev->mdev, sq->tisn); 1083 mlx5_core_destroy_tis(dev->mdev, sq->tisn);
1083} 1084}
1084 1085
1086static void destroy_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
1087 struct mlx5_ib_sq *sq)
1088{
1089 if (sq->flow_rule)
1090 mlx5_del_flow_rules(sq->flow_rule);
1091}
1092
1085static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev, 1093static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
1086 struct mlx5_ib_sq *sq, void *qpin, 1094 struct mlx5_ib_sq *sq, void *qpin,
1087 struct ib_pd *pd) 1095 struct ib_pd *pd)
@@ -1145,8 +1153,15 @@ static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
1145 if (err) 1153 if (err)
1146 goto err_umem; 1154 goto err_umem;
1147 1155
1156 err = create_flow_rule_vport_sq(dev, sq);
1157 if (err)
1158 goto err_flow;
1159
1148 return 0; 1160 return 0;
1149 1161
1162err_flow:
1163 mlx5_core_destroy_sq_tracked(dev->mdev, &sq->base.mqp);
1164
1150err_umem: 1165err_umem:
1151 ib_umem_release(sq->ubuffer.umem); 1166 ib_umem_release(sq->ubuffer.umem);
1152 sq->ubuffer.umem = NULL; 1167 sq->ubuffer.umem = NULL;
@@ -1157,6 +1172,7 @@ err_umem:
1157static void destroy_raw_packet_qp_sq(struct mlx5_ib_dev *dev, 1172static void destroy_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
1158 struct mlx5_ib_sq *sq) 1173 struct mlx5_ib_sq *sq)
1159{ 1174{
1175 destroy_flow_rule_vport_sq(dev, sq);
1160 mlx5_core_destroy_sq_tracked(dev->mdev, &sq->base.mqp); 1176 mlx5_core_destroy_sq_tracked(dev->mdev, &sq->base.mqp);
1161 ib_umem_release(sq->ubuffer.umem); 1177 ib_umem_release(sq->ubuffer.umem);
1162} 1178}