diff options
| author | Leon Romanovsky <leonro@mellanox.com> | 2018-11-28 13:53:43 -0500 |
|---|---|---|
| committer | Leon Romanovsky <leonro@mellanox.com> | 2018-12-04 02:26:00 -0500 |
| commit | 36ff48805ae457d79886147913ad07056780dca0 (patch) | |
| tree | ac25bd18f2b27677efd5806989ec48b7c10bd17b /drivers/infiniband/hw/mlx5/srq_cmd.c | |
| parent | a1eb180238a71797d84bd91acfb1de1d632623c5 (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.c | 62 |
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 | ||
| 301 | static 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 | |||
| 309 | static 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 | |||
| 319 | static int create_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, | 301 | static 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) | |||
| 373 | static int arm_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, | 355 | static 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 | ||
| 391 | out: | ||
| 399 | kvfree(in); | 392 | kvfree(in); |
| 393 | kvfree(out); | ||
| 400 | return err; | 394 | return err; |
| 401 | } | 395 | } |
| 402 | 396 | ||
| 403 | static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq, | 397 | static 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 | ||
| 423 | out: | 428 | out: |
| 424 | kvfree(rmp_out); | 429 | kvfree(rmp_out); |
| 430 | kvfree(rmp_in); | ||
| 425 | return err; | 431 | return err; |
| 426 | } | 432 | } |
| 427 | 433 | ||
