RDMA/mlx5: Unfold modify RMP function
authorLeon Romanovsky <leonro@mellanox.com>
Wed, 28 Nov 2018 18:53:43 +0000 (20:53 +0200)
committerLeon Romanovsky <leonro@mellanox.com>
Tue, 4 Dec 2018 07:26:00 +0000 (09:26 +0200)
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>
drivers/infiniband/hw/mlx5/srq_cmd.c

index 955df638b416b666accfd2cafb74fb23c10c049b..7aaaffbd4afa099f36b229af88beb73836fce68e 100644 (file)
@@ -298,24 +298,6 @@ out:
        return err;
 }
 
-static int mlx5_core_modify_rmp(struct mlx5_ib_dev *dev, u32 *in, int inlen)
-{
-       u32 out[MLX5_ST_SZ_DW(modify_rmp_out)] = {0};
-
-       MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
-       return mlx5_cmd_exec(dev->mdev, in, inlen, out, sizeof(out));
-}
-
-static int mlx5_core_query_rmp(struct mlx5_ib_dev *dev, u32 rmpn, u32 *out)
-{
-       u32 in[MLX5_ST_SZ_DW(query_rmp_in)] = {0};
-       int outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
-
-       MLX5_SET(query_rmp_in, in, opcode, MLX5_CMD_OP_QUERY_RMP);
-       MLX5_SET(query_rmp_in, in, rmpn,   rmpn);
-       return mlx5_cmd_exec(dev->mdev, in, sizeof(in), out, outlen);
-}
-
 static int create_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                          struct mlx5_srq_attr *in)
 {
@@ -373,15 +355,24 @@ static int destroy_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
 static int arm_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                       u16 lwm)
 {
-       void *in;
+       void *out = NULL;
+       void *in = NULL;
        void *rmpc;
        void *wq;
        void *bitmask;
+       int outlen;
+       int inlen;
        int err;
 
-       in = kvzalloc(MLX5_ST_SZ_BYTES(modify_rmp_in), GFP_KERNEL);
-       if (!in)
-               return -ENOMEM;
+       inlen = MLX5_ST_SZ_BYTES(modify_rmp_in);
+       outlen = MLX5_ST_SZ_BYTES(modify_rmp_out);
+
+       in = kvzalloc(inlen, GFP_KERNEL);
+       out = kvzalloc(outlen, GFP_KERNEL);
+       if (!in || !out) {
+               err = -ENOMEM;
+               goto out;
+       }
 
        rmpc =    MLX5_ADDR_OF(modify_rmp_in,   in,   ctx);
        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,
        MLX5_SET(wq,            wq,      lwm,       lwm);
        MLX5_SET(rmp_bitmask,   bitmask, lwm,       1);
        MLX5_SET(rmpc, rmpc, state, MLX5_RMPC_STATE_RDY);
+       MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
 
-       err = mlx5_core_modify_rmp(dev, in, MLX5_ST_SZ_BYTES(modify_rmp_in));
+       err = mlx5_cmd_exec(dev->mdev, in, inlen, out, outlen);
 
+out:
        kvfree(in);
+       kvfree(out);
        return err;
 }
 
 static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
                         struct mlx5_srq_attr *out)
 {
-       u32 *rmp_out;
+       u32 *rmp_out = NULL;
+       u32 *rmp_in = NULL;
        void *rmpc;
+       int outlen;
+       int inlen;
        int err;
 
-       rmp_out =  kvzalloc(MLX5_ST_SZ_BYTES(query_rmp_out), GFP_KERNEL);
-       if (!rmp_out)
-               return -ENOMEM;
+       outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
+       inlen = MLX5_ST_SZ_BYTES(query_rmp_in);
+
+       rmp_out = kvzalloc(outlen, GFP_KERNEL);
+       rmp_in = kvzalloc(inlen, GFP_KERNEL);
+       if (!rmp_out || !rmp_in) {
+               err = -ENOMEM;
+               goto out;
+       }
 
-       err = mlx5_core_query_rmp(dev, srq->srqn, rmp_out);
+       MLX5_SET(query_rmp_in, rmp_in, opcode, MLX5_CMD_OP_QUERY_RMP);
+       MLX5_SET(query_rmp_in, rmp_in, rmpn,   srq->srqn);
+       err = mlx5_cmd_exec(dev->mdev, rmp_in, inlen, rmp_out, outlen);
        if (err)
                goto out;
 
@@ -422,6 +427,7 @@ static int query_rmp_cmd(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq,
 
 out:
        kvfree(rmp_out);
+       kvfree(rmp_in);
        return err;
 }