Commit 015bda8a authored by Jason Gunthorpe's avatar Jason Gunthorpe
Browse files

RDMA/core: Add UVERBS_ATTR_RAW_FD

This uses the same passing protocol as UVERBS_ATTR_FD (eg len = 0 data_s64
= fd), except that the FD is not required to be a uverbs object and the
core code does not covert the FD to an object handle automatically.

Access to the int fd is provided by uverbs_get_raw_fd().

Link: https://lore.kernel.org/r/2-v1-bd147097458e+ede-umem_dmabuf_jgg@nvidia.com


Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 4bf207d7
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -337,6 +337,14 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,

		break;

	case UVERBS_ATTR_TYPE_RAW_FD:
		if (uattr->attr_data.reserved || uattr->len != 0 ||
		    uattr->data_s64 < INT_MIN || uattr->data_s64 > INT_MAX)
			return -EINVAL;
		/* _uverbs_get_const_signed() is the accessor */
		e->ptr_attr.data = uattr->data_s64;
		break;

	case UVERBS_ATTR_TYPE_IDRS_ARRAY:
		return uverbs_process_idrs_array(pbundle, attr_uapi,
						 &e->objs_arr_attr, uattr,
+13 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ enum uverbs_attr_type {
	UVERBS_ATTR_TYPE_PTR_OUT,
	UVERBS_ATTR_TYPE_IDR,
	UVERBS_ATTR_TYPE_FD,
	UVERBS_ATTR_TYPE_RAW_FD,
	UVERBS_ATTR_TYPE_ENUM_IN,
	UVERBS_ATTR_TYPE_IDRS_ARRAY,
};
@@ -521,6 +522,11 @@ struct uapi_definition {
			  .u.obj.access = _access,                             \
			  __VA_ARGS__ } })

#define UVERBS_ATTR_RAW_FD(_attr_id, ...)                                      \
	(&(const struct uverbs_attr_def){                                      \
		.id = (_attr_id),                                              \
		.attr = { .type = UVERBS_ATTR_TYPE_RAW_FD, __VA_ARGS__ } })

#define UVERBS_ATTR_PTR_IN(_attr_id, _type, ...)                               \
	(&(const struct uverbs_attr_def){                                      \
		.id = _attr_id,                                                \
@@ -999,4 +1005,11 @@ _uverbs_get_const_unsigned(u64 *to,
		 uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx,   \
						    _default))

static inline int
uverbs_get_raw_fd(int *to, const struct uverbs_attr_bundle *attrs_bundle,
		  size_t idx)
{
	return uverbs_get_const_signed(to, attrs_bundle, idx);
}

#endif