Commit 42caf9cb authored by Mark Bloch's avatar Mark Bloch Committed by Jason Gunthorpe

RDMA/mlx5: Allow only raw Ethernet QPs when RoCE isn't enabled

When operating in switchdev mode or using devlink to disable RoCE
only raw Ethernet QPs are allowed to be created.

When in switchdev mode this can lead to passing an invalid port number
as part of the modify qp firmware cmd and will lead to a syndrome
reported back to the user, such as:

 * mlx5_cmd_check:803:(pid 50148): RST2INIT_QP(0x502) op_mod(0x0) failed,
   status bad parameter(0x3), syndrome (0x177405).

Internal UD QP might be used to test for write combining support (even if
externally we report RoCE as disabled) check for that specific flag and
allow is specifically.

Fixes: b5ca15ad ("IB/mlx5: Add proper representors support")
Link: https://lore.kernel.org/r/20200506071602.7177-3-leon@kernel.orgSigned-off-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 8d93efb8
...@@ -2436,15 +2436,17 @@ static int check_qp_type(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr, ...@@ -2436,15 +2436,17 @@ static int check_qp_type(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
if (!MLX5_CAP_GEN(dev->mdev, xrc)) if (!MLX5_CAP_GEN(dev->mdev, xrc))
goto out; goto out;
fallthrough; fallthrough;
case IB_QPT_RAW_PACKET:
case IB_QPT_RC: case IB_QPT_RC:
case IB_QPT_UC: case IB_QPT_UC:
case IB_QPT_UD:
case IB_QPT_SMI: case IB_QPT_SMI:
case MLX5_IB_QPT_HW_GSI: case MLX5_IB_QPT_HW_GSI:
case MLX5_IB_QPT_REG_UMR:
case IB_QPT_DRIVER: case IB_QPT_DRIVER:
case IB_QPT_GSI: case IB_QPT_GSI:
if (dev->profile == &raw_eth_profile)
goto out;
case IB_QPT_RAW_PACKET:
case IB_QPT_UD:
case MLX5_IB_QPT_REG_UMR:
break; break;
default: default:
goto out; goto out;
...@@ -2641,6 +2643,10 @@ static int process_create_flags(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, ...@@ -2641,6 +2643,10 @@ static int process_create_flags(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
int create_flags = attr->create_flags; int create_flags = attr->create_flags;
bool cond; bool cond;
if (qp->type == IB_QPT_UD && dev->profile == &raw_eth_profile)
if (create_flags & ~MLX5_IB_QP_CREATE_WC_TEST)
return -EINVAL;
if (qp_type == MLX5_IB_QPT_DCT) if (qp_type == MLX5_IB_QPT_DCT)
return (create_flags) ? -EINVAL : 0; return (create_flags) ? -EINVAL : 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment