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

Commit d108dac0 authored by Jason Gunthorpe's avatar Jason Gunthorpe
Browse files

RDMA/uverbs: Simplify UVERBS_ATTR family of macros



Instead of using a complex cascade of macros, just directly provide the
initializer list each of the declarations is trying to create.

Now that the macros are simplified this also reworks the uverbs_attr_spec
to be friendly to older compilers by eliminating any unnamed
structures/unions inside, and removing the duplication of some fields. The
structure size remains at 16 bytes which was the original motivation for
some of this oddness.

Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
parent ad544cfe
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -77,13 +77,13 @@ static int uverbs_process_attr(struct ib_uverbs_file *ufile,

	switch (spec->type) {
	case UVERBS_ATTR_TYPE_ENUM_IN:
		if (uattr->attr_data.enum_data.elem_id >= spec->enum_def.num_elems)
		if (uattr->attr_data.enum_data.elem_id >= spec->u.enum_def.num_elems)
			return -EOPNOTSUPP;

		if (uattr->attr_data.enum_data.reserved)
			return -EINVAL;

		val_spec = &spec->enum_def.ids[uattr->attr_data.enum_data.elem_id];
		val_spec = &spec->u2.enum_def.ids[uattr->attr_data.enum_data.elem_id];

		/* Currently we only support PTR_IN based enums */
		if (val_spec->type != UVERBS_ATTR_TYPE_PTR_IN)
@@ -97,16 +97,16 @@ static int uverbs_process_attr(struct ib_uverbs_file *ufile,
		 * longer struct will fail here if used with an old kernel and
		 * non-zero content, making ABI compat/discovery simpler.
		 */
		if (uattr->len > val_spec->ptr.len &&
		if (uattr->len > val_spec->u.ptr.len &&
		    val_spec->flags & UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO &&
		    !uverbs_is_attr_cleared(uattr, val_spec->ptr.len))
		    !uverbs_is_attr_cleared(uattr, val_spec->u.ptr.len))
			return -EOPNOTSUPP;

	/* fall through */
	case UVERBS_ATTR_TYPE_PTR_OUT:
		if (uattr->len < val_spec->ptr.min_len ||
		if (uattr->len < val_spec->u.ptr.min_len ||
		    (!(val_spec->flags & UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO) &&
		     uattr->len > val_spec->ptr.len))
		     uattr->len > val_spec->u.ptr.len))
			return -EINVAL;

		if (spec->type != UVERBS_ATTR_TYPE_ENUM_IN &&
@@ -149,20 +149,20 @@ static int uverbs_process_attr(struct ib_uverbs_file *ufile,
			return -EINVAL;

		o_attr = &e->obj_attr;
		object = uverbs_get_object(ufile, spec->obj.obj_type);
		object = uverbs_get_object(ufile, spec->u.obj.obj_type);
		if (!object)
			return -EINVAL;

		o_attr->uobject = uverbs_get_uobject_from_context(
					object->type_attrs,
					ufile->ucontext,
					spec->obj.access,
					spec->u.obj.access,
					(int)uattr->data);

		if (IS_ERR(o_attr->uobject))
			return PTR_ERR(o_attr->uobject);

		if (spec->obj.access == UVERBS_ACCESS_NEW) {
		if (spec->u.obj.access == UVERBS_ACCESS_NEW) {
			u64 id = o_attr->uobject->id;

			/* Copy the allocated id to the user-space */
@@ -216,7 +216,7 @@ static int uverbs_finalize_attrs(struct uverbs_attr_bundle *attrs_bundle,

				current_ret = uverbs_finalize_object(
					attr->obj_attr.uobject,
					spec->obj.access, commit);
					spec->u.obj.access, commit);
				if (!ret)
					ret = current_ret;
			} else if (spec->type == UVERBS_ATTR_TYPE_PTR_IN &&
+2 −2
Original line number Diff line number Diff line
@@ -367,8 +367,8 @@ static struct uverbs_method_spec *build_method_with_attrs(const struct uverbs_me
			memcpy(attr, &attr_defs[0]->attr, sizeof(*attr));

			attr_obj_with_special_access = IS_ATTR_OBJECT(attr) &&
				   (attr->obj.access == UVERBS_ACCESS_NEW ||
				    attr->obj.access == UVERBS_ACCESS_DESTROY);
				   (attr->u.obj.access == UVERBS_ACCESS_NEW ||
				    attr->u.obj.access == UVERBS_ACCESS_DESTROY);
			num_of_singularities +=  !!attr_obj_with_special_access;
			if (WARN(num_of_singularities > 1,
				 "ib_uverbs: Method contains more than one object attr (%d) with new/destroy access\n",
+4 −4
Original line number Diff line number Diff line
@@ -222,10 +222,10 @@ int uverbs_destroy_def_handler(struct ib_device *ib_dev,
 * spec.
 */
const struct uverbs_attr_def uverbs_uhw_compat_in =
	UVERBS_ATTR_PTR_IN_SZ(UVERBS_ATTR_UHW_IN, UVERBS_ATTR_MIN_SIZE(0),
	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_UHW_IN, UVERBS_ATTR_MIN_SIZE(0),
			   UA_FLAGS(UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO));
const struct uverbs_attr_def uverbs_uhw_compat_out =
	UVERBS_ATTR_PTR_OUT_SZ(UVERBS_ATTR_UHW_OUT, UVERBS_ATTR_MIN_SIZE(0),
	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_UHW_OUT, UVERBS_ATTR_MIN_SIZE(0),
			    UA_FLAGS(UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO));

void create_udata(struct uverbs_attr_bundle *ctx, struct ib_udata *udata)
+9 −15
Original line number Diff line number Diff line
@@ -366,28 +366,22 @@ static int UVERBS_HANDLER(UVERBS_METHOD_FLOW_ACTION_ESP_MODIFY)(struct ib_device

static const struct uverbs_attr_spec uverbs_flow_action_esp_keymat[] = {
	[IB_UVERBS_FLOW_ACTION_ESP_KEYMAT_AES_GCM] = {
		{ .ptr = {
		.type = UVERBS_ATTR_TYPE_PTR_IN,
		UVERBS_ATTR_TYPE(struct ib_uverbs_flow_action_esp_keymat_aes_gcm),
			.flags = UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO,
		} },
		UA_FLAGS(UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO),
	},
};

static const struct uverbs_attr_spec uverbs_flow_action_esp_replay[] = {
	[IB_UVERBS_FLOW_ACTION_ESP_REPLAY_NONE] = {
		{ .ptr = {
		.type = UVERBS_ATTR_TYPE_PTR_IN,
		/* No need to specify any data */
			.len = 0,
		} }
		UVERBS_ATTR_SIZE(0, 0),
	},
	[IB_UVERBS_FLOW_ACTION_ESP_REPLAY_BMP] = {
		{ .ptr = {
		.type = UVERBS_ATTR_TYPE_PTR_IN,
		UVERBS_ATTR_STRUCT(struct ib_uverbs_flow_action_esp_replay_bmp, size),
			.flags = UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO,
		} }
		UA_FLAGS(UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO),
	},
};

+36 −36
Original line number Diff line number Diff line
@@ -1017,12 +1017,12 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_QUERY_UAR,
			     UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)));

static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OTHER,
	&UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
	&UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_OTHER_CMD_IN,
			    UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
			    UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				     UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
				     UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
	&UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
	&UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_OTHER_CMD_OUT,
			     UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
			     UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO))
@@ -1033,12 +1033,12 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_CREATE,
			 MLX5_IB_OBJECT_DEVX_OBJ,
			 UVERBS_ACCESS_NEW,
			 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
	&UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
	&UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN,
			    UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
			    UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				     UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
				     UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
	&UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
	&UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_OUT,
			     UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
			     UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
@@ -1054,12 +1054,12 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_MODIFY,
			 MLX5_IB_OBJECT_DEVX_OBJ,
			 UVERBS_ACCESS_WRITE,
			 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
	&UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN,
	&UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN,
			    UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
			    UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				     UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
				     UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
	&UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
	&UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_OUT,
			     UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
			     UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
@@ -1069,12 +1069,12 @@ static DECLARE_UVERBS_NAMED_METHOD(MLX5_IB_METHOD_DEVX_OBJ_QUERY,
			 MLX5_IB_OBJECT_DEVX_OBJ,
			 UVERBS_ACCESS_READ,
			 UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY)),
	&UVERBS_ATTR_PTR_IN_SZ(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN,
	&UVERBS_ATTR_PTR_IN(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_IN,
			    UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_in_cmd_hdr)),
			    UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				     UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO |
				     UVERBS_ATTR_SPEC_F_ALLOC_AND_COPY)),
	&UVERBS_ATTR_PTR_OUT_SZ(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
	&UVERBS_ATTR_PTR_OUT(MLX5_IB_ATTR_DEVX_OBJ_QUERY_CMD_OUT,
			     UVERBS_ATTR_MIN_SIZE(MLX5_ST_SZ_BYTES(general_obj_out_cmd_hdr)),
			     UA_FLAGS(UVERBS_ATTR_SPEC_F_MANDATORY |
				      UVERBS_ATTR_SPEC_F_MIN_SZ_OR_ZERO)));
Loading