Skip to content

Commit bcc7354

Browse files
committed
Merge branch 'mlx4-net'
Or Gerlitz says: ==================== Setup mlx4 user space Ethernet QPs to properly handle VXLAN This short series fixes the mlx4 driver setting of user space Ethernet QPs (e.g those opened by DPDK applications) such that they will properly handle VXLAN traffic/offloads ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 362b37b + d2fce8a commit bcc7354

File tree

5 files changed

+80
-30
lines changed

5 files changed

+80
-30
lines changed

drivers/infiniband/hw/mlx4/main.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,30 @@ static int __mlx4_ib_destroy_flow(struct mlx4_dev *dev, u64 reg_id)
10891089
return err;
10901090
}
10911091

1092+
static int mlx4_ib_tunnel_steer_add(struct ib_qp *qp, struct ib_flow_attr *flow_attr,
1093+
u64 *reg_id)
1094+
{
1095+
void *ib_flow;
1096+
union ib_flow_spec *ib_spec;
1097+
struct mlx4_dev *dev = to_mdev(qp->device)->dev;
1098+
int err = 0;
1099+
1100+
if (dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
1101+
return 0; /* do nothing */
1102+
1103+
ib_flow = flow_attr + 1;
1104+
ib_spec = (union ib_flow_spec *)ib_flow;
1105+
1106+
if (ib_spec->type != IB_FLOW_SPEC_ETH || flow_attr->num_of_specs != 1)
1107+
return 0; /* do nothing */
1108+
1109+
err = mlx4_tunnel_steer_add(to_mdev(qp->device)->dev, ib_spec->eth.val.dst_mac,
1110+
flow_attr->port, qp->qp_num,
1111+
MLX4_DOMAIN_UVERBS | (flow_attr->priority & 0xff),
1112+
reg_id);
1113+
return err;
1114+
}
1115+
10921116
static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
10931117
struct ib_flow_attr *flow_attr,
10941118
int domain)
@@ -1136,6 +1160,12 @@ static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp,
11361160
i++;
11371161
}
11381162

1163+
if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) {
1164+
err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]);
1165+
if (err)
1166+
goto err_free;
1167+
}
1168+
11391169
return &mflow->ibflow;
11401170

11411171
err_free:

drivers/infiniband/hw/mlx4/qp.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1677,9 +1677,15 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
16771677
}
16781678
}
16791679

1680-
if (qp->ibqp.qp_type == IB_QPT_RAW_PACKET)
1680+
if (qp->ibqp.qp_type == IB_QPT_RAW_PACKET) {
16811681
context->pri_path.ackto = (context->pri_path.ackto & 0xf8) |
16821682
MLX4_IB_LINK_TYPE_ETH;
1683+
if (dev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) {
1684+
/* set QP to receive both tunneled & non-tunneled packets */
1685+
if (!(context->flags & (1 << MLX4_RSS_QPC_FLAG_OFFSET)))
1686+
context->srqn = cpu_to_be32(7 << 28);
1687+
}
1688+
}
16831689

16841690
if (ibqp->qp_type == IB_QPT_UD && (new_state == IB_QPS_RTR)) {
16851691
int is_eth = rdma_port_get_link_layer(

drivers/net/ethernet/mellanox/mlx4/en_netdev.c

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -474,39 +474,12 @@ static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *ad
474474
int qpn, u64 *reg_id)
475475
{
476476
int err;
477-
struct mlx4_spec_list spec_eth_outer = { {NULL} };
478-
struct mlx4_spec_list spec_vxlan = { {NULL} };
479-
struct mlx4_spec_list spec_eth_inner = { {NULL} };
480-
481-
struct mlx4_net_trans_rule rule = {
482-
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
483-
.exclusive = 0,
484-
.allow_loopback = 1,
485-
.promisc_mode = MLX4_FS_REGULAR,
486-
.priority = MLX4_DOMAIN_NIC,
487-
};
488-
489-
__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);
490477

491478
if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
492479
return 0; /* do nothing */
493480

494-
rule.port = priv->port;
495-
rule.qpn = qpn;
496-
INIT_LIST_HEAD(&rule.list);
497-
498-
spec_eth_outer.id = MLX4_NET_TRANS_RULE_ID_ETH;
499-
memcpy(spec_eth_outer.eth.dst_mac, addr, ETH_ALEN);
500-
memcpy(spec_eth_outer.eth.dst_mac_msk, &mac_mask, ETH_ALEN);
501-
502-
spec_vxlan.id = MLX4_NET_TRANS_RULE_ID_VXLAN; /* any vxlan header */
503-
spec_eth_inner.id = MLX4_NET_TRANS_RULE_ID_ETH; /* any inner eth header */
504-
505-
list_add_tail(&spec_eth_outer.list, &rule.list);
506-
list_add_tail(&spec_vxlan.list, &rule.list);
507-
list_add_tail(&spec_eth_inner.list, &rule.list);
508-
509-
err = mlx4_flow_attach(priv->mdev->dev, &rule, reg_id);
481+
err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn,
482+
MLX4_DOMAIN_NIC, reg_id);
510483
if (err) {
511484
en_err(priv, "failed to add vxlan steering rule, err %d\n", err);
512485
return err;

drivers/net/ethernet/mellanox/mlx4/mcg.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,44 @@ int mlx4_flow_detach(struct mlx4_dev *dev, u64 reg_id)
10201020
}
10211021
EXPORT_SYMBOL_GPL(mlx4_flow_detach);
10221022

1023+
int mlx4_tunnel_steer_add(struct mlx4_dev *dev, unsigned char *addr,
1024+
int port, int qpn, u16 prio, u64 *reg_id)
1025+
{
1026+
int err;
1027+
struct mlx4_spec_list spec_eth_outer = { {NULL} };
1028+
struct mlx4_spec_list spec_vxlan = { {NULL} };
1029+
struct mlx4_spec_list spec_eth_inner = { {NULL} };
1030+
1031+
struct mlx4_net_trans_rule rule = {
1032+
.queue_mode = MLX4_NET_TRANS_Q_FIFO,
1033+
.exclusive = 0,
1034+
.allow_loopback = 1,
1035+
.promisc_mode = MLX4_FS_REGULAR,
1036+
};
1037+
1038+
__be64 mac_mask = cpu_to_be64(MLX4_MAC_MASK << 16);
1039+
1040+
rule.port = port;
1041+
rule.qpn = qpn;
1042+
rule.priority = prio;
1043+
INIT_LIST_HEAD(&rule.list);
1044+
1045+
spec_eth_outer.id = MLX4_NET_TRANS_RULE_ID_ETH;
1046+
memcpy(spec_eth_outer.eth.dst_mac, addr, ETH_ALEN);
1047+
memcpy(spec_eth_outer.eth.dst_mac_msk, &mac_mask, ETH_ALEN);
1048+
1049+
spec_vxlan.id = MLX4_NET_TRANS_RULE_ID_VXLAN; /* any vxlan header */
1050+
spec_eth_inner.id = MLX4_NET_TRANS_RULE_ID_ETH; /* any inner eth header */
1051+
1052+
list_add_tail(&spec_eth_outer.list, &rule.list);
1053+
list_add_tail(&spec_vxlan.list, &rule.list);
1054+
list_add_tail(&spec_eth_inner.list, &rule.list);
1055+
1056+
err = mlx4_flow_attach(dev, &rule, reg_id);
1057+
return err;
1058+
}
1059+
EXPORT_SYMBOL(mlx4_tunnel_steer_add);
1060+
10231061
int mlx4_FLOW_STEERING_IB_UC_QP_RANGE(struct mlx4_dev *dev, u32 min_range_qpn,
10241062
u32 max_range_qpn)
10251063
{

include/linux/mlx4/device.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,6 +1196,9 @@ int mlx4_map_sw_to_hw_steering_id(struct mlx4_dev *dev,
11961196
enum mlx4_net_trans_rule_id id);
11971197
int mlx4_hw_rule_sz(struct mlx4_dev *dev, enum mlx4_net_trans_rule_id id);
11981198

1199+
int mlx4_tunnel_steer_add(struct mlx4_dev *dev, unsigned char *addr,
1200+
int port, int qpn, u16 prio, u64 *reg_id);
1201+
11991202
void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port,
12001203
int i, int val);
12011204

0 commit comments

Comments
 (0)