aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx5/srq_cmd.c
diff options
context:
space:
mode:
authorLeon Romanovsky <leonro@mellanox.com>2018-11-28 13:53:43 -0500
committerLeon Romanovsky <leonro@mellanox.com>2018-12-04 02:26:00 -0500
commit36ff48805ae457d79886147913ad07056780dca0 (patch)
treeac25bd18f2b27677efd5806989ec48b7c10bd17b /drivers/infiniband/hw/mlx5/srq_cmd.c
parenta1eb180238a71797d84bd91acfb1de1d632623c5 (diff)
RDMA/mlx5: Unfold modify RMP function
There is no need to perform modify_rmp in two separate function, while one of them uses stack as a placeholder for data while other allocates it dynamically. Combine those two functions to one call instead of two. Reviewed-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx5/srq_cmd.c')
-rw-r--r--drivers/infiniband/hw/mlx5/srq_cmd.c62
1 files changed, 34 insertions, 28 deletions
diff --git a/drivers/infiniband/hw/mlx5/srq_cmd.c b/drivers/infiniband/hw/mlx5/srq_cmd.c
index 955df638b416..7aaaffbd4afa 100644
--- a/drivers/infiniband/hw/mlx5/srq_cmd.c
+++ b/drivers/infiniband/hw/mlx5/srq_cmd.c
@@ -298,24 +298,6 @@ out:
298 return err; 298 return err;
299} 299}
300 300
301static int mlx5_core_modify_rmp(struct mlx5_ib_dev *dev, u32 *in, int inlen)
302{
303 u32 out[MLX5_ST_SZ_DW(modify_rmp_out)] = {0};
304
305 MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
306 return mlx5_cmd_exec(dev->mdev, in, inlen, out, sizeof(out));
307}
308
309static int mlx5_core_query_rmp(struct mlx5_ib_dev *dev, u32 rmpn, u32 *out)
310{
311 u32 in[MLX5_ST_SZ_DW(query_rmp_in)] = {0};
312 int outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
313
314 MLX5_SET(query_rmp_in, in, opcode, MLX5_CMD_OP_QUERY_RMP);
315 MLX5_SET(query_rmp_in, in, rmpn, rmpn);
316 return mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, outlen);
317}
318
319static int create_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, 301static int create_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
320 struct mlx5_srq_attr *in) 302 struct mlx5_srq_attr *in)
321{ 303{
@@ -373,15 +355,24 @@ static int destroy_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
373static int arm_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, 355static int arm_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
374 u16 lwm) 356 u16 lwm)
375{ 357{
376 void *in; 358 void *out = NULL;
359 void *in = NULL;
377 void *rmpc; 360 void *rmpc;
378 void *wq; 361 void *wq;
379 void *bitmask; 362 void *bitmask;
363 int outlen;
364 int inlen;
380 int err; 365 int err;
381 366
382 in = kvzalloc(MLX5_ST_SZ_BYTES(modify_rmp_in), GFP_KERNEL); 367 inlen = MLX5_ST_SZ_BYTES(modify_rmp_in);
383 if (!in) 368 outlen = MLX5_ST_SZ_BYTES(modify_rmp_out);
384 return -ENOMEM; 369
370 in = kvzalloc(inlen, GFP_KERNEL);
371 out = kvzalloc(outlen, GFP_KERNEL);
372 if (!in || !out) {
373 err = -ENOMEM;
374 goto out;
375 }
385 376
386 rmpc = MLX5_ADDR_OF(modify_rmp_in, in, ctx); 377 rmpc = MLX5_ADDR_OF(modify_rmp_in, in, ctx);
387 bitmask = MLX5_ADDR_OF(modify_rmp_in, in, bitmask); 378 bitmask = MLX5_ADDR_OF(modify_rmp_in, in, bitmask);
@@ -393,25 +384,39 @@ static int arm_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
393 MLX5_SET(wq, wq, lwm, lwm); 384 MLX5_SET(wq, wq, lwm, lwm);
394 MLX5_SET(rmp_bitmask, bitmask, lwm, 1); 385 MLX5_SET(rmp_bitmask, bitmask, lwm, 1);
395 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY); 386 MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
387 MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
396 388
397 err = mlx5_core_modify_rmp(dev, in, MLX5_ST_SZ_BYTES(modify_rmp_in)); 389 err = mlx5_cmd_exec(dev->mdev, in, inlen, out, outlen);
398 390
391out:
399 kvfree(in); 392 kvfree(in);
393 kvfree(out);
400 return err; 394 return err;
401} 395}
402 396
403static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, 397static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
404 struct mlx5_srq_attr *out) 398 struct mlx5_srq_attr *out)
405{ 399{
406 u32 *rmp_out; 400 u32 *rmp_out = NULL;
401 u32 *rmp_in = NULL;
407 void *rmpc; 402 void *rmpc;
403 int outlen;
404 int inlen;
408 int err; 405 int err;
409 406
410 rmp_out = kvzalloc(MLX5_ST_SZ_BYTES(query_rmp_out), GFP_KERNEL); 407 outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
411 if (!rmp_out) 408 inlen = MLX5_ST_SZ_BYTES(query_rmp_in);
412 return -ENOMEM; 409
410 rmp_out = kvzalloc(outlen, GFP_KERNEL);
411 rmp_in = kvzalloc(inlen, GFP_KERNEL);
412 if (!rmp_out || !rmp_in) {
413 err = -ENOMEM;
414 goto out;
415 }
413 416
414 err = mlx5_core_query_rmp(dev, srq->srqn, rmp_out); 417 MLX5_SET(query_rmp_in, rmp_in, opcode, MLX5_CMD_OP_QUERY_RMP);
418 MLX5_SET(query_rmp_in, rmp_in, rmpn, srq->srqn);
419 err = mlx5_cmd_exec(dev->mdev, rmp_in, inlen, rmp_out, outlen);
415 if (err) 420 if (err)
416 goto out; 421 goto out;
417 422
@@ -422,6 +427,7 @@ static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
422 427
423out: 428out:
424 kvfree(rmp_out); 429 kvfree(rmp_out);
430 kvfree(rmp_in);
425 return err; 431 return err;
426} 432}
427 433