aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYishai Hadas <yishaih@mellanox.com>2018-09-20 14:35:24 -0400
committerLeon Romanovsky <leonro@mellanox.com>2018-09-25 02:52:52 -0400
commita0d8c054318976927493ffd26055d9d183c9beec (patch)
tree4e2842362e8520f811fc52e4c99b3faccb763040
parent430ae0d5a3ce1350375690cb6ab29ab6fae4a9ac (diff)
net/mlx5: Set uid as part of SRQ commands
Set uid as part of SRQ commands so that the firmware can manage the SRQ object in a secured way. That will enable using an SRQ that was created by verbs application to be used by the DEVX flow in case the uid is equal. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/srq.c30
-rw-r--r--include/linux/mlx5/driver.h1
-rw-r--r--include/linux/mlx5/mlx5_ifc.h22
-rw-r--r--include/linux/mlx5/srq.h1
4 files changed, 40 insertions, 14 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/srq.c b/drivers/net/ethernet/mellanox/mlx5/core/srq.c
index 23cc337a96c9..5c519615fb1c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/srq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/srq.c
@@ -166,6 +166,7 @@ static int create_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
166 if (!create_in) 166 if (!create_in)
167 return -ENOMEM; 167 return -ENOMEM;
168 168
169 MLX5_SET(create_srq_in, create_in, uid, in->uid);
169 srqc = MLX5_ADDR_OF(create_srq_in, create_in, srq_context_entry); 170 srqc = MLX5_ADDR_OF(create_srq_in, create_in, srq_context_entry);
170 pas = MLX5_ADDR_OF(create_srq_in, create_in, pas); 171 pas = MLX5_ADDR_OF(create_srq_in, create_in, pas);
171 172
@@ -178,8 +179,10 @@ static int create_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
178 err = mlx5_cmd_exec(dev, create_in, inlen, create_out, 179 err = mlx5_cmd_exec(dev, create_in, inlen, create_out,
179 sizeof(create_out)); 180 sizeof(create_out));
180 kvfree(create_in); 181 kvfree(create_in);
181 if (!err) 182 if (!err) {
182 srq->srqn = MLX5_GET(create_srq_out, create_out, srqn); 183 srq->srqn = MLX5_GET(create_srq_out, create_out, srqn);
184 srq->uid = in->uid;
185 }
183 186
184 return err; 187 return err;
185} 188}
@@ -193,6 +196,7 @@ static int destroy_srq_cmd(struct mlx5_core_dev *dev,
193 MLX5_SET(destroy_srq_in, srq_in, opcode, 196 MLX5_SET(destroy_srq_in, srq_in, opcode,
194 MLX5_CMD_OP_DESTROY_SRQ); 197 MLX5_CMD_OP_DESTROY_SRQ);
195 MLX5_SET(destroy_srq_in, srq_in, srqn, srq->srqn); 198 MLX5_SET(destroy_srq_in, srq_in, srqn, srq->srqn);
199 MLX5_SET(destroy_srq_in, srq_in, uid, srq->uid);
196 200
197 return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in), 201 return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in),
198 srq_out, sizeof(srq_out)); 202 srq_out, sizeof(srq_out));
@@ -208,6 +212,7 @@ static int arm_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
208 MLX5_SET(arm_rq_in, srq_in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_SRQ); 212 MLX5_SET(arm_rq_in, srq_in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_SRQ);
209 MLX5_SET(arm_rq_in, srq_in, srq_number, srq->srqn); 213 MLX5_SET(arm_rq_in, srq_in, srq_number, srq->srqn);
210 MLX5_SET(arm_rq_in, srq_in, lwm, lwm); 214 MLX5_SET(arm_rq_in, srq_in, lwm, lwm);
215 MLX5_SET(arm_rq_in, srq_in, uid, srq->uid);
211 216
212 return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in), 217 return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in),
213 srq_out, sizeof(srq_out)); 218 srq_out, sizeof(srq_out));
@@ -260,6 +265,7 @@ static int create_xrc_srq_cmd(struct mlx5_core_dev *dev,
260 if (!create_in) 265 if (!create_in)
261 return -ENOMEM; 266 return -ENOMEM;
262 267
268 MLX5_SET(create_xrc_srq_in, create_in, uid, in->uid);
263 xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, create_in, 269 xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, create_in,
264 xrc_srq_context_entry); 270 xrc_srq_context_entry);
265 pas = MLX5_ADDR_OF(create_xrc_srq_in, create_in, pas); 271 pas = MLX5_ADDR_OF(create_xrc_srq_in, create_in, pas);
@@ -277,6 +283,7 @@ static int create_xrc_srq_cmd(struct mlx5_core_dev *dev,
277 goto out; 283 goto out;
278 284
279 srq->srqn = MLX5_GET(create_xrc_srq_out, create_out, xrc_srqn); 285 srq->srqn = MLX5_GET(create_xrc_srq_out, create_out, xrc_srqn);
286 srq->uid = in->uid;
280out: 287out:
281 kvfree(create_in); 288 kvfree(create_in);
282 return err; 289 return err;
@@ -291,6 +298,7 @@ static int destroy_xrc_srq_cmd(struct mlx5_core_dev *dev,
291 MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, opcode, 298 MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, opcode,
292 MLX5_CMD_OP_DESTROY_XRC_SRQ); 299 MLX5_CMD_OP_DESTROY_XRC_SRQ);
293 MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn); 300 MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn);
301 MLX5_SET(destroy_xrc_srq_in, xrcsrq_in, uid, srq->uid);
294 302
295 return mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in), 303 return mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in),
296 xrcsrq_out, sizeof(xrcsrq_out)); 304 xrcsrq_out, sizeof(xrcsrq_out));
@@ -306,6 +314,7 @@ static int arm_xrc_srq_cmd(struct mlx5_core_dev *dev,
306 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, op_mod, MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ); 314 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, op_mod, MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ);
307 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn); 315 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, xrc_srqn, srq->srqn);
308 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, lwm, lwm); 316 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, lwm, lwm);
317 MLX5_SET(arm_xrc_srq_in, xrcsrq_in, uid, srq->uid);
309 318
310 return mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in), 319 return mlx5_cmd_exec(dev, xrcsrq_in, sizeof(xrcsrq_in),
311 xrcsrq_out, sizeof(xrcsrq_out)); 320 xrcsrq_out, sizeof(xrcsrq_out));
@@ -365,10 +374,13 @@ static int create_rmp_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
365 wq = MLX5_ADDR_OF(rmpc, rmpc, wq); 374 wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
366 375
367 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY); 376 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
377 MLX5_SET(create_rmp_in, create_in, uid, in->uid);
368 set_wq(wq, in); 378 set_wq(wq, in);
369 memcpy(MLX5_ADDR_OF(rmpc, rmpc, wq.pas), in->pas, pas_size); 379 memcpy(MLX5_ADDR_OF(rmpc, rmpc, wq.pas), in->pas, pas_size);
370 380
371 err = mlx5_core_create_rmp(dev, create_in, inlen, &srq->srqn); 381 err = mlx5_core_create_rmp(dev, create_in, inlen, &srq->srqn);
382 if (!err)
383 srq->uid = in->uid;
372 384
373 kvfree(create_in); 385 kvfree(create_in);
374 return err; 386 return err;
@@ -377,7 +389,13 @@ static int create_rmp_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
377static int destroy_rmp_cmd(struct mlx5_core_dev *dev, 389static int destroy_rmp_cmd(struct mlx5_core_dev *dev,
378 struct mlx5_core_srq *srq) 390 struct mlx5_core_srq *srq)
379{ 391{
380 return mlx5_core_destroy_rmp(dev, srq->srqn); 392 u32 in[MLX5_ST_SZ_DW(destroy_rmp_in)] = {};
393 u32 out[MLX5_ST_SZ_DW(destroy_rmp_out)] = {};
394
395 MLX5_SET(destroy_rmp_in, in, opcode, MLX5_CMD_OP_DESTROY_RMP);
396 MLX5_SET(destroy_rmp_in, in, rmpn, srq->srqn);
397 MLX5_SET(destroy_rmp_in, in, uid, srq->uid);
398 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
381} 399}
382 400
383static int arm_rmp_cmd(struct mlx5_core_dev *dev, 401static int arm_rmp_cmd(struct mlx5_core_dev *dev,
@@ -400,6 +418,7 @@ static int arm_rmp_cmd(struct mlx5_core_dev *dev,
400 418
401 MLX5_SET(modify_rmp_in, in, rmp_state, MLX5_RMPC_STATE_RDY); 419 MLX5_SET(modify_rmp_in, in, rmp_state, MLX5_RMPC_STATE_RDY);
402 MLX5_SET(modify_rmp_in, in, rmpn, srq->srqn); 420 MLX5_SET(modify_rmp_in, in, rmpn, srq->srqn);
421 MLX5_SET(modify_rmp_in, in, uid, srq->uid);
403 MLX5_SET(wq, wq, lwm, lwm); 422 MLX5_SET(wq, wq, lwm, lwm);
404 MLX5_SET(rmp_bitmask, bitmask, lwm, 1); 423 MLX5_SET(rmp_bitmask, bitmask, lwm, 1);
405 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY); 424 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
@@ -469,11 +488,14 @@ static int create_xrq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
469 MLX5_SET(xrqc, xrqc, user_index, in->user_index); 488 MLX5_SET(xrqc, xrqc, user_index, in->user_index);
470 MLX5_SET(xrqc, xrqc, cqn, in->cqn); 489 MLX5_SET(xrqc, xrqc, cqn, in->cqn);
471 MLX5_SET(create_xrq_in, create_in, opcode, MLX5_CMD_OP_CREATE_XRQ); 490 MLX5_SET(create_xrq_in, create_in, opcode, MLX5_CMD_OP_CREATE_XRQ);
491 MLX5_SET(create_xrq_in, create_in, uid, in->uid);
472 err = mlx5_cmd_exec(dev, create_in, inlen, create_out, 492 err = mlx5_cmd_exec(dev, create_in, inlen, create_out,
473 sizeof(create_out)); 493 sizeof(create_out));
474 kvfree(create_in); 494 kvfree(create_in);
475 if (!err) 495 if (!err) {
476 srq->srqn = MLX5_GET(create_xrq_out, create_out, xrqn); 496 srq->srqn = MLX5_GET(create_xrq_out, create_out, xrqn);
497 srq->uid = in->uid;
498 }
477 499
478 return err; 500 return err;
479} 501}
@@ -485,6 +507,7 @@ static int destroy_xrq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq)
485 507
486 MLX5_SET(destroy_xrq_in, in, opcode, MLX5_CMD_OP_DESTROY_XRQ); 508 MLX5_SET(destroy_xrq_in, in, opcode, MLX5_CMD_OP_DESTROY_XRQ);
487 MLX5_SET(destroy_xrq_in, in, xrqn, srq->srqn); 509 MLX5_SET(destroy_xrq_in, in, xrqn, srq->srqn);
510 MLX5_SET(destroy_xrq_in, in, uid, srq->uid);
488 511
489 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 512 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
490} 513}
@@ -500,6 +523,7 @@ static int arm_xrq_cmd(struct mlx5_core_dev *dev,
500 MLX5_SET(arm_rq_in, in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_XRQ); 523 MLX5_SET(arm_rq_in, in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_XRQ);
501 MLX5_SET(arm_rq_in, in, srq_number, srq->srqn); 524 MLX5_SET(arm_rq_in, in, srq_number, srq->srqn);
502 MLX5_SET(arm_rq_in, in, lwm, lwm); 525 MLX5_SET(arm_rq_in, in, lwm, lwm);
526 MLX5_SET(arm_rq_in, in, uid, srq->uid);
503 527
504 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 528 return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
505} 529}
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
index d885e9f0e054..8fb072aa8671 100644
--- a/include/linux/mlx5/driver.h
+++ b/include/linux/mlx5/driver.h
@@ -474,6 +474,7 @@ struct mlx5_core_srq {
474 474
475 atomic_t refcount; 475 atomic_t refcount;
476 struct completion free; 476 struct completion free;
477 u16 uid;
477}; 478};
478 479
479struct mlx5_eq_table { 480struct mlx5_eq_table {
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index 72dd1e49a799..85f1237d80db 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -5524,7 +5524,7 @@ struct mlx5_ifc_rmp_bitmask_bits {
5524 5524
5525struct mlx5_ifc_modify_rmp_in_bits { 5525struct mlx5_ifc_modify_rmp_in_bits {
5526 u8 opcode[0x10]; 5526 u8 opcode[0x10];
5527 u8 reserved_at_10[0x10]; 5527 u8 uid[0x10];
5528 5528
5529 u8 reserved_at_20[0x10]; 5529 u8 reserved_at_20[0x10];
5530 u8 op_mod[0x10]; 5530 u8 op_mod[0x10];
@@ -5986,7 +5986,7 @@ struct mlx5_ifc_destroy_xrq_out_bits {
5986 5986
5987struct mlx5_ifc_destroy_xrq_in_bits { 5987struct mlx5_ifc_destroy_xrq_in_bits {
5988 u8 opcode[0x10]; 5988 u8 opcode[0x10];
5989 u8 reserved_at_10[0x10]; 5989 u8 uid[0x10];
5990 5990
5991 u8 reserved_at_20[0x10]; 5991 u8 reserved_at_20[0x10];
5992 u8 op_mod[0x10]; 5992 u8 op_mod[0x10];
@@ -6008,7 +6008,7 @@ struct mlx5_ifc_destroy_xrc_srq_out_bits {
6008 6008
6009struct mlx5_ifc_destroy_xrc_srq_in_bits { 6009struct mlx5_ifc_destroy_xrc_srq_in_bits {
6010 u8 opcode[0x10]; 6010 u8 opcode[0x10];
6011 u8 reserved_at_10[0x10]; 6011 u8 uid[0x10];
6012 6012
6013 u8 reserved_at_20[0x10]; 6013 u8 reserved_at_20[0x10];
6014 u8 op_mod[0x10]; 6014 u8 op_mod[0x10];
@@ -6074,7 +6074,7 @@ struct mlx5_ifc_destroy_srq_out_bits {
6074 6074
6075struct mlx5_ifc_destroy_srq_in_bits { 6075struct mlx5_ifc_destroy_srq_in_bits {
6076 u8 opcode[0x10]; 6076 u8 opcode[0x10];
6077 u8 reserved_at_10[0x10]; 6077 u8 uid[0x10];
6078 6078
6079 u8 reserved_at_20[0x10]; 6079 u8 reserved_at_20[0x10];
6080 u8 op_mod[0x10]; 6080 u8 op_mod[0x10];
@@ -6208,7 +6208,7 @@ struct mlx5_ifc_destroy_rmp_out_bits {
6208 6208
6209struct mlx5_ifc_destroy_rmp_in_bits { 6209struct mlx5_ifc_destroy_rmp_in_bits {
6210 u8 opcode[0x10]; 6210 u8 opcode[0x10];
6211 u8 reserved_at_10[0x10]; 6211 u8 uid[0x10];
6212 6212
6213 u8 reserved_at_20[0x10]; 6213 u8 reserved_at_20[0x10];
6214 u8 op_mod[0x10]; 6214 u8 op_mod[0x10];
@@ -6641,7 +6641,7 @@ struct mlx5_ifc_create_xrq_out_bits {
6641 6641
6642struct mlx5_ifc_create_xrq_in_bits { 6642struct mlx5_ifc_create_xrq_in_bits {
6643 u8 opcode[0x10]; 6643 u8 opcode[0x10];
6644 u8 reserved_at_10[0x10]; 6644 u8 uid[0x10];
6645 6645
6646 u8 reserved_at_20[0x10]; 6646 u8 reserved_at_20[0x10];
6647 u8 op_mod[0x10]; 6647 u8 op_mod[0x10];
@@ -6665,7 +6665,7 @@ struct mlx5_ifc_create_xrc_srq_out_bits {
6665 6665
6666struct mlx5_ifc_create_xrc_srq_in_bits { 6666struct mlx5_ifc_create_xrc_srq_in_bits {
6667 u8 opcode[0x10]; 6667 u8 opcode[0x10];
6668 u8 reserved_at_10[0x10]; 6668 u8 uid[0x10];
6669 6669
6670 u8 reserved_at_20[0x10]; 6670 u8 reserved_at_20[0x10];
6671 u8 op_mod[0x10]; 6671 u8 op_mod[0x10];
@@ -6741,7 +6741,7 @@ struct mlx5_ifc_create_srq_out_bits {
6741 6741
6742struct mlx5_ifc_create_srq_in_bits { 6742struct mlx5_ifc_create_srq_in_bits {
6743 u8 opcode[0x10]; 6743 u8 opcode[0x10];
6744 u8 reserved_at_10[0x10]; 6744 u8 uid[0x10];
6745 6745
6746 u8 reserved_at_20[0x10]; 6746 u8 reserved_at_20[0x10];
6747 u8 op_mod[0x10]; 6747 u8 op_mod[0x10];
@@ -6871,7 +6871,7 @@ struct mlx5_ifc_create_rmp_out_bits {
6871 6871
6872struct mlx5_ifc_create_rmp_in_bits { 6872struct mlx5_ifc_create_rmp_in_bits {
6873 u8 opcode[0x10]; 6873 u8 opcode[0x10];
6874 u8 reserved_at_10[0x10]; 6874 u8 uid[0x10];
6875 6875
6876 u8 reserved_at_20[0x10]; 6876 u8 reserved_at_20[0x10];
6877 u8 op_mod[0x10]; 6877 u8 op_mod[0x10];
@@ -7272,7 +7272,7 @@ enum {
7272 7272
7273struct mlx5_ifc_arm_xrc_srq_in_bits { 7273struct mlx5_ifc_arm_xrc_srq_in_bits {
7274 u8 opcode[0x10]; 7274 u8 opcode[0x10];
7275 u8 reserved_at_10[0x10]; 7275 u8 uid[0x10];
7276 7276
7277 u8 reserved_at_20[0x10]; 7277 u8 reserved_at_20[0x10];
7278 u8 op_mod[0x10]; 7278 u8 op_mod[0x10];
@@ -7300,7 +7300,7 @@ enum {
7300 7300
7301struct mlx5_ifc_arm_rq_in_bits { 7301struct mlx5_ifc_arm_rq_in_bits {
7302 u8 opcode[0x10]; 7302 u8 opcode[0x10];
7303 u8 reserved_at_10[0x10]; 7303 u8 uid[0x10];
7304 7304
7305 u8 reserved_at_20[0x10]; 7305 u8 reserved_at_20[0x10];
7306 u8 op_mod[0x10]; 7306 u8 op_mod[0x10];
diff --git a/include/linux/mlx5/srq.h b/include/linux/mlx5/srq.h
index 24ff23e27c8a..1b1f3c20c6a3 100644
--- a/include/linux/mlx5/srq.h
+++ b/include/linux/mlx5/srq.h
@@ -61,6 +61,7 @@ struct mlx5_srq_attr {
61 u32 tm_next_tag; 61 u32 tm_next_tag;
62 u32 tm_hw_phase_cnt; 62 u32 tm_hw_phase_cnt;
63 u32 tm_sw_phase_cnt; 63 u32 tm_sw_phase_cnt;
64 u16 uid;
64}; 65};
65 66
66struct mlx5_core_dev; 67struct mlx5_core_dev;