Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f07e08f authored by Matan Barak's avatar Matan Barak Committed by Jason Gunthorpe
Browse files

IB/uverbs: Enable compact representation of uverbs_attr_spec



Downstream patches extend uverbs_attr_spec with new fields.
In order to save space, we move the type and flags fields to
the various attribute flavors contained in the union.

Reviewed-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 0ede73bc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -69,9 +69,9 @@ static int uverbs_process_attr(struct ib_device *ibdev,
	switch (spec->type) {
	case UVERBS_ATTR_TYPE_PTR_IN:
	case UVERBS_ATTR_TYPE_PTR_OUT:
		if (uattr->len < spec->len ||
		if (uattr->len < spec->ptr.len ||
		    (!(spec->flags & UVERBS_ATTR_SPEC_F_MIN_SZ) &&
		     uattr->len > spec->len))
		     uattr->len > spec->ptr.len))
			return -EINVAL;

		e->ptr_attr.data = uattr->data;
+22 −12
Original line number Diff line number Diff line
@@ -66,11 +66,25 @@ enum {
	UVERBS_ATTR_SPEC_F_MIN_SZ	= 1U << 1,
};

/* Specification of a single attribute inside the ioctl message */
struct uverbs_attr_spec {
	enum uverbs_attr_type		type;
	union {
		/* Header shared by all following union members - to reduce space. */
		struct {
			enum uverbs_attr_type		type;
			/* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
			u8				flags;
		};
		struct {
			enum uverbs_attr_type		type;
			/* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
			u8				flags;
			u16				len;
		} ptr;
		struct {
			enum uverbs_attr_type		type;
			/* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
			u8				flags;
			/*
			 * higher bits mean the namespace and lower bits mean
			 * the type id within the namespace.
@@ -79,8 +93,6 @@ struct uverbs_attr_spec {
			u8			access;
		} obj;
	};
	/* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
	u8				flags;
};

struct uverbs_attr_spec_hash {
@@ -167,10 +179,10 @@ struct uverbs_object_tree_def {
#define UA_FLAGS(_flags)  .flags = _flags
#define __UVERBS_ATTR0(_id, _len, _type, ...)                           \
	((const struct uverbs_attr_def)				  \
	 {.id = _id, .attr = {.type = _type, {.len = _len}, .flags = 0, } })
	 {.id = _id, .attr = {{.ptr = {.type = _type, .len = _len, .flags = 0, } }, } })
#define __UVERBS_ATTR1(_id, _len, _type, _flags)                        \
	((const struct uverbs_attr_def)				  \
	 {.id = _id, .attr = {.type = _type, {.len = _len}, _flags, } })
	 {.id = _id, .attr = {{.ptr = {.type = _type, .len = _len, _flags } },} })
#define __UVERBS_ATTR(_id, _len, _type, _flags, _n, ...)		\
	__UVERBS_ATTR##_n(_id, _len, _type, _flags)
/*
@@ -203,15 +215,13 @@ struct uverbs_object_tree_def {
#define ___UVERBS_ATTR_OBJ0(_id, _obj_class, _obj_type, _access, ...)\
	((const struct uverbs_attr_def)					\
	{.id = _id,							\
	 .attr = {.type = _obj_class,					\
		  {.obj = {.obj_type = _obj_type, .access = _access } },\
		  .flags = 0} })
	 .attr = { {.obj = {.type = _obj_class, .obj_type = _obj_type,	\
			    .access = _access, .flags = 0 } }, } })
#define ___UVERBS_ATTR_OBJ1(_id, _obj_class, _obj_type, _access, _flags)\
	((const struct uverbs_attr_def)					\
	{.id = _id,							\
	.attr = {.type = _obj_class,					\
		 {.obj = {.obj_type = _obj_type, .access = _access} },	\
		  _flags} })
	.attr = { {.obj = {.type = _obj_class, .obj_type = _obj_type,	\
			   .access = _access, _flags} }, } })
#define ___UVERBS_ATTR_OBJ(_id, _obj_class, _obj_type, _access, _flags, \
			   _n, ...)					\
	___UVERBS_ATTR_OBJ##_n(_id, _obj_class, _obj_type, _access, _flags)