IB/uverbs: Use uverbs_alloc for allocations
Several handlers need temporary allocations for the life of the method, switch them to use the uverbs_alloc allocator. Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
This commit is contained in:
parent
461bb2eee4
commit
b61815e241
|
@ -104,22 +104,18 @@ static int UVERBS_HANDLER(UVERBS_METHOD_COUNTERS_READ)(
|
||||||
|
|
||||||
uattr = uverbs_attr_get(attrs, UVERBS_ATTR_READ_COUNTERS_BUFF);
|
uattr = uverbs_attr_get(attrs, UVERBS_ATTR_READ_COUNTERS_BUFF);
|
||||||
read_attr.ncounters = uattr->ptr_attr.len / sizeof(u64);
|
read_attr.ncounters = uattr->ptr_attr.len / sizeof(u64);
|
||||||
read_attr.counters_buff = kcalloc(read_attr.ncounters,
|
read_attr.counters_buff = uverbs_zalloc(
|
||||||
sizeof(u64), GFP_KERNEL);
|
attrs, array_size(read_attr.ncounters, sizeof(u64)));
|
||||||
if (!read_attr.counters_buff)
|
if (IS_ERR(read_attr.counters_buff))
|
||||||
return -ENOMEM;
|
return PTR_ERR(read_attr.counters_buff);
|
||||||
|
|
||||||
ret = counters->device->read_counters(counters, &read_attr, attrs);
|
ret = counters->device->read_counters(counters, &read_attr, attrs);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_read;
|
return ret;
|
||||||
|
|
||||||
ret = uverbs_copy_to(attrs, UVERBS_ATTR_READ_COUNTERS_BUFF,
|
return uverbs_copy_to(attrs, UVERBS_ATTR_READ_COUNTERS_BUFF,
|
||||||
read_attr.counters_buff,
|
read_attr.counters_buff,
|
||||||
read_attr.ncounters * sizeof(u64));
|
read_attr.ncounters * sizeof(u64));
|
||||||
|
|
||||||
err_read:
|
|
||||||
kfree(read_attr.counters_buff);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_UVERBS_NAMED_METHOD(
|
DECLARE_UVERBS_NAMED_METHOD(
|
||||||
|
|
|
@ -511,22 +511,19 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OTHER)(
|
||||||
if (!devx_is_general_cmd(cmd_in))
|
if (!devx_is_general_cmd(cmd_in))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
|
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
|
||||||
if (!cmd_out)
|
if (IS_ERR(cmd_out))
|
||||||
return -ENOMEM;
|
return PTR_ERR(cmd_out);
|
||||||
|
|
||||||
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
||||||
err = mlx5_cmd_exec(dev->mdev, cmd_in,
|
err = mlx5_cmd_exec(dev->mdev, cmd_in,
|
||||||
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_IN),
|
||||||
cmd_out, cmd_out_len);
|
cmd_out, cmd_out_len);
|
||||||
if (err)
|
if (err)
|
||||||
goto other_cmd_free;
|
return err;
|
||||||
|
|
||||||
err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out, cmd_out_len);
|
return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT, cmd_out,
|
||||||
|
cmd_out_len);
|
||||||
other_cmd_free:
|
|
||||||
kvfree(cmd_out);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
|
static void devx_obj_build_destroy_cmd(void *in, void *out, void *din,
|
||||||
|
@ -735,22 +732,20 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
|
||||||
if (!devx_is_obj_create_cmd(cmd_in))
|
if (!devx_is_obj_create_cmd(cmd_in))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
|
||||||
|
if (IS_ERR(cmd_out))
|
||||||
|
return PTR_ERR(cmd_out);
|
||||||
|
|
||||||
obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
|
obj = kzalloc(sizeof(struct devx_obj), GFP_KERNEL);
|
||||||
if (!obj)
|
if (!obj)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
|
|
||||||
if (!cmd_out) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto obj_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
||||||
err = mlx5_cmd_exec(dev->mdev, cmd_in,
|
err = mlx5_cmd_exec(dev->mdev, cmd_in,
|
||||||
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
|
||||||
cmd_out, cmd_out_len);
|
cmd_out, cmd_out_len);
|
||||||
if (err)
|
if (err)
|
||||||
goto cmd_free;
|
goto obj_free;
|
||||||
|
|
||||||
uobj->object = obj;
|
uobj->object = obj;
|
||||||
obj->mdev = dev->mdev;
|
obj->mdev = dev->mdev;
|
||||||
|
@ -759,13 +754,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
|
||||||
|
|
||||||
err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
|
err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT, cmd_out, cmd_out_len);
|
||||||
if (err)
|
if (err)
|
||||||
goto cmd_free;
|
goto obj_free;
|
||||||
|
|
||||||
kvfree(cmd_out);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cmd_free:
|
|
||||||
kvfree(cmd_out);
|
|
||||||
obj_free:
|
obj_free:
|
||||||
kfree(obj);
|
kfree(obj);
|
||||||
return err;
|
return err;
|
||||||
|
@ -793,23 +785,19 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
|
||||||
if (!devx_is_valid_obj_id(obj, cmd_in))
|
if (!devx_is_valid_obj_id(obj, cmd_in))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
|
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
|
||||||
if (!cmd_out)
|
if (IS_ERR(cmd_out))
|
||||||
return -ENOMEM;
|
return PTR_ERR(cmd_out);
|
||||||
|
|
||||||
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
||||||
err = mlx5_cmd_exec(obj->mdev, cmd_in,
|
err = mlx5_cmd_exec(obj->mdev, cmd_in,
|
||||||
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
|
||||||
cmd_out, cmd_out_len);
|
cmd_out, cmd_out_len);
|
||||||
if (err)
|
if (err)
|
||||||
goto other_cmd_free;
|
return err;
|
||||||
|
|
||||||
err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
|
return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
|
||||||
cmd_out, cmd_out_len);
|
cmd_out, cmd_out_len);
|
||||||
|
|
||||||
other_cmd_free:
|
|
||||||
kvfree(cmd_out);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
|
static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
|
||||||
|
@ -834,22 +822,19 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_QUERY)(
|
||||||
if (!devx_is_valid_obj_id(obj, cmd_in))
|
if (!devx_is_valid_obj_id(obj, cmd_in))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
cmd_out = kvzalloc(cmd_out_len, GFP_KERNEL);
|
cmd_out = uverbs_zalloc(attrs, cmd_out_len);
|
||||||
if (!cmd_out)
|
if (IS_ERR(cmd_out))
|
||||||
return -ENOMEM;
|
return PTR_ERR(cmd_out);
|
||||||
|
|
||||||
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
|
||||||
err = mlx5_cmd_exec(obj->mdev, cmd_in,
|
err = mlx5_cmd_exec(obj->mdev, cmd_in,
|
||||||
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
|
uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN),
|
||||||
cmd_out, cmd_out_len);
|
cmd_out, cmd_out_len);
|
||||||
if (err)
|
if (err)
|
||||||
goto other_cmd_free;
|
return err;
|
||||||
|
|
||||||
err = uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT, cmd_out, cmd_out_len);
|
return uverbs_copy_to(attrs, MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
|
||||||
|
cmd_out, cmd_out_len);
|
||||||
other_cmd_free:
|
|
||||||
kvfree(cmd_out);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
|
static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
|
||||||
|
@ -896,18 +881,14 @@ static int devx_umem_get(struct mlx5_ib_dev *dev, struct ib_ucontext *ucontext,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int devx_umem_reg_cmd_alloc(struct devx_umem *obj,
|
static int devx_umem_reg_cmd_alloc(struct uverbs_attr_bundle *attrs,
|
||||||
|
struct devx_umem *obj,
|
||||||
struct devx_umem_reg_cmd *cmd)
|
struct devx_umem_reg_cmd *cmd)
|
||||||
{
|
{
|
||||||
cmd->inlen = MLX5_ST_SZ_BYTES(create_umem_in) +
|
cmd->inlen = MLX5_ST_SZ_BYTES(create_umem_in) +
|
||||||
(MLX5_ST_SZ_BYTES(mtt) * obj->ncont);
|
(MLX5_ST_SZ_BYTES(mtt) * obj->ncont);
|
||||||
cmd->in = kvzalloc(cmd->inlen, GFP_KERNEL);
|
cmd->in = uverbs_zalloc(attrs, cmd->inlen);
|
||||||
return cmd->in ? 0 : -ENOMEM;
|
return PTR_ERR_OR_ZERO(cmd->in);
|
||||||
}
|
|
||||||
|
|
||||||
static void devx_umem_reg_cmd_free(struct devx_umem_reg_cmd *cmd)
|
|
||||||
{
|
|
||||||
kvfree(cmd->in);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void devx_umem_reg_cmd_build(struct mlx5_ib_dev *dev,
|
static void devx_umem_reg_cmd_build(struct mlx5_ib_dev *dev,
|
||||||
|
@ -954,7 +935,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
|
||||||
if (err)
|
if (err)
|
||||||
goto err_obj_free;
|
goto err_obj_free;
|
||||||
|
|
||||||
err = devx_umem_reg_cmd_alloc(obj, &cmd);
|
err = devx_umem_reg_cmd_alloc(attrs, obj, &cmd);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_umem_release;
|
goto err_umem_release;
|
||||||
|
|
||||||
|
@ -964,7 +945,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
|
||||||
err = mlx5_cmd_exec(dev->mdev, cmd.in, cmd.inlen, cmd.out,
|
err = mlx5_cmd_exec(dev->mdev, cmd.in, cmd.inlen, cmd.out,
|
||||||
sizeof(cmd.out));
|
sizeof(cmd.out));
|
||||||
if (err)
|
if (err)
|
||||||
goto err_umem_reg_cmd_free;
|
goto err_umem_release;
|
||||||
|
|
||||||
obj->mdev = dev->mdev;
|
obj->mdev = dev->mdev;
|
||||||
uobj->object = obj;
|
uobj->object = obj;
|
||||||
|
@ -973,14 +954,10 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
|
||||||
if (err)
|
if (err)
|
||||||
goto err_umem_destroy;
|
goto err_umem_destroy;
|
||||||
|
|
||||||
devx_umem_reg_cmd_free(&cmd);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_umem_destroy:
|
err_umem_destroy:
|
||||||
mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, cmd.out, sizeof(cmd.out));
|
mlx5_cmd_exec(obj->mdev, obj->dinbox, obj->dinlen, cmd.out, sizeof(cmd.out));
|
||||||
err_umem_reg_cmd_free:
|
|
||||||
devx_umem_reg_cmd_free(&cmd);
|
|
||||||
err_umem_release:
|
err_umem_release:
|
||||||
ib_umem_release(obj->umem);
|
ib_umem_release(obj->umem);
|
||||||
err_obj_free:
|
err_obj_free:
|
||||||
|
|
Loading…
Reference in New Issue