Merge branch 'mlx5_tir_icm' into rdma.git for-next
Ariel Levkovich says: ==================== The series exposes the ICM address of the receive transport interface (TIR) of Raw Packet and RSS QPs to the user since they are required to properly create and insert steering rules that direct flows to these QPs. ==================== For dependencies this branch is based on mlx5-next from git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux * branch 'mlx5_tir_icm': IB/mlx5: Expose TIR ICM address to user space net/mlx5: Introduce new TIR creation core API net/mlx5: Expose TIR ICM address in command outbox Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
@@ -1403,7 +1403,8 @@ static void destroy_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
||||
static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
||||
struct mlx5_ib_rq *rq, u32 tdn,
|
||||
u32 *qp_flags_en,
|
||||
struct ib_pd *pd)
|
||||
struct ib_pd *pd,
|
||||
u32 *out, int outlen)
|
||||
{
|
||||
u8 lb_flag = 0;
|
||||
u32 *in;
|
||||
@@ -1437,8 +1438,9 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
|
||||
|
||||
MLX5_SET(tirc, tirc, self_lb_block, lb_flag);
|
||||
|
||||
err = mlx5_core_create_tir(dev->mdev, in, inlen, &rq->tirn);
|
||||
err = mlx5_core_create_tir_out(dev->mdev, in, inlen, out, outlen);
|
||||
|
||||
rq->tirn = MLX5_GET(create_tir_out, out, tirn);
|
||||
if (!err && MLX5_GET(tirc, tirc, self_lb_block)) {
|
||||
err = mlx5_ib_enable_lb(dev, false, true);
|
||||
|
||||
@@ -1464,6 +1466,7 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
int err;
|
||||
u32 tdn = mucontext->tdn;
|
||||
u16 uid = to_mpd(pd)->uid;
|
||||
u32 out[MLX5_ST_SZ_DW(create_tir_out)] = {};
|
||||
|
||||
if (qp->sq.wqe_cnt) {
|
||||
err = create_raw_packet_qp_tis(dev, qp, sq, tdn, pd);
|
||||
@@ -1496,7 +1499,9 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
if (err)
|
||||
goto err_destroy_sq;
|
||||
|
||||
err = create_raw_packet_qp_tir(dev, rq, tdn, &qp->flags_en, pd);
|
||||
err = create_raw_packet_qp_tir(
|
||||
dev, rq, tdn, &qp->flags_en, pd, out,
|
||||
MLX5_ST_SZ_BYTES(create_tir_out));
|
||||
if (err)
|
||||
goto err_destroy_rq;
|
||||
|
||||
@@ -1505,6 +1510,20 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_RQN;
|
||||
resp->tirn = rq->tirn;
|
||||
resp->comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
|
||||
if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev, sw_owner)) {
|
||||
resp->tir_icm_addr = MLX5_GET(
|
||||
create_tir_out, out, icm_address_31_0);
|
||||
resp->tir_icm_addr |=
|
||||
(u64)MLX5_GET(create_tir_out, out,
|
||||
icm_address_39_32)
|
||||
<< 32;
|
||||
resp->tir_icm_addr |=
|
||||
(u64)MLX5_GET(create_tir_out, out,
|
||||
icm_address_63_40)
|
||||
<< 40;
|
||||
resp->comp_mask |=
|
||||
MLX5_IB_CREATE_QP_RESP_MASK_TIR_ICM_ADDR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1578,8 +1597,10 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
udata, struct mlx5_ib_ucontext, ibucontext);
|
||||
struct mlx5_ib_create_qp_resp resp = {};
|
||||
int inlen;
|
||||
int outlen;
|
||||
int err;
|
||||
u32 *in;
|
||||
u32 *out;
|
||||
void *tirc;
|
||||
void *hfso;
|
||||
u32 selected_fields = 0;
|
||||
@@ -1659,10 +1680,12 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
}
|
||||
|
||||
inlen = MLX5_ST_SZ_BYTES(create_tir_in);
|
||||
in = kvzalloc(inlen, GFP_KERNEL);
|
||||
outlen = MLX5_ST_SZ_BYTES(create_tir_out);
|
||||
in = kvzalloc(inlen + outlen, GFP_KERNEL);
|
||||
if (!in)
|
||||
return -ENOMEM;
|
||||
|
||||
out = in + MLX5_ST_SZ_DW(create_tir_in);
|
||||
MLX5_SET(create_tir_in, in, uid, to_mpd(pd)->uid);
|
||||
tirc = MLX5_ADDR_OF(create_tir_in, in, ctx);
|
||||
MLX5_SET(tirc, tirc, disp_type,
|
||||
@@ -1774,8 +1797,9 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
MLX5_SET(rx_hash_field_select, hfso, selected_fields, selected_fields);
|
||||
|
||||
create_tir:
|
||||
err = mlx5_core_create_tir(dev->mdev, in, inlen, &qp->rss_qp.tirn);
|
||||
err = mlx5_core_create_tir_out(dev->mdev, in, inlen, out, outlen);
|
||||
|
||||
qp->rss_qp.tirn = MLX5_GET(create_tir_out, out, tirn);
|
||||
if (!err && MLX5_GET(tirc, tirc, self_lb_block)) {
|
||||
err = mlx5_ib_enable_lb(dev, false, true);
|
||||
|
||||
@@ -1790,6 +1814,18 @@ create_tir:
|
||||
if (mucontext->devx_uid) {
|
||||
resp.comp_mask |= MLX5_IB_CREATE_QP_RESP_MASK_TIRN;
|
||||
resp.tirn = qp->rss_qp.tirn;
|
||||
if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev, sw_owner)) {
|
||||
resp.tir_icm_addr =
|
||||
MLX5_GET(create_tir_out, out, icm_address_31_0);
|
||||
resp.tir_icm_addr |= (u64)MLX5_GET(create_tir_out, out,
|
||||
icm_address_39_32)
|
||||
<< 32;
|
||||
resp.tir_icm_addr |= (u64)MLX5_GET(create_tir_out, out,
|
||||
icm_address_63_40)
|
||||
<< 40;
|
||||
resp.comp_mask |=
|
||||
MLX5_IB_CREATE_QP_RESP_MASK_TIR_ICM_ADDR;
|
||||
}
|
||||
}
|
||||
|
||||
err = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));
|
||||
|
Fai riferimento in un nuovo problema
Block a user