RDMA/core: Share driver structure size with core
authorLeon Romanovsky <leonro@mellanox.com>
Sun, 3 Feb 2019 12:55:50 +0000 (14:55 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 8 Feb 2019 23:50:58 +0000 (16:50 -0700)
Add new macros to be used in drivers while registering ops structure and
IB/core while calling allocation routines, so drivers won't need to
perform kzalloc/kfree in their paths.

The change in allocation stage allows us to initialize common fields prior
to calling to drivers (e.g. restrack).

Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/device.c
include/rdma/ib_verbs.h

index 32cd35c9b21e204245216868d764928cdcfba547..d806a5c7b2024d0263ffcfc47109f7b1fe1627fa 100644 (file)
@@ -1228,6 +1228,8 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
                                (ptr)->name = ops->name;                       \
        } while (0)
 
+#define SET_OBJ_SIZE(ptr, name) SET_DEVICE_OP(ptr, size_##name)
+
        SET_DEVICE_OP(dev_ops, add_gid);
        SET_DEVICE_OP(dev_ops, advise_mr);
        SET_DEVICE_OP(dev_ops, alloc_dm);
index 2e1f1e885ee5025c9e9115783257170eb9a06026..e29eae4aec84557a17db5c6c1f829de1a10c3336 100644 (file)
@@ -2264,6 +2264,19 @@ struct ib_counters_read_attr {
 
 struct uverbs_attr_bundle;
 
+#define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member)                      \
+       .size_##ib_struct =                                                    \
+               (sizeof(struct drv_struct) +                                   \
+                BUILD_BUG_ON_ZERO(offsetof(struct drv_struct, member)) +      \
+                BUILD_BUG_ON_ZERO(                                            \
+                        !__same_type(((struct drv_struct *)NULL)->member,     \
+                                     struct ib_struct)))
+
+#define rdma_zalloc_drv_obj(ib_dev, ib_type)                                   \
+       ((struct ib_type *)kzalloc(ib_dev->ops.size_##ib_type, GFP_KERNEL))
+
+#define DECLARE_RDMA_OBJ_SIZE(ib_struct) size_t size_##ib_struct
+
 /**
  * struct ib_device_ops - InfiniBand device operations
  * This structure defines all the InfiniBand device operations, providers will