forked from Minki/linux
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: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
4bf207d7a5
commit
015bda8abd
@ -337,6 +337,14 @@ static int uverbs_process_attr(struct bundle_priv *pbundle,
|
|||||||
|
|
||||||
break;
|
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:
|
case UVERBS_ATTR_TYPE_IDRS_ARRAY:
|
||||||
return uverbs_process_idrs_array(pbundle, attr_uapi,
|
return uverbs_process_idrs_array(pbundle, attr_uapi,
|
||||||
&e->objs_arr_attr, uattr,
|
&e->objs_arr_attr, uattr,
|
||||||
|
@ -24,6 +24,7 @@ enum uverbs_attr_type {
|
|||||||
UVERBS_ATTR_TYPE_PTR_OUT,
|
UVERBS_ATTR_TYPE_PTR_OUT,
|
||||||
UVERBS_ATTR_TYPE_IDR,
|
UVERBS_ATTR_TYPE_IDR,
|
||||||
UVERBS_ATTR_TYPE_FD,
|
UVERBS_ATTR_TYPE_FD,
|
||||||
|
UVERBS_ATTR_TYPE_RAW_FD,
|
||||||
UVERBS_ATTR_TYPE_ENUM_IN,
|
UVERBS_ATTR_TYPE_ENUM_IN,
|
||||||
UVERBS_ATTR_TYPE_IDRS_ARRAY,
|
UVERBS_ATTR_TYPE_IDRS_ARRAY,
|
||||||
};
|
};
|
||||||
@ -521,6 +522,11 @@ struct uapi_definition {
|
|||||||
.u.obj.access = _access, \
|
.u.obj.access = _access, \
|
||||||
__VA_ARGS__ } })
|
__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, ...) \
|
#define UVERBS_ATTR_PTR_IN(_attr_id, _type, ...) \
|
||||||
(&(const struct uverbs_attr_def){ \
|
(&(const struct uverbs_attr_def){ \
|
||||||
.id = _attr_id, \
|
.id = _attr_id, \
|
||||||
@ -999,4 +1005,11 @@ _uverbs_get_const_unsigned(u64 *to,
|
|||||||
uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx, \
|
uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx, \
|
||||||
_default))
|
_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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user