Skip to content

Commit

Permalink
IB/uverbs: Add helper to get array size from ptr attribute
Browse files Browse the repository at this point in the history
When the parser of an ioctl command has the knowledge that a ptr attribute
in a bundle represents an array of structures, it is useful for it to know
the number of elements in the array. This is done by dividing the
attribute length with the element size.

Signed-off-by: Moni Shoua <monis@mellanox.com>
Reviewed-by: Guy Levi <guyle@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
  • Loading branch information
Moni Shoua authored and Jason Gunthorpe committed Dec 18, 2018
1 parent bbc13cd commit cbfdd44
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
12 changes: 5 additions & 7 deletions drivers/infiniband/hw/mlx5/flow.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,26 +331,24 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_FLOW_ACTION_CREATE_MODIFY_HEADER)(
struct ib_flow_action *action;
size_t num_actions;
void *in;
int len;
int ret;

if (!mlx5_ib_modify_header_supported(mdev))
return -EOPNOTSUPP;

in = uverbs_attr_get_alloced_ptr(attrs,
MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM);
len = uverbs_attr_get_len(attrs,
MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM);

if (len % MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto))
return -EINVAL;
num_actions = uverbs_attr_ptr_get_array_size(
attrs, MLX5_IB_ATTR_CREATE_MODIFY_HEADER_ACTIONS_PRM,
MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto));
if (num_actions < 0)
return num_actions;

ret = uverbs_get_const(&ft_type, attrs,
MLX5_IB_ATTR_CREATE_MODIFY_HEADER_FT_TYPE);
if (ret)
return ret;

num_actions = len / MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto),
action = mlx5_ib_create_modify_header(mdev, ft_type, num_actions, in);
if (IS_ERR(action))
return PTR_ERR(action);
Expand Down
22 changes: 22 additions & 0 deletions include/rdma/uverbs_ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,28 @@ uverbs_attr_get_len(const struct uverbs_attr_bundle *attrs_bundle, u16 idx)
return attr->ptr_attr.len;
}

/*
* uverbs_attr_ptr_get_array_size() - Get array size pointer by a ptr
* attribute.
* @attrs: The attribute bundle
* @idx: The ID of the attribute
* @elem_size: The size of the element in the array
*/
static inline int
uverbs_attr_ptr_get_array_size(struct uverbs_attr_bundle *attrs, u16 idx,
size_t elem_size)
{
int size = uverbs_attr_get_len(attrs, idx);

if (size < 0)
return size;

if (size % elem_size)
return -EINVAL;

return size / elem_size;
}

/**
* uverbs_attr_get_uobjs_arr() - Provides array's properties for attribute for
* UVERBS_ATTR_TYPE_IDRS_ARRAY.
Expand Down

0 comments on commit cbfdd44

Please sign in to comment.