IB/core: Declare an object instead of declaring only type attributes
Switch all uverbs_type_attrs_xxxx with DECLARE_UVERBS_OBJECT macros. This will be later used in order to embed the object specific methods in the objects as well. Signed-off-by: Matan Barak <matanb@mellanox.com> Reviewed-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
fac9658cab
commit
5009010fbf
|
@ -209,67 +209,51 @@ static int uverbs_hot_unplug_completion_event_file(struct ib_uobject_file *uobj_
|
|||
return 0;
|
||||
};
|
||||
|
||||
const struct uverbs_obj_fd_type uverbs_type_attrs_comp_channel = {
|
||||
.type = UVERBS_TYPE_ALLOC_FD(sizeof(struct ib_uverbs_completion_event_file), 0),
|
||||
.context_closed = uverbs_hot_unplug_completion_event_file,
|
||||
.fops = &uverbs_event_fops,
|
||||
.name = "[infinibandevent]",
|
||||
.flags = O_RDONLY,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_comp_channel,
|
||||
UVERBS_OBJECT_COMP_CHANNEL,
|
||||
&UVERBS_TYPE_ALLOC_FD(0,
|
||||
sizeof(struct ib_uverbs_completion_event_file),
|
||||
uverbs_hot_unplug_completion_event_file,
|
||||
&uverbs_event_fops,
|
||||
"[infinibandevent]", O_RDONLY));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_cq = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_ucq_object), 0),
|
||||
.destroy_object = uverbs_free_cq,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_cq, UVERBS_OBJECT_CQ,
|
||||
&UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_ucq_object), 0,
|
||||
uverbs_free_cq));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_qp = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uqp_object), 0),
|
||||
.destroy_object = uverbs_free_qp,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_qp, UVERBS_OBJECT_QP,
|
||||
&UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uqp_object), 0,
|
||||
uverbs_free_qp));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_mw = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(0),
|
||||
.destroy_object = uverbs_free_mw,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_mw, UVERBS_OBJECT_MW,
|
||||
&UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_mw));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_mr = {
|
||||
/* 1 is used in order to free the MR after all the MWs */
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(1),
|
||||
.destroy_object = uverbs_free_mr,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_mr, UVERBS_OBJECT_MR,
|
||||
/* 1 is used in order to free the MR after all the MWs */
|
||||
&UVERBS_TYPE_ALLOC_IDR(1, uverbs_free_mr));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_srq = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_usrq_object), 0),
|
||||
.destroy_object = uverbs_free_srq,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_srq, UVERBS_OBJECT_SRQ,
|
||||
&UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_usrq_object), 0,
|
||||
uverbs_free_srq));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_ah = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(0),
|
||||
.destroy_object = uverbs_free_ah,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_ah, UVERBS_OBJECT_AH,
|
||||
&UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_ah));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_flow = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(0),
|
||||
.destroy_object = uverbs_free_flow,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_flow, UVERBS_OBJECT_FLOW,
|
||||
&UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_flow));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_wq = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uwq_object), 0),
|
||||
.destroy_object = uverbs_free_wq,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_wq, UVERBS_OBJECT_WQ,
|
||||
&UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uwq_object), 0,
|
||||
uverbs_free_wq));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_rwq_ind_table = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(0),
|
||||
.destroy_object = uverbs_free_rwq_ind_tbl,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_rwq_ind_table,
|
||||
UVERBS_OBJECT_RWQ_IND_TBL,
|
||||
&UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_rwq_ind_tbl));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_xrcd = {
|
||||
.type = UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uxrcd_object), 0),
|
||||
.destroy_object = uverbs_free_xrcd,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_xrcd, UVERBS_OBJECT_XRCD,
|
||||
&UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uxrcd_object), 0,
|
||||
uverbs_free_xrcd));
|
||||
|
||||
const struct uverbs_obj_idr_type uverbs_type_attrs_pd = {
|
||||
/* 2 is used in order to free the PD after MRs */
|
||||
.type = UVERBS_TYPE_ALLOC_IDR(2),
|
||||
.destroy_object = uverbs_free_pd,
|
||||
};
|
||||
DECLARE_UVERBS_OBJECT(uverbs_object_pd, UVERBS_OBJECT_PD,
|
||||
/* 2 is used in order to free the PD after MRs */
|
||||
&UVERBS_TYPE_ALLOC_IDR(2, uverbs_free_pd));
|
||||
|
|
|
@ -127,6 +127,22 @@ struct uverbs_root_spec {
|
|||
struct uverbs_object_spec_hash *object_buckets[0];
|
||||
};
|
||||
|
||||
/*
|
||||
* =======================================
|
||||
* Verbs definitions
|
||||
* =======================================
|
||||
*/
|
||||
|
||||
struct uverbs_object_def {
|
||||
const struct uverbs_obj_type *type_attrs;
|
||||
};
|
||||
|
||||
#define _UVERBS_OBJECT(_id, _type_attrs, ...) \
|
||||
((const struct uverbs_object_def) { \
|
||||
.type_attrs = _type_attrs})
|
||||
#define DECLARE_UVERBS_OBJECT(_name, _id, _type_attrs, ...) \
|
||||
const struct uverbs_object_def _name = \
|
||||
_UVERBS_OBJECT(_id, _type_attrs, ##__VA_ARGS__)
|
||||
/* =================================================
|
||||
* Parsing infrastructure
|
||||
* =================================================
|
||||
|
|
|
@ -35,18 +35,18 @@
|
|||
|
||||
#include <rdma/uverbs_types.h>
|
||||
|
||||
extern const struct uverbs_obj_fd_type uverbs_type_attrs_comp_channel;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_cq;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_qp;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_rwq_ind_table;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_wq;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_srq;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_ah;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_flow;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_mr;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_mw;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_pd;
|
||||
extern const struct uverbs_obj_idr_type uverbs_type_attrs_xrcd;
|
||||
extern const struct uverbs_object_def uverbs_object_comp_channel;
|
||||
extern const struct uverbs_object_def uverbs_object_cq;
|
||||
extern const struct uverbs_object_def uverbs_object_qp;
|
||||
extern const struct uverbs_object_def uverbs_object_rwq_ind_table;
|
||||
extern const struct uverbs_object_def uverbs_object_wq;
|
||||
extern const struct uverbs_object_def uverbs_object_srq;
|
||||
extern const struct uverbs_object_def uverbs_object_ah;
|
||||
extern const struct uverbs_object_def uverbs_object_flow;
|
||||
extern const struct uverbs_object_def uverbs_object_mr;
|
||||
extern const struct uverbs_object_def uverbs_object_mw;
|
||||
extern const struct uverbs_object_def uverbs_object_pd;
|
||||
extern const struct uverbs_object_def uverbs_object_xrcd;
|
||||
|
||||
static inline struct ib_uobject *__uobj_get(const struct uverbs_obj_type *type,
|
||||
bool write,
|
||||
|
@ -56,22 +56,22 @@ static inline struct ib_uobject *__uobj_get(const struct uverbs_obj_type *type,
|
|||
return rdma_lookup_get_uobject(type, ucontext, id, write);
|
||||
}
|
||||
|
||||
#define uobj_get_type(_type) uverbs_type_attrs_##_type.type
|
||||
#define uobj_get_type(_object) uverbs_object_##_object.type_attrs
|
||||
|
||||
#define uobj_get_read(_type, _id, _ucontext) \
|
||||
__uobj_get(&(_type), false, _ucontext, _id)
|
||||
__uobj_get(_type, false, _ucontext, _id)
|
||||
|
||||
#define uobj_get_obj_read(_type, _id, _ucontext) \
|
||||
#define uobj_get_obj_read(_object, _id, _ucontext) \
|
||||
({ \
|
||||
struct ib_uobject *uobj = \
|
||||
__uobj_get(&uobj_get_type(_type), \
|
||||
struct ib_uobject *__uobj = \
|
||||
__uobj_get(uverbs_object_##_object.type_attrs, \
|
||||
false, _ucontext, _id); \
|
||||
\
|
||||
(struct ib_##_type *)(IS_ERR(uobj) ? NULL : uobj->object); \
|
||||
(struct ib_##_object *)(IS_ERR(__uobj) ? NULL : __uobj->object);\
|
||||
})
|
||||
|
||||
#define uobj_get_write(_type, _id, _ucontext) \
|
||||
__uobj_get(&(_type), true, _ucontext, _id)
|
||||
__uobj_get(_type, true, _ucontext, _id)
|
||||
|
||||
static inline void uobj_put_read(struct ib_uobject *uobj)
|
||||
{
|
||||
|
@ -108,7 +108,7 @@ static inline struct ib_uobject *__uobj_alloc(const struct uverbs_obj_type *type
|
|||
}
|
||||
|
||||
#define uobj_alloc(_type, ucontext) \
|
||||
__uobj_alloc(&(_type), ucontext)
|
||||
__uobj_alloc(_type, ucontext)
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -151,22 +151,30 @@ extern const struct uverbs_obj_type_class uverbs_fd_class;
|
|||
|
||||
#define UVERBS_BUILD_BUG_ON(cond) (sizeof(char[1 - 2 * !!(cond)]) - \
|
||||
sizeof(char))
|
||||
#define UVERBS_TYPE_ALLOC_FD(_size, _order) \
|
||||
{ \
|
||||
.destroy_order = _order, \
|
||||
.type_class = &uverbs_fd_class, \
|
||||
.obj_size = (_size) + \
|
||||
UVERBS_BUILD_BUG_ON((_size) < \
|
||||
sizeof(struct ib_uobject_file)),\
|
||||
}
|
||||
#define UVERBS_TYPE_ALLOC_IDR_SZ(_size, _order) \
|
||||
{ \
|
||||
#define UVERBS_TYPE_ALLOC_FD(_order, _obj_size, _context_closed, _fops, _name, _flags)\
|
||||
((&((const struct uverbs_obj_fd_type) \
|
||||
{.type = { \
|
||||
.destroy_order = _order, \
|
||||
.type_class = &uverbs_fd_class, \
|
||||
.obj_size = (_obj_size) + \
|
||||
UVERBS_BUILD_BUG_ON((_obj_size) < sizeof(struct ib_uobject_file)), \
|
||||
}, \
|
||||
.context_closed = _context_closed, \
|
||||
.fops = _fops, \
|
||||
.name = _name, \
|
||||
.flags = _flags}))->type)
|
||||
#define UVERBS_TYPE_ALLOC_IDR_SZ(_size, _order, _destroy_object) \
|
||||
((&((const struct uverbs_obj_idr_type) \
|
||||
{.type = { \
|
||||
.destroy_order = _order, \
|
||||
.type_class = &uverbs_idr_class, \
|
||||
.obj_size = (_size) + \
|
||||
UVERBS_BUILD_BUG_ON((_size) < \
|
||||
sizeof(struct ib_uobject)), \
|
||||
}
|
||||
#define UVERBS_TYPE_ALLOC_IDR(_order) \
|
||||
UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uobject), _order)
|
||||
UVERBS_BUILD_BUG_ON((_size) < \
|
||||
sizeof(struct ib_uobject)) \
|
||||
}, \
|
||||
.destroy_object = _destroy_object,}))->type)
|
||||
#define UVERBS_TYPE_ALLOC_IDR(_order, _destroy_object) \
|
||||
UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uobject), _order, \
|
||||
_destroy_object)
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue