]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
IB/uverbs: Enable compact representation of uverbs_attr_spec
authorMatan Barak <matanb@mellanox.com>
Mon, 19 Mar 2018 13:02:35 +0000 (15:02 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 19 Mar 2018 20:45:17 +0000 (14:45 -0600)
Downstream patches extend uverbs_attr_spec with new fields.
In order to save space, we move the type and flags fields to
the various attribute flavors contained in the union.

Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/uverbs_ioctl.c
include/rdma/uverbs_ioctl.h

index 7016e729f139fd527ad381a2c49a38522cc0ee96..82a1775ba657d27b89a8061040ff0b8828c7acda 100644 (file)
@@ -69,9 +69,9 @@ static int uverbs_process_attr(struct ib_device *ibdev,
        switch (spec->type) {
        case UVERBS_ATTR_TYPE_PTR_IN:
        case UVERBS_ATTR_TYPE_PTR_OUT:
-               if (uattr->len < spec->len ||
+               if (uattr->len < spec->ptr.len ||
                    (!(spec->flags & UVERBS_ATTR_SPEC_F_MIN_SZ) &&
-                    uattr->len > spec->len))
+                    uattr->len > spec->ptr.len))
                        return -EINVAL;
 
                e->ptr_attr.data = uattr->data;
index c0be2b5f6a1e0db36f42ec944834a2195d4517b5..cd7c3e40c6ccb33fe439368a627accc9ad6490e5 100644 (file)
@@ -66,11 +66,25 @@ enum {
        UVERBS_ATTR_SPEC_F_MIN_SZ       = 1U << 1,
 };
 
+/* Specification of a single attribute inside the ioctl message */
 struct uverbs_attr_spec {
-       enum uverbs_attr_type           type;
        union {
-               u16                             len;
+               /* Header shared by all following union members - to reduce space. */
                struct {
+                       enum uverbs_attr_type           type;
+                       /* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
+                       u8                              flags;
+               };
+               struct {
+                       enum uverbs_attr_type           type;
+                       /* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
+                       u8                              flags;
+                       u16                             len;
+               } ptr;
+               struct {
+                       enum uverbs_attr_type           type;
+                       /* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
+                       u8                              flags;
                        /*
                         * higher bits mean the namespace and lower bits mean
                         * the type id within the namespace.
@@ -79,8 +93,6 @@ struct uverbs_attr_spec {
                        u8                      access;
                } obj;
        };
-       /* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
-       u8                              flags;
 };
 
 struct uverbs_attr_spec_hash {
@@ -167,10 +179,10 @@ struct uverbs_object_tree_def {
 #define UA_FLAGS(_flags)  .flags = _flags
 #define __UVERBS_ATTR0(_id, _len, _type, ...)                           \
        ((const struct uverbs_attr_def)                           \
-        {.id = _id, .attr = {.type = _type, {.len = _len}, .flags = 0, } })
+        {.id = _id, .attr = {{.ptr = {.type = _type, .len = _len, .flags = 0, } }, } })
 #define __UVERBS_ATTR1(_id, _len, _type, _flags)                        \
        ((const struct uverbs_attr_def)                           \
-        {.id = _id, .attr = {.type = _type, {.len = _len}, _flags, } })
+        {.id = _id, .attr = {{.ptr = {.type = _type, .len = _len, _flags } },} })
 #define __UVERBS_ATTR(_id, _len, _type, _flags, _n, ...)               \
        __UVERBS_ATTR##_n(_id, _len, _type, _flags)
 /*
@@ -203,15 +215,13 @@ struct uverbs_object_tree_def {
 #define ___UVERBS_ATTR_OBJ0(_id, _obj_class, _obj_type, _access, ...)\
        ((const struct uverbs_attr_def)                                 \
        {.id = _id,                                                     \
-        .attr = {.type = _obj_class,                                   \
-                 {.obj = {.obj_type = _obj_type, .access = _access } },\
-                 .flags = 0} })
+        .attr = { {.obj = {.type = _obj_class, .obj_type = _obj_type,  \
+                           .access = _access, .flags = 0 } }, } })
 #define ___UVERBS_ATTR_OBJ1(_id, _obj_class, _obj_type, _access, _flags)\
        ((const struct uverbs_attr_def)                                 \
        {.id = _id,                                                     \
-       .attr = {.type = _obj_class,                                    \
-                {.obj = {.obj_type = _obj_type, .access = _access} },  \
-                 _flags} })
+       .attr = { {.obj = {.type = _obj_class, .obj_type = _obj_type,   \
+                          .access = _access, _flags} }, } })
 #define ___UVERBS_ATTR_OBJ(_id, _obj_class, _obj_type, _access, _flags, \
                           _n, ...)                                     \
        ___UVERBS_ATTR_OBJ##_n(_id, _obj_class, _obj_type, _access, _flags)