RDMA/core: Introduce RDMA subsystem ibdev_* print functions
[linux-2.6-microblaze.git] / include / rdma / ib_verbs.h
index 80debf5..de8724e 100644 (file)
@@ -59,6 +59,8 @@
 #include <linux/mmu_notifier.h>
 #include <linux/uaccess.h>
 #include <linux/cgroup_rdma.h>
+#include <linux/irqflags.h>
+#include <linux/preempt.h>
 #include <uapi/rdma/ib_user_verbs.h>
 #include <rdma/restrack.h>
 #include <uapi/rdma/rdma_user_ioctl.h>
@@ -72,6 +74,36 @@ extern struct workqueue_struct *ib_wq;
 extern struct workqueue_struct *ib_comp_wq;
 extern struct workqueue_struct *ib_comp_unbound_wq;
 
+__printf(3, 4) __cold
+void ibdev_printk(const char *level, const struct ib_device *ibdev,
+                 const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_emerg(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_alert(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_crit(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_err(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_warn(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_notice(const struct ib_device *ibdev, const char *format, ...);
+__printf(2, 3) __cold
+void ibdev_info(const struct ib_device *ibdev, const char *format, ...);
+
+#if defined(CONFIG_DYNAMIC_DEBUG)
+#define ibdev_dbg(__dev, format, args...)                       \
+       dynamic_ibdev_dbg(__dev, format, ##args)
+#elif defined(DEBUG)
+#define ibdev_dbg(__dev, format, args...)                       \
+       ibdev_printk(KERN_DEBUG, __dev, format, ##args)
+#else
+__printf(2, 3) __cold
+static inline
+void ibdev_dbg(const struct ib_device *ibdev, const char *format, ...) {}
+#endif
+
 union ib_gid {
        u8      raw[16];
        struct {
@@ -238,6 +270,7 @@ enum ib_device_cap_flags {
        IB_DEVICE_RDMA_NETDEV_OPA_VNIC          = (1ULL << 35),
        /* The device supports padding incoming writes to cacheline. */
        IB_DEVICE_PCI_WRITE_END_PADDING         = (1ULL << 36),
+       IB_DEVICE_ALLOW_USER_UNREG              = (1ULL << 37),
 };
 
 enum ib_signature_prot_cap {
@@ -268,6 +301,7 @@ enum ib_odp_transport_cap_bits {
        IB_ODP_SUPPORT_WRITE    = 1 << 2,
        IB_ODP_SUPPORT_READ     = 1 << 3,
        IB_ODP_SUPPORT_ATOMIC   = 1 << 4,
+       IB_ODP_SUPPORT_SRQ_RECV = 1 << 5,
 };
 
 struct ib_odp_caps {
@@ -276,6 +310,7 @@ struct ib_odp_caps {
                uint32_t  rc_odp_caps;
                uint32_t  uc_odp_caps;
                uint32_t  ud_odp_caps;
+               uint32_t  xrc_odp_caps;
        } per_transport_caps;
 };
 
@@ -1504,12 +1539,10 @@ struct ib_ucontext {
 
        bool cleanup_retryable;
 
-#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
        void (*invalidate_range)(struct ib_umem_odp *umem_odp,
                                 unsigned long start, unsigned long end);
        struct mutex per_mm_list_lock;
        struct list_head per_mm_list;
-#endif
 
        struct ib_rdmacg_object cg_obj;
        /*
@@ -2186,7 +2219,6 @@ struct ib_port_cache {
 struct ib_cache {
        rwlock_t                lock;
        struct ib_event_handler event_handler;
-       struct ib_port_cache   *ports;
 };
 
 struct iw_cm_verbs;
@@ -2198,6 +2230,21 @@ struct ib_port_immutable {
        u32                           max_mad_size;
 };
 
+struct ib_port_data {
+       struct ib_device *ib_dev;
+
+       struct ib_port_immutable immutable;
+
+       spinlock_t pkey_list_lock;
+       struct list_head pkey_list;
+
+       struct ib_port_cache cache;
+
+       spinlock_t netdev_lock;
+       struct net_device __rcu *netdev;
+       struct hlist_node ndev_hash_link;
+};
+
 /* rdma netdev type - specifies protocol type */
 enum rdma_netdev_t {
        RDMA_NETDEV_OPA_VNIC,
@@ -2243,12 +2290,6 @@ struct rdma_netdev_alloc_params {
                                      struct net_device *netdev, void *param);
 };
 
-struct ib_port_pkey_list {
-       /* Lock to hold while modifying the list. */
-       spinlock_t                    list_lock;
-       struct list_head              pkey_list;
-};
-
 struct ib_counters {
        struct ib_device        *device;
        struct ib_uobject       *uobject;
@@ -2264,6 +2305,22 @@ 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_gfp(ib_dev, ib_type, gfp)                         \
+       ((struct ib_type *)kzalloc(ib_dev->ops.size_##ib_type, gfp))
+
+#define rdma_zalloc_drv_obj(ib_dev, ib_type)                                   \
+       rdma_zalloc_drv_obj_gfp(ib_dev, 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
@@ -2367,29 +2424,26 @@ struct ib_device_ops {
        int (*del_gid)(const struct ib_gid_attr *attr, void **context);
        int (*query_pkey)(struct ib_device *device, u8 port_num, u16 index,
                          u16 *pkey);
-       struct ib_ucontext *(*alloc_ucontext)(struct ib_device *device,
-                                             struct ib_udata *udata);
-       int (*dealloc_ucontext)(struct ib_ucontext *context);
+       int (*alloc_ucontext)(struct ib_ucontext *context,
+                             struct ib_udata *udata);
+       void (*dealloc_ucontext)(struct ib_ucontext *context);
        int (*mmap)(struct ib_ucontext *context, struct vm_area_struct *vma);
        void (*disassociate_ucontext)(struct ib_ucontext *ibcontext);
-       struct ib_pd *(*alloc_pd)(struct ib_device *device,
-                                 struct ib_ucontext *context,
-                                 struct ib_udata *udata);
-       int (*dealloc_pd)(struct ib_pd *pd);
-       struct ib_ah *(*create_ah)(struct ib_pd *pd,
-                                  struct rdma_ah_attr *ah_attr, u32 flags,
-                                  struct ib_udata *udata);
+       int (*alloc_pd)(struct ib_pd *pd, struct ib_udata *udata);
+       void (*dealloc_pd)(struct ib_pd *pd, struct ib_udata *udata);
+       int (*create_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr,
+                        u32 flags, struct ib_udata *udata);
        int (*modify_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
        int (*query_ah)(struct ib_ah *ah, struct rdma_ah_attr *ah_attr);
-       int (*destroy_ah)(struct ib_ah *ah, u32 flags);
-       struct ib_srq *(*create_srq)(struct ib_pd *pd,
-                                    struct ib_srq_init_attr *srq_init_attr,
-                                    struct ib_udata *udata);
+       void (*destroy_ah)(struct ib_ah *ah, u32 flags);
+       int (*create_srq)(struct ib_srq *srq,
+                         struct ib_srq_init_attr *srq_init_attr,
+                         struct ib_udata *udata);
        int (*modify_srq)(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
                          enum ib_srq_attr_mask srq_attr_mask,
                          struct ib_udata *udata);
        int (*query_srq)(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
-       int (*destroy_srq)(struct ib_srq *srq);
+       void (*destroy_srq)(struct ib_srq *srq, struct ib_udata *udata);
        struct ib_qp *(*create_qp)(struct ib_pd *pd,
                                   struct ib_qp_init_attr *qp_init_attr,
                                   struct ib_udata *udata);
@@ -2397,13 +2451,12 @@ struct ib_device_ops {
                         int qp_attr_mask, struct ib_udata *udata);
        int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
                        int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
-       int (*destroy_qp)(struct ib_qp *qp);
+       int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata);
        struct ib_cq *(*create_cq)(struct ib_device *device,
                                   const struct ib_cq_init_attr *attr,
-                                  struct ib_ucontext *context,
                                   struct ib_udata *udata);
        int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
-       int (*destroy_cq)(struct ib_cq *cq);
+       int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata);
        int (*resize_cq)(struct ib_cq *cq, int cqe, struct ib_udata *udata);
        struct ib_mr *(*get_dma_mr)(struct ib_pd *pd, int mr_access_flags);
        struct ib_mr *(*reg_user_mr)(struct ib_pd *pd, u64 start, u64 length,
@@ -2412,9 +2465,9 @@ struct ib_device_ops {
        int (*rereg_user_mr)(struct ib_mr *mr, int flags, u64 start, u64 length,
                             u64 virt_addr, int mr_access_flags,
                             struct ib_pd *pd, struct ib_udata *udata);
-       int (*dereg_mr)(struct ib_mr *mr);
+       int (*dereg_mr)(struct ib_mr *mr, struct ib_udata *udata);
        struct ib_mr *(*alloc_mr)(struct ib_pd *pd, enum ib_mr_type mr_type,
-                                 u32 max_num_sg);
+                                 u32 max_num_sg, struct ib_udata *udata);
        int (*advise_mr)(struct ib_pd *pd,
                         enum ib_uverbs_advise_mr_advice advice, u32 flags,
                         struct ib_sge *sg_list, u32 num_sge,
@@ -2435,9 +2488,8 @@ struct ib_device_ops {
        int (*attach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
        int (*detach_mcast)(struct ib_qp *qp, union ib_gid *gid, u16 lid);
        struct ib_xrcd *(*alloc_xrcd)(struct ib_device *device,
-                                     struct ib_ucontext *ucontext,
                                      struct ib_udata *udata);
-       int (*dealloc_xrcd)(struct ib_xrcd *xrcd);
+       int (*dealloc_xrcd)(struct ib_xrcd *xrcd, struct ib_udata *udata);
        struct ib_flow *(*create_flow)(struct ib_qp *qp,
                                       struct ib_flow_attr *flow_attr,
                                       int domain, struct ib_udata *udata);
@@ -2462,7 +2514,7 @@ struct ib_device_ops {
        struct ib_wq *(*create_wq)(struct ib_pd *pd,
                                   struct ib_wq_init_attr *init_attr,
                                   struct ib_udata *udata);
-       int (*destroy_wq)(struct ib_wq *wq);
+       int (*destroy_wq)(struct ib_wq *wq, struct ib_udata *udata);
        int (*modify_wq)(struct ib_wq *wq, struct ib_wq_attr *attr,
                         u32 wq_attr_mask, struct ib_udata *udata);
        struct ib_rwq_ind_table *(*create_rwq_ind_table)(
@@ -2474,7 +2526,7 @@ struct ib_device_ops {
                                  struct ib_ucontext *context,
                                  struct ib_dm_alloc_attr *attr,
                                  struct uverbs_attr_bundle *attrs);
-       int (*dealloc_dm)(struct ib_dm *dm);
+       int (*dealloc_dm)(struct ib_dm *dm, struct uverbs_attr_bundle *attrs);
        struct ib_mr *(*reg_dm_mr)(struct ib_pd *pd, struct ib_dm *dm,
                                   struct ib_dm_mr_attr *attr,
                                   struct uverbs_attr_bundle *attrs);
@@ -2506,53 +2558,83 @@ struct ib_device_ops {
         */
        int (*get_hw_stats)(struct ib_device *device,
                            struct rdma_hw_stats *stats, u8 port, int index);
+       /*
+        * This function is called once for each port when a ib device is
+        * registered.
+        */
+       int (*init_port)(struct ib_device *device, u8 port_num,
+                        struct kobject *port_sysfs);
+       /**
+        * Allows rdma drivers to add their own restrack attributes.
+        */
+       int (*fill_res_entry)(struct sk_buff *msg,
+                             struct rdma_restrack_entry *entry);
+
+       /* Device lifecycle callbacks */
+       /*
+        * Called after the device becomes registered, before clients are
+        * attached
+        */
+       int (*enable_driver)(struct ib_device *dev);
+       /*
+        * This is called as part of ib_dealloc_device().
+        */
+       void (*dealloc_driver)(struct ib_device *dev);
+
+       DECLARE_RDMA_OBJ_SIZE(ib_ah);
+       DECLARE_RDMA_OBJ_SIZE(ib_pd);
+       DECLARE_RDMA_OBJ_SIZE(ib_srq);
+       DECLARE_RDMA_OBJ_SIZE(ib_ucontext);
 };
 
+struct ib_core_device {
+       /* device must be the first element in structure until,
+        * union of ib_core_device and device exists in ib_device.
+        */
+       struct device dev;
+       possible_net_t rdma_net;
+       struct kobject *ports_kobj;
+       struct list_head port_list;
+       struct ib_device *owner; /* reach back to owner ib_device */
+};
+
+struct rdma_restrack_root;
 struct ib_device {
        /* Do not access @dma_device directly from ULP nor from HW drivers. */
        struct device                *dma_device;
        struct ib_device_ops         ops;
        char                          name[IB_DEVICE_NAME_MAX];
+       struct rcu_head rcu_head;
 
        struct list_head              event_handler_list;
        spinlock_t                    event_handler_lock;
 
-       rwlock_t                        client_data_lock;
-       struct list_head              core_list;
-       /* Access to the client_data_list is protected by the client_data_lock
-        * rwlock and the lists_rwsem read-write semaphore
-        */
-       struct list_head              client_data_list;
+       struct rw_semaphore           client_data_rwsem;
+       struct xarray                 client_data;
+       struct mutex                  unregistration_lock;
 
        struct ib_cache               cache;
        /**
-        * port_immutable is indexed by port number
+        * port_data is indexed by port number
         */
-       struct ib_port_immutable     *port_immutable;
+       struct ib_port_data *port_data;
 
        int                           num_comp_vectors;
 
-       struct ib_port_pkey_list     *port_pkey_list;
-
        struct iw_cm_verbs           *iwcm;
 
        struct module               *owner;
-       struct device                dev;
+       union {
+               struct device           dev;
+               struct ib_core_device   coredev;
+       };
+
        /* First group for device attributes,
         * Second group for driver provided attributes (optional).
         * It is NULL terminated array.
         */
        const struct attribute_group    *groups[3];
 
-       struct kobject                  *ports_kobj;
-       struct list_head             port_list;
-
-       enum {
-               IB_DEV_UNINITIALIZED,
-               IB_DEV_REGISTERED,
-               IB_DEV_UNREGISTERED
-       }                            reg_state;
-
        int                          uverbs_abi_ver;
        u64                          uverbs_cmd_mask;
        u64                          uverbs_ex_cmd_mask;
@@ -2561,6 +2643,8 @@ struct ib_device {
        __be64                       node_guid;
        u32                          local_dma_lkey;
        u16                          is_switch:1;
+       /* Indicates kernel verbs support, should not be used in drivers */
+       u16                          kverbs_provider:1;
        u8                           node_type;
        u8                           phys_port_cnt;
        struct ib_device_attr        attrs;
@@ -2572,10 +2656,7 @@ struct ib_device {
 #endif
 
        u32                          index;
-       /*
-        * Implementation details of the RDMA core, don't use in drivers
-        */
-       struct rdma_restrack_root     res;
+       struct rdma_restrack_root *res;
 
        const struct uapi_definition   *driver_def;
        enum rdma_driver_id             driver_id;
@@ -2586,10 +2667,18 @@ struct ib_device {
         */
        refcount_t refcount;
        struct completion unreg_completion;
+       struct work_struct unregistration_work;
+
+       const struct rdma_link_ops *link_ops;
+
+       /* Protects compat_devs xarray modifications */
+       struct mutex compat_devs_mutex;
+       /* Maintains compat devices for each net namespace */
+       struct xarray compat_devs;
 };
 
 struct ib_client {
-       char  *name;
+       const char *name;
        void (*add)   (struct ib_device *);
        void (*remove)(struct ib_device *, void *client_data);
 
@@ -2616,22 +2705,47 @@ struct ib_client {
                        const struct sockaddr *addr,
                        void *client_data);
        struct list_head list;
+       u32 client_id;
+
+       /* kverbs are not required by the client */
+       u8 no_kverbs_req:1;
 };
 
-struct ib_device *ib_alloc_device(size_t size);
+struct ib_device *_ib_alloc_device(size_t size);
+#define ib_alloc_device(drv_struct, member)                                    \
+       container_of(_ib_alloc_device(sizeof(struct drv_struct) +              \
+                                     BUILD_BUG_ON_ZERO(offsetof(              \
+                                             struct drv_struct, member))),    \
+                    struct drv_struct, member)
+
 void ib_dealloc_device(struct ib_device *device);
 
 void ib_get_device_fw_str(struct ib_device *device, char *str);
 
-int ib_register_device(struct ib_device *device, const char *name,
-                      int (*port_callback)(struct ib_device *, u8,
-                                           struct kobject *));
+int ib_register_device(struct ib_device *device, const char *name);
 void ib_unregister_device(struct ib_device *device);
+void ib_unregister_driver(enum rdma_driver_id driver_id);
+void ib_unregister_device_and_put(struct ib_device *device);
+void ib_unregister_device_queued(struct ib_device *ib_dev);
 
 int ib_register_client   (struct ib_client *client);
 void ib_unregister_client(struct ib_client *client);
 
-void *ib_get_client_data(struct ib_device *device, struct ib_client *client);
+/**
+ * ib_get_client_data - Get IB client context
+ * @device:Device to get context for
+ * @client:Client to get context for
+ *
+ * ib_get_client_data() returns the client context data set with
+ * ib_set_client_data(). This can only be called while the client is
+ * registered to the device, once the ib_client remove() callback returns this
+ * cannot be called.
+ */
+static inline void *ib_get_client_data(struct ib_device *device,
+                                      struct ib_client *client)
+{
+       return xa_load(&device->client_data, client->client_id);
+}
 void  ib_set_client_data(struct ib_device *device, struct ib_client *client,
                         void *data);
 void ib_set_device_ops(struct ib_device *device,
@@ -2640,9 +2754,6 @@ void ib_set_device_ops(struct ib_device *device,
 #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 int rdma_user_mmap_io(struct ib_ucontext *ucontext, struct vm_area_struct *vma,
                      unsigned long pfn, unsigned long size, pgprot_t prot);
-int rdma_user_mmap_page(struct ib_ucontext *ucontext,
-                       struct vm_area_struct *vma, struct page *page,
-                       unsigned long size);
 #else
 static inline int rdma_user_mmap_io(struct ib_ucontext *ucontext,
                                    struct vm_area_struct *vma,
@@ -2651,12 +2762,6 @@ static inline int rdma_user_mmap_io(struct ib_ucontext *ucontext,
 {
        return -EINVAL;
 }
-static inline int rdma_user_mmap_page(struct ib_ucontext *ucontext,
-                               struct vm_area_struct *vma, struct page *page,
-                               unsigned long size)
-{
-       return -EINVAL;
-}
 #endif
 
 static inline int ib_copy_from_udata(void *dest, struct ib_udata *udata, size_t len)
@@ -2789,6 +2894,16 @@ static inline u8 rdma_start_port(const struct ib_device *device)
        return rdma_cap_ib_switch(device) ? 0 : 1;
 }
 
+/**
+ * rdma_for_each_port - Iterate over all valid port numbers of the IB device
+ * @device - The struct ib_device * to iterate over
+ * @iter - The unsigned int to store the port number
+ */
+#define rdma_for_each_port(device, iter)                                       \
+       for (iter = rdma_start_port(device + BUILD_BUG_ON_ZERO(!__same_type(   \
+                                                    unsigned int, iter)));    \
+            iter <= rdma_end_port(device); (iter)++)
+
 /**
  * rdma_end_port - Return the last valid port number for the device
  * specified
@@ -2812,34 +2927,38 @@ static inline int rdma_is_port_valid(const struct ib_device *device,
 static inline bool rdma_is_grh_required(const struct ib_device *device,
                                        u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags &
-               RDMA_CORE_PORT_IB_GRH_REQUIRED;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_PORT_IB_GRH_REQUIRED;
 }
 
 static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IB;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_IB;
 }
 
 static inline bool rdma_protocol_roce(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags &
-               (RDMA_CORE_CAP_PROT_ROCE | RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP);
+       return device->port_data[port_num].immutable.core_cap_flags &
+              (RDMA_CORE_CAP_PROT_ROCE | RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP);
 }
 
 static inline bool rdma_protocol_roce_udp_encap(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP;
 }
 
 static inline bool rdma_protocol_roce_eth_encap(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_ROCE;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_ROCE;
 }
 
 static inline bool rdma_protocol_iwarp(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IWARP;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_IWARP;
 }
 
 static inline bool rdma_ib_or_roce(const struct ib_device *device, u8 port_num)
@@ -2850,12 +2969,14 @@ static inline bool rdma_ib_or_roce(const struct ib_device *device, u8 port_num)
 
 static inline bool rdma_protocol_raw_packet(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_RAW_PACKET;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_RAW_PACKET;
 }
 
 static inline bool rdma_protocol_usnic(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_USNIC;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_PROT_USNIC;
 }
 
 /**
@@ -2872,7 +2993,8 @@ static inline bool rdma_protocol_usnic(const struct ib_device *device, u8 port_n
  */
 static inline bool rdma_cap_ib_mad(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_MAD;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_IB_MAD;
 }
 
 /**
@@ -2896,8 +3018,8 @@ static inline bool rdma_cap_ib_mad(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_opa_mad(struct ib_device *device, u8 port_num)
 {
-       return (device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_OPA_MAD)
-               == RDMA_CORE_CAP_OPA_MAD;
+       return device->port_data[port_num].immutable.core_cap_flags &
+               RDMA_CORE_CAP_OPA_MAD;
 }
 
 /**
@@ -2922,7 +3044,8 @@ static inline bool rdma_cap_opa_mad(struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_ib_smi(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_SMI;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_IB_SMI;
 }
 
 /**
@@ -2942,7 +3065,8 @@ static inline bool rdma_cap_ib_smi(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_ib_cm(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_CM;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_IB_CM;
 }
 
 /**
@@ -2959,7 +3083,8 @@ static inline bool rdma_cap_ib_cm(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_iw_cm(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IW_CM;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_IW_CM;
 }
 
 /**
@@ -2979,7 +3104,8 @@ static inline bool rdma_cap_iw_cm(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_ib_sa(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_IB_SA;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_IB_SA;
 }
 
 /**
@@ -3019,7 +3145,8 @@ static inline bool rdma_cap_ib_mcast(const struct ib_device *device, u8 port_num
  */
 static inline bool rdma_cap_af_ib(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_AF_IB;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_AF_IB;
 }
 
 /**
@@ -3040,7 +3167,8 @@ static inline bool rdma_cap_af_ib(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_eth_ah(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_ETH_AH;
+       return device->port_data[port_num].immutable.core_cap_flags &
+              RDMA_CORE_CAP_ETH_AH;
 }
 
 /**
@@ -3054,7 +3182,7 @@ static inline bool rdma_cap_eth_ah(const struct ib_device *device, u8 port_num)
  */
 static inline bool rdma_cap_opa_ah(struct ib_device *device, u8 port_num)
 {
-       return (device->port_immutable[port_num].core_cap_flags &
+       return (device->port_data[port_num].immutable.core_cap_flags &
                RDMA_CORE_CAP_OPA_AH) == RDMA_CORE_CAP_OPA_AH;
 }
 
@@ -3072,7 +3200,7 @@ static inline bool rdma_cap_opa_ah(struct ib_device *device, u8 port_num)
  */
 static inline size_t rdma_max_mad_size(const struct ib_device *device, u8 port_num)
 {
-       return device->port_immutable[port_num].max_mad_size;
+       return device->port_data[port_num].immutable.max_mad_size;
 }
 
 /**
@@ -3148,9 +3276,27 @@ enum ib_pd_flags {
 
 struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags,
                const char *caller);
+
 #define ib_alloc_pd(device, flags) \
        __ib_alloc_pd((device), (flags), KBUILD_MODNAME)
-void ib_dealloc_pd(struct ib_pd *pd);
+
+/**
+ * ib_dealloc_pd_user - Deallocate kernel/user PD
+ * @pd: The protection domain
+ * @udata: Valid user data or NULL for kernel objects
+ */
+void ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata);
+
+/**
+ * ib_dealloc_pd - Deallocate kernel PD
+ * @pd: The protection domain
+ *
+ * NOTE: for user PD use ib_dealloc_pd_user with valid udata!
+ */
+static inline void ib_dealloc_pd(struct ib_pd *pd)
+{
+       ib_dealloc_pd_user(pd, NULL);
+}
 
 enum rdma_create_ah_flags {
        /* In a sleepable context */
@@ -3263,11 +3409,24 @@ enum rdma_destroy_ah_flags {
 };
 
 /**
- * rdma_destroy_ah - Destroys an address handle.
+ * rdma_destroy_ah_user - Destroys an address handle.
+ * @ah: The address handle to destroy.
+ * @flags: Destroy address handle flags (see enum rdma_destroy_ah_flags).
+ * @udata: Valid user data or NULL for kernel objects
+ */
+int rdma_destroy_ah_user(struct ib_ah *ah, u32 flags, struct ib_udata *udata);
+
+/**
+ * rdma_destroy_ah - Destroys an kernel address handle.
  * @ah: The address handle to destroy.
  * @flags: Destroy address handle flags (see enum rdma_destroy_ah_flags).
+ *
+ * NOTE: for user ah use rdma_destroy_ah_user with valid udata!
  */
-int rdma_destroy_ah(struct ib_ah *ah, u32 flags);
+static inline int rdma_destroy_ah(struct ib_ah *ah, u32 flags)
+{
+       return rdma_destroy_ah_user(ah, flags, NULL);
+}
 
 /**
  * ib_create_srq - Creates a SRQ associated with the specified protection
@@ -3311,10 +3470,22 @@ int ib_query_srq(struct ib_srq *srq,
                 struct ib_srq_attr *srq_attr);
 
 /**
- * ib_destroy_srq - Destroys the specified SRQ.
+ * ib_destroy_srq_user - Destroys the specified SRQ.
+ * @srq: The SRQ to destroy.
+ * @udata: Valid user data or NULL for kernel objects
+ */
+int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata);
+
+/**
+ * ib_destroy_srq - Destroys the specified kernel SRQ.
  * @srq: The SRQ to destroy.
+ *
+ * NOTE: for user srq use ib_destroy_srq_user with valid udata!
  */
-int ib_destroy_srq(struct ib_srq *srq);
+static inline int ib_destroy_srq(struct ib_srq *srq)
+{
+       return ib_destroy_srq_user(srq, NULL);
+}
 
 /**
  * ib_post_srq_recv - Posts a list of work requests to the specified SRQ.
@@ -3334,15 +3505,34 @@ static inline int ib_post_srq_recv(struct ib_srq *srq,
 }
 
 /**
- * ib_create_qp - Creates a QP associated with the specified protection
+ * ib_create_qp_user - Creates a QP associated with the specified protection
  *   domain.
  * @pd: The protection domain associated with the QP.
  * @qp_init_attr: A list of initial attributes required to create the
  *   QP.  If QP creation succeeds, then the attributes are updated to
  *   the actual capabilities of the created QP.
+ * @udata: Valid user data or NULL for kernel objects
  */
-struct ib_qp *ib_create_qp(struct ib_pd *pd,
-                          struct ib_qp_init_attr *qp_init_attr);
+struct ib_qp *ib_create_qp_user(struct ib_pd *pd,
+                               struct ib_qp_init_attr *qp_init_attr,
+                               struct ib_udata *udata);
+
+/**
+ * ib_create_qp - Creates a kernel QP associated with the specified protection
+ *   domain.
+ * @pd: The protection domain associated with the QP.
+ * @qp_init_attr: A list of initial attributes required to create the
+ *   QP.  If QP creation succeeds, then the attributes are updated to
+ *   the actual capabilities of the created QP.
+ * @udata: Valid user data or NULL for kernel objects
+ *
+ * NOTE: for user qp use ib_create_qp_user with valid udata!
+ */
+static inline struct ib_qp *ib_create_qp(struct ib_pd *pd,
+                                        struct ib_qp_init_attr *qp_init_attr)
+{
+       return ib_create_qp_user(pd, qp_init_attr, NULL);
+}
 
 /**
  * ib_modify_qp_with_udata - Modifies the attributes for the specified QP.
@@ -3392,8 +3582,20 @@ int ib_query_qp(struct ib_qp *qp,
 /**
  * ib_destroy_qp - Destroys the specified QP.
  * @qp: The QP to destroy.
+ * @udata: Valid udata or NULL for kernel objects
+ */
+int ib_destroy_qp_user(struct ib_qp *qp, struct ib_udata *udata);
+
+/**
+ * ib_destroy_qp - Destroys the specified kernel QP.
+ * @qp: The QP to destroy.
+ *
+ * NOTE: for user qp use ib_destroy_qp_user with valid udata!
  */
-int ib_destroy_qp(struct ib_qp *qp);
+static inline int ib_destroy_qp(struct ib_qp *qp)
+{
+       return ib_destroy_qp_user(qp, NULL);
+}
 
 /**
  * ib_open_qp - Obtain a reference to an existing sharable QP.
@@ -3453,13 +3655,66 @@ static inline int ib_post_recv(struct ib_qp *qp,
        return qp->device->ops.post_recv(qp, recv_wr, bad_recv_wr ? : &dummy);
 }
 
-struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private,
-                           int nr_cqe, int comp_vector,
-                           enum ib_poll_context poll_ctx, const char *caller);
-#define ib_alloc_cq(device, priv, nr_cqe, comp_vect, poll_ctx) \
-       __ib_alloc_cq((device), (priv), (nr_cqe), (comp_vect), (poll_ctx), KBUILD_MODNAME)
+struct ib_cq *__ib_alloc_cq_user(struct ib_device *dev, void *private,
+                                int nr_cqe, int comp_vector,
+                                enum ib_poll_context poll_ctx,
+                                const char *caller, struct ib_udata *udata);
+
+/**
+ * ib_alloc_cq_user: Allocate kernel/user CQ
+ * @dev: The IB device
+ * @private: Private data attached to the CQE
+ * @nr_cqe: Number of CQEs in the CQ
+ * @comp_vector: Completion vector used for the IRQs
+ * @poll_ctx: Context used for polling the CQ
+ * @udata: Valid user data or NULL for kernel objects
+ */
+static inline struct ib_cq *ib_alloc_cq_user(struct ib_device *dev,
+                                            void *private, int nr_cqe,
+                                            int comp_vector,
+                                            enum ib_poll_context poll_ctx,
+                                            struct ib_udata *udata)
+{
+       return __ib_alloc_cq_user(dev, private, nr_cqe, comp_vector, poll_ctx,
+                                 KBUILD_MODNAME, udata);
+}
+
+/**
+ * ib_alloc_cq: Allocate kernel CQ
+ * @dev: The IB device
+ * @private: Private data attached to the CQE
+ * @nr_cqe: Number of CQEs in the CQ
+ * @comp_vector: Completion vector used for the IRQs
+ * @poll_ctx: Context used for polling the CQ
+ *
+ * NOTE: for user cq use ib_alloc_cq_user with valid udata!
+ */
+static inline struct ib_cq *ib_alloc_cq(struct ib_device *dev, void *private,
+                                       int nr_cqe, int comp_vector,
+                                       enum ib_poll_context poll_ctx)
+{
+       return ib_alloc_cq_user(dev, private, nr_cqe, comp_vector, poll_ctx,
+                               NULL);
+}
+
+/**
+ * ib_free_cq_user - Free kernel/user CQ
+ * @cq: The CQ to free
+ * @udata: Valid user data or NULL for kernel objects
+ */
+void ib_free_cq_user(struct ib_cq *cq, struct ib_udata *udata);
+
+/**
+ * ib_free_cq - Free kernel CQ
+ * @cq: The CQ to free
+ *
+ * NOTE: for user cq use ib_free_cq_user with valid udata!
+ */
+static inline void ib_free_cq(struct ib_cq *cq)
+{
+       ib_free_cq_user(cq, NULL);
+}
 
-void ib_free_cq(struct ib_cq *cq);
 int ib_process_cq_direct(struct ib_cq *cq, int budget);
 
 /**
@@ -3503,10 +3758,22 @@ int ib_resize_cq(struct ib_cq *cq, int cqe);
 int rdma_set_cq_moderation(struct ib_cq *cq, u16 cq_count, u16 cq_period);
 
 /**
- * ib_destroy_cq - Destroys the specified CQ.
+ * ib_destroy_cq_user - Destroys the specified CQ.
+ * @cq: The CQ to destroy.
+ * @udata: Valid user data or NULL for kernel objects
+ */
+int ib_destroy_cq_user(struct ib_cq *cq, struct ib_udata *udata);
+
+/**
+ * ib_destroy_cq - Destroys the specified kernel CQ.
  * @cq: The CQ to destroy.
+ *
+ * NOTE: for user cq use ib_destroy_cq_user with valid udata!
  */
-int ib_destroy_cq(struct ib_cq *cq);
+static inline int ib_destroy_cq(struct ib_cq *cq)
+{
+       return ib_destroy_cq_user(cq, NULL);
+}
 
 /**
  * ib_poll_cq - poll a CQ for completion(s)
@@ -3686,32 +3953,18 @@ static inline void ib_dma_unmap_sg_attrs(struct ib_device *dev,
 {
        dma_unmap_sg_attrs(dev->dma_device, sg, nents, direction, dma_attrs);
 }
-/**
- * ib_sg_dma_address - Return the DMA address from a scatter/gather entry
- * @dev: The device for which the DMA addresses were created
- * @sg: The scatter/gather entry
- *
- * Note: this function is obsolete. To do: change all occurrences of
- * ib_sg_dma_address() into sg_dma_address().
- */
-static inline u64 ib_sg_dma_address(struct ib_device *dev,
-                                   struct scatterlist *sg)
-{
-       return sg_dma_address(sg);
-}
 
 /**
- * ib_sg_dma_len - Return the DMA length from a scatter/gather entry
- * @dev: The device for which the DMA addresses were created
- * @sg: The scatter/gather entry
+ * ib_dma_max_seg_size - Return the size limit of a single DMA transfer
+ * @dev: The device to query
  *
- * Note: this function is obsolete. To do: change all occurrences of
- * ib_sg_dma_len() into sg_dma_len().
+ * The returned value represents a size in bytes.
  */
-static inline unsigned int ib_sg_dma_len(struct ib_device *dev,
-                                        struct scatterlist *sg)
+static inline unsigned int ib_dma_max_seg_size(struct ib_device *dev)
 {
-       return sg_dma_len(sg);
+       struct device_dma_parameters *p = dev->dma_device->dma_parms;
+
+       return p ? p->max_segment_size : UINT_MAX;
 }
 
 /**
@@ -3774,17 +4027,37 @@ static inline void ib_dma_free_coherent(struct ib_device *dev,
 }
 
 /**
- * ib_dereg_mr - Deregisters a memory region and removes it from the
+ * ib_dereg_mr_user - Deregisters a memory region and removes it from the
  *   HCA translation table.
  * @mr: The memory region to deregister.
+ * @udata: Valid user data or NULL for kernel object
  *
  * This function can fail, if the memory region has memory windows bound to it.
  */
-int ib_dereg_mr(struct ib_mr *mr);
+int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata);
 
-struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
-                         enum ib_mr_type mr_type,
-                         u32 max_num_sg);
+/**
+ * ib_dereg_mr - Deregisters a kernel memory region and removes it from the
+ *   HCA translation table.
+ * @mr: The memory region to deregister.
+ *
+ * This function can fail, if the memory region has memory windows bound to it.
+ *
+ * NOTE: for user mr use ib_dereg_mr_user with valid udata!
+ */
+static inline int ib_dereg_mr(struct ib_mr *mr)
+{
+       return ib_dereg_mr_user(mr, NULL);
+}
+
+struct ib_mr *ib_alloc_mr_user(struct ib_pd *pd, enum ib_mr_type mr_type,
+                              u32 max_num_sg, struct ib_udata *udata);
+
+static inline struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
+                                       enum ib_mr_type mr_type, u32 max_num_sg)
+{
+       return ib_alloc_mr_user(pd, mr_type, max_num_sg, NULL);
+}
 
 /**
  * ib_update_fast_reg_key - updates the key portion of the fast_reg MR
@@ -3882,8 +4155,9 @@ struct ib_xrcd *__ib_alloc_xrcd(struct ib_device *device, const char *caller);
 /**
  * ib_dealloc_xrcd - Deallocates an XRC domain.
  * @xrcd: The XRC domain to deallocate.
+ * @udata: Valid user data or NULL for kernel object
  */
-int ib_dealloc_xrcd(struct ib_xrcd *xrcd);
+int ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
 
 static inline int ib_check_mr_access(int flags)
 {
@@ -3946,12 +4220,20 @@ static inline bool ib_device_try_get(struct ib_device *dev)
 }
 
 void ib_device_put(struct ib_device *device);
+struct ib_device *ib_device_get_by_netdev(struct net_device *ndev,
+                                         enum rdma_driver_id driver_id);
+struct ib_device *ib_device_get_by_name(const char *name,
+                                       enum rdma_driver_id driver_id);
 struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u8 port,
                                            u16 pkey, const union ib_gid *gid,
                                            const struct sockaddr *addr);
+int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
+                        unsigned int port);
+struct net_device *ib_device_netdev(struct ib_device *dev, u8 port);
+
 struct ib_wq *ib_create_wq(struct ib_pd *pd,
                           struct ib_wq_init_attr *init_attr);
-int ib_destroy_wq(struct ib_wq *wq);
+int ib_destroy_wq(struct ib_wq *wq, struct ib_udata *udata);
 int ib_modify_wq(struct ib_wq *wq, struct ib_wq_attr *attr,
                 u32 wq_attr_mask);
 struct ib_rwq_ind_table *ib_create_rwq_ind_table(struct ib_device *device,
@@ -4222,7 +4504,6 @@ void rdma_roce_rescan_device(struct ib_device *ibdev);
 
 struct ib_ucontext *ib_uverbs_get_ucontext_file(struct ib_uverbs_file *ufile);
 
-
 int uverbs_destroy_def_handler(struct uverbs_attr_bundle *attrs);
 
 struct net_device *rdma_alloc_netdev(struct ib_device *device, u8 port_num,
@@ -4258,4 +4539,33 @@ rdma_set_device_sysfs_group(struct ib_device *dev,
        dev->groups[1] = group;
 }
 
+/**
+ * rdma_device_to_ibdev - Get ib_device pointer from device pointer
+ *
+ * @device:    device pointer for which ib_device pointer to retrieve
+ *
+ * rdma_device_to_ibdev() retrieves ib_device pointer from device.
+ *
+ */
+static inline struct ib_device *rdma_device_to_ibdev(struct device *device)
+{
+       struct ib_core_device *coredev =
+               container_of(device, struct ib_core_device, dev);
+
+       return coredev->owner;
+}
+
+/**
+ * rdma_device_to_drv_device - Helper macro to reach back to driver's
+ *                            ib_device holder structure from device pointer.
+ *
+ * NOTE: New drivers should not make use of this API; This API is only for
+ * existing drivers who have exposed sysfs entries using
+ * rdma_set_device_sysfs_group().
+ */
+#define rdma_device_to_drv_device(dev, drv_dev_struct, ibdev_member)           \
+       container_of(rdma_device_to_ibdev(dev), drv_dev_struct, ibdev_member)
+
+bool rdma_dev_access_netns(const struct ib_device *device,
+                          const struct net *net);
 #endif /* IB_VERBS_H */