]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
RDMA/mlx5: Define RoCEv2 udp source port when set path
authorMark Zhang <markz@mellanox.com>
Mon, 4 May 2020 05:19:33 +0000 (08:19 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 6 May 2020 19:51:44 +0000 (16:51 -0300)
Calculate and set UDP source port based on the flow label. If flow label
is not defined in GRH then calculate it based on lqpn/rqpn.

Link: https://lore.kernel.org/r/20200504051935.269708-4-leon@kernel.org
Signed-off-by: Mark Zhang <markz@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/qp.c

index 810bbd52daec216ae486a1891aa02e0455b8dc68..e624886bcf85499600b474a28d9d7dfbc8405f1a 100644 (file)
@@ -3133,6 +3133,21 @@ static int modify_raw_packet_tx_affinity(struct mlx5_core_dev *dev,
        return err;
 }
 
+static void mlx5_set_path_udp_sport(struct mlx5_qp_path *path,
+                                   const struct rdma_ah_attr *ah,
+                                   u32 lqpn, u32 rqpn)
+
+{
+       u32 fl = ah->grh.flow_label;
+       u16 sport;
+
+       if (!fl)
+               fl = rdma_calc_flow_label(lqpn, rqpn);
+
+       sport = rdma_flow_label_to_udp_sport(fl);
+       path->udp_sport = cpu_to_be16(sport);
+}
+
 static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
                         const struct rdma_ah_attr *ah,
                         struct mlx5_qp_path *path, u8 port, int attr_mask,
@@ -3164,12 +3179,15 @@ static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
                        return -EINVAL;
 
                memcpy(path->rmac, ah->roce.dmac, sizeof(ah->roce.dmac));
-               if (qp->ibqp.qp_type == IB_QPT_RC ||
-                   qp->ibqp.qp_type == IB_QPT_UC ||
-                   qp->ibqp.qp_type == IB_QPT_XRC_INI ||
-                   qp->ibqp.qp_type == IB_QPT_XRC_TGT)
-                       path->udp_sport =
-                               mlx5_get_roce_udp_sport(dev, ah->grh.sgid_attr);
+               if ((qp->ibqp.qp_type == IB_QPT_RC ||
+                    qp->ibqp.qp_type == IB_QPT_UC ||
+                    qp->ibqp.qp_type == IB_QPT_XRC_INI ||
+                    qp->ibqp.qp_type == IB_QPT_XRC_TGT) &&
+                   (grh->sgid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) &&
+                   (attr_mask & IB_QP_DEST_QPN))
+                       mlx5_set_path_udp_sport(path, ah,
+                                               qp->ibqp.qp_num,
+                                               attr->dest_qp_num);
                path->dci_cfi_prio_sl = (sl & 0x7) << 4;
                gid_type = ah->grh.sgid_attr->gid_type;
                if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)