IB/core: Declare an object instead of declaring only type attributes
authorMatan Barak <matanb@mellanox.com>
Thu, 3 Aug 2017 13:06:58 +0000 (16:06 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 31 Aug 2017 12:35:09 +0000 (08:35 -0400)
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>
drivers/infiniband/core/uverbs_std_types.c
include/rdma/uverbs_ioctl.h
include/rdma/uverbs_std_types.h
include/rdma/uverbs_types.h

index ef293379f37a30782faa907706732d402a3bcdb0..b75c7da0d0a43d43c357dcc7396478abd836fde6 100644 (file)
@@ -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,
-};
-
-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,
-};
-
-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,
-};
-
-const struct uverbs_obj_idr_type uverbs_type_attrs_mw = {
-       .type = UVERBS_TYPE_ALLOC_IDR(0),
-       .destroy_object = 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,
-};
-
-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,
-};
-
-const struct uverbs_obj_idr_type uverbs_type_attrs_ah = {
-       .type = UVERBS_TYPE_ALLOC_IDR(0),
-       .destroy_object = uverbs_free_ah,
-};
-
-const struct uverbs_obj_idr_type uverbs_type_attrs_flow = {
-       .type = UVERBS_TYPE_ALLOC_IDR(0),
-       .destroy_object = 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,
-};
-
-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,
-};
-
-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,
-};
-
-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_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));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_cq, UVERBS_OBJECT_CQ,
+                     &UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_ucq_object), 0,
+                                                 uverbs_free_cq));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_qp, UVERBS_OBJECT_QP,
+                     &UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uqp_object), 0,
+                                                 uverbs_free_qp));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_mw, UVERBS_OBJECT_MW,
+                     &UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_mw));
+
+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));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_srq, UVERBS_OBJECT_SRQ,
+                     &UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_usrq_object), 0,
+                                                 uverbs_free_srq));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_ah, UVERBS_OBJECT_AH,
+                     &UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_ah));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_flow, UVERBS_OBJECT_FLOW,
+                     &UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_flow));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_wq, UVERBS_OBJECT_WQ,
+                     &UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uwq_object), 0,
+                                                 uverbs_free_wq));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_rwq_ind_table,
+                     UVERBS_OBJECT_RWQ_IND_TBL,
+                     &UVERBS_TYPE_ALLOC_IDR(0, uverbs_free_rwq_ind_tbl));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_xrcd, UVERBS_OBJECT_XRCD,
+                     &UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uxrcd_object), 0,
+                                                 uverbs_free_xrcd));
+
+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));
index f83f5632976136c8f14e8fb8ac26a2df845c2415..99130083615ecf5c4854eb88f5531f21e49dd8aa 100644 (file)
@@ -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
  * =================================================
index 7771ce9669521912ddfcc611bf01dad5381dc58c..eda271b4aa6c4c93d8ac7a61c31c5a41bbcb3667 100644 (file)
 
 #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
 
index 351ea185df44fee1af734ae6cad770f1a5ba6c6d..9760b6d7074413fe4b3a3ed0126c6fb14051adad 100644 (file)
@@ -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