IB/core: Let create_ah return extended response to user
authorMoni Shoua <monis@mellanox.com>
Wed, 23 Nov 2016 06:23:24 +0000 (08:23 +0200)
committerDoug Ledford <dledford@redhat.com>
Tue, 13 Dec 2016 18:38:27 +0000 (13:38 -0500)
Add struct ib_udata to the signature of create_ah callback that is
implemented by IB device drivers. This allows HW drivers to return extra
data to the userspace library.
This patch prepares the ground for mlx5 driver to resolve destination
mac address for a given GID and return it to userspace.
This patch was previously submitted by Knut Omang as a part of the
patch set to support Oracle's Infiniband HCA (SIF).

Signed-off-by: Knut Omang <knut.omang@oracle.com>
Signed-off-by: Moni Shoua <monis@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
21 files changed:
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/cxgb3/iwch_provider.c
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/hns/hns_roce_ah.c
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/i40iw/i40iw_verbs.c
drivers/infiniband/hw/mlx4/ah.c
drivers/infiniband/hw/mlx4/mlx4_ib.h
drivers/infiniband/hw/mlx5/ah.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/nes/nes_verbs.c
drivers/infiniband/hw/ocrdma/ocrdma_ah.c
drivers/infiniband/hw/ocrdma/ocrdma_ah.h
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/qedr/verbs.h
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.h
drivers/infiniband/sw/rxe/rxe_verbs.c
include/rdma/ib_verbs.h

index 77bb15f6641400647a65af7df1618f546f58a31d..cdb935ddab6969fd2b8cfec5353aedb4e60b5a39 100644 (file)
@@ -2877,6 +2877,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
        struct ib_ah                    *ah;
        struct ib_ah_attr               attr;
        int ret;
+       struct ib_udata                   udata;
 
        if (out_len < sizeof resp)
                return -ENOSPC;
@@ -2884,6 +2885,10 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
        if (copy_from_user(&cmd, buf, sizeof cmd))
                return -EFAULT;
 
+       INIT_UDATA(&udata, buf + sizeof(cmd),
+                  (unsigned long)cmd.response + sizeof(resp),
+                  in_len - sizeof(cmd), out_len - sizeof(resp));
+
        uobj = kmalloc(sizeof *uobj, GFP_KERNEL);
        if (!uobj)
                return -ENOMEM;
@@ -2910,12 +2915,16 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
        memset(&attr.dmac, 0, sizeof(attr.dmac));
        memcpy(attr.grh.dgid.raw, cmd.attr.grh.dgid, 16);
 
-       ah = ib_create_ah(pd, &attr);
+       ah = pd->device->create_ah(pd, &attr, &udata);
+
        if (IS_ERR(ah)) {
                ret = PTR_ERR(ah);
                goto err_put;
        }
 
+       ah->device  = pd->device;
+       ah->pd      = pd;
+       atomic_inc(&pd->usecnt);
        ah->uobject  = uobj;
        uobj->object = ah;
 
index cacee169cd554e42059078a04eca74a99b3f0667..c976f29f7ad2931c90085e78f49b65ed8d718363 100644 (file)
@@ -315,7 +315,7 @@ struct ib_ah *ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
 {
        struct ib_ah *ah;
 
-       ah = pd->device->create_ah(pd, ah_attr);
+       ah = pd->device->create_ah(pd, ah_attr, NULL);
 
        if (!IS_ERR(ah)) {
                ah->device  = pd->device;
index cba57bb53dba31db7b95c8821da16794c6376afa..9d5fe1853da46e54e9d635c5d101b688f4a8119a 100644 (file)
@@ -62,7 +62,8 @@
 #include "common.h"
 
 static struct ib_ah *iwch_ah_create(struct ib_pd *pd,
-                                   struct ib_ah_attr *ah_attr)
+                                   struct ib_ah_attr *ah_attr,
+                                   struct ib_udata *udata)
 {
        return ERR_PTR(-ENOSYS);
 }
index 645e606a17c569483a8cf74615bb8912ffca79d2..49b51b7e0fd786bf49dc2187e6c661f14087f3ae 100644 (file)
@@ -59,7 +59,9 @@ module_param(fastreg_support, int, 0644);
 MODULE_PARM_DESC(fastreg_support, "Advertise fastreg support (default=1)");
 
 static struct ib_ah *c4iw_ah_create(struct ib_pd *pd,
-                                   struct ib_ah_attr *ah_attr)
+                                   struct ib_ah_attr *ah_attr,
+                                   struct ib_udata *udata)
+
 {
        return ERR_PTR(-ENOSYS);
 }
index 24f79ee39fdf569b545e4e2413acaed9a8abe059..0ac294db3b298e9328d52d9f58f972940e53f809 100644 (file)
@@ -39,7 +39,8 @@
 #define HNS_ROCE_VLAN_SL_BIT_MASK      7
 #define HNS_ROCE_VLAN_SL_SHIFT         13
 
-struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *ah_attr)
+struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *ah_attr,
+                                struct ib_udata *udata)
 {
        struct hns_roce_dev *hr_dev = to_hr_dev(ibpd->device);
        struct device *dev = &hr_dev->pdev->dev;
index 341731553a60167d4fff793edb49dc8958371422..470615f7b5176a89356178239b8973e4dca6656d 100644 (file)
@@ -667,7 +667,8 @@ int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt,
 void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap,
                                unsigned long obj, int cnt);
 
-struct ib_ah *hns_roce_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
+struct ib_ah *hns_roce_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                                struct ib_udata *udata);
 int hns_roce_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
 int hns_roce_destroy_ah(struct ib_ah *ah);
 
index 6329c971c22fc383330099fa07819b4666ee48b8..f03fc1527d708d9bde31237122a74ea84e50290c 100644 (file)
@@ -2562,7 +2562,9 @@ static int i40iw_query_pkey(struct ib_device *ibdev,
  * @ah_attr: address handle attributes
  */
 static struct ib_ah *i40iw_create_ah(struct ib_pd *ibpd,
-                                    struct ib_ah_attr *attr)
+                                    struct ib_ah_attr *attr,
+                                    struct ib_udata *udata)
+
 {
        return ERR_PTR(-ENOSYS);
 }
index 6be7dc320ff72defaf2f6619527908b66c7f7a4e..20c6d17ac8b828312325053d0f25e9eedc27fae3 100644 (file)
@@ -126,7 +126,9 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr
        return &ah->ibah;
 }
 
-struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
+struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata)
+
 {
        struct mlx4_ib_ah *ah;
        struct ib_ah *ret;
index 35141f451e5c75f01c9670432cf395c7cfcbbe77..7f3d976d81edce2789a5b5710a12f2a8a0b3b568 100644 (file)
@@ -742,7 +742,8 @@ int mlx4_ib_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
 void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq);
 void mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq);
 
-struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
+struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata);
 int mlx4_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
 int mlx4_ib_destroy_ah(struct ib_ah *ah);
 
index 745efa4cfc718eec9b749508f54b091ed13332d3..ecac9ea2c85fbbae5fadb8a9baa0535ef62efbb2 100644 (file)
@@ -64,7 +64,9 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
        return &ah->ibah;
 }
 
-struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
+struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata)
+
 {
        struct mlx5_ib_ah *ah;
        struct mlx5_ib_dev *dev = to_mdev(pd->device);
index 95937e7d2584ea482311cbcf55a084a7790065e7..ff05afa864ee3f7c41817dac7a3130243ff06afd 100644 (file)
@@ -739,7 +739,8 @@ void mlx5_ib_free_srq_wqe(struct mlx5_ib_srq *srq, int wqe_index);
 int mlx5_MAD_IFC(struct mlx5_ib_dev *dev, int ignore_mkey, int ignore_bkey,
                 u8 port, const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                 const void *in_mad, void *response_mad);
-struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
+struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata);
 int mlx5_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
 int mlx5_ib_destroy_ah(struct ib_ah *ah);
 struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
index 358930a41e36c35d92a0ad06ef99dfb4cd7bfd58..d31708742ba5b1814d28135e4e41b273b6e651ba 100644 (file)
@@ -410,7 +410,9 @@ static int mthca_dealloc_pd(struct ib_pd *pd)
 }
 
 static struct ib_ah *mthca_ah_create(struct ib_pd *pd,
-                                    struct ib_ah_attr *ah_attr)
+                                    struct ib_ah_attr *ah_attr,
+                                    struct ib_udata *udata)
+
 {
        int err;
        struct mthca_ah *ah;
index bd69125731c1816245fc90c2bfe7d4cbffb8c02a..0bb857c7e43922e15787483554f6a2da9121d9c6 100644 (file)
@@ -771,7 +771,8 @@ static int nes_dealloc_pd(struct ib_pd *ibpd)
 /**
  * nes_create_ah
  */
-static struct ib_ah *nes_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
+static struct ib_ah *nes_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                                  struct ib_udata *udata)
 {
        return ERR_PTR(-ENOSYS);
 }
index 797362a297b23aba74e1eac2ea0349a1ed57d023..14d33b0f39500ec06f818605d6506df83ec21a56 100644 (file)
@@ -154,7 +154,8 @@ static inline int set_av_attr(struct ocrdma_dev *dev, struct ocrdma_ah *ah,
        return status;
 }
 
-struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
+struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
+                              struct ib_udata *udata)
 {
        u32 *ahid_addr;
        int status;
index 3856dd4c7e3d6baa8243cc451338a4bfcf3d967e..0704a24b17c86b2dec79b22595db978eefcbbf35 100644 (file)
@@ -50,7 +50,9 @@ enum {
        OCRDMA_AH_L3_TYPE_MASK          = 0x03,
        OCRDMA_AH_L3_TYPE_SHIFT         = 0x1D /* 29 bits */
 };
-struct ib_ah *ocrdma_create_ah(struct ib_pd *, struct ib_ah_attr *);
+
+struct ib_ah *ocrdma_create_ah(struct ib_pd *, struct ib_ah_attr *,
+                              struct ib_udata *);
 int ocrdma_destroy_ah(struct ib_ah *);
 int ocrdma_query_ah(struct ib_ah *, struct ib_ah_attr *);
 int ocrdma_modify_ah(struct ib_ah *, struct ib_ah_attr *);
index a61514296767dacf531b6a964ee25c272b861eb6..ccff6c6e3f3317ce554c0b123388e3fee8742667 100644 (file)
@@ -2094,7 +2094,8 @@ int qedr_destroy_qp(struct ib_qp *ibqp)
        return rc;
 }
 
-struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
+struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
+                            struct ib_udata *udata)
 {
        struct qedr_ah *ah;
 
index a9b5e67bb81e9d487f2f44dce13a521386e7cd33..070677ca4d198b3496ded8f226e0489242f6c3f5 100644 (file)
@@ -70,7 +70,8 @@ int qedr_query_qp(struct ib_qp *, struct ib_qp_attr *qp_attr,
                  int qp_attr_mask, struct ib_qp_init_attr *);
 int qedr_destroy_qp(struct ib_qp *ibqp);
 
-struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr);
+struct ib_ah *qedr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
+                            struct ib_udata *udata);
 int qedr_destroy_ah(struct ib_ah *ibah);
 
 int qedr_dereg_mr(struct ib_mr *);
index a5bfbba6bbac0e9d918462ebb37d041608b9d321..fd2a50eb4c91206db104bead8a5f3c49090862b5 100644 (file)
@@ -738,7 +738,9 @@ int usnic_ib_mmap(struct ib_ucontext *context,
 
 /* In ib callbacks section -  Start of stub funcs */
 struct ib_ah *usnic_ib_create_ah(struct ib_pd *pd,
-                                       struct ib_ah_attr *ah_attr)
+                                struct ib_ah_attr *ah_attr,
+                                struct ib_udata *udata)
+
 {
        usnic_dbg("\n");
        return ERR_PTR(-EPERM);
index 0d9d2e6a14d5e73137e351036486dbfa2b21af60..0ed8e072329e7e98b947cec56ff23c62837b25a2 100644 (file)
@@ -75,7 +75,9 @@ int usnic_ib_dealloc_ucontext(struct ib_ucontext *ibcontext);
 int usnic_ib_mmap(struct ib_ucontext *context,
                        struct vm_area_struct *vma);
 struct ib_ah *usnic_ib_create_ah(struct ib_pd *pd,
-                                       struct ib_ah_attr *ah_attr);
+                                struct ib_ah_attr *ah_attr,
+                                struct ib_udata *udata);
+
 int usnic_ib_destroy_ah(struct ib_ah *ah);
 int usnic_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
                        struct ib_send_wr **bad_wr);
index 19841c863daf6606e8d0e79cdd9da955ee394833..187d85ccfe58fc58fb5cb5ed286a650a212216fc 100644 (file)
@@ -316,7 +316,9 @@ static int rxe_init_av(struct rxe_dev *rxe, struct ib_ah_attr *attr,
        return err;
 }
 
-static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
+static struct ib_ah *rxe_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
+                                  struct ib_udata *udata)
+
 {
        int err;
        struct rxe_dev *rxe = to_rdev(ibpd->device);
index 0c6f973e407c29ab3e7b58585d838294476f4f81..73417a22ee4dd1158c8e45c5b9bd9c9b292aa01b 100644 (file)
@@ -1951,7 +1951,8 @@ struct ib_device {
                                               struct ib_udata *udata);
        int                        (*dealloc_pd)(struct ib_pd *pd);
        struct ib_ah *             (*create_ah)(struct ib_pd *pd,
-                                               struct ib_ah_attr *ah_attr);
+                                               struct ib_ah_attr *ah_attr,
+                                               struct ib_udata *udata);
        int                        (*modify_ah)(struct ib_ah *ah,
                                                struct ib_ah_attr *ah_attr);
        int                        (*query_ah)(struct ib_ah *ah,