]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ib: Add udata argument to create_ah
authorKnut Omang <knut.omang@oracle.com>
Tue, 21 Apr 2015 10:20:04 +0000 (12:20 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 8 Jul 2015 01:10:57 +0000 (18:10 -0700)
Most of the ib device driver entry points supports optional
device specific parameter transfer between user space and kernel space
via the udata argument - add a similar argument for ib_create_ah.

Update all infiniband drivers to include this agument
in their driver entry point implementation.

Orabug: 20930262

Signed-off-by: Knut Omang <knut.omang@oracle.com>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
18 files changed:
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/amso1100/c2_provider.c
drivers/infiniband/hw/cxgb3/iwch_provider.c
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/ipath/ipath_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/qib/qib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
drivers/infiniband/hw/usnic/usnic_ib_verbs.h
include/rdma/ib_verbs.h

index edd3c5680ab41d00291b94e79de904dc4156eb8f..ceb7bb927559482dcb6ea7ecc83ace3623b5c16a 100644 (file)
@@ -2533,6 +2533,7 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
        struct ib_pd                    *pd;
        struct ib_ah                    *ah;
        struct ib_ah_attr               attr;
+       struct ib_udata                 udata;
        int ret;
 
        if (out_len < sizeof resp)
@@ -2541,6 +2542,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;
@@ -2568,14 +2573,17 @@ 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;
        ah->uobject  = uobj;
        uobj->object = ah;
+       atomic_inc(&pd->usecnt);
 
        ret = idr_add_uobj(&ib_uverbs_ah_idr, uobj);
        if (ret)
index f93eb8da7b5ad443900c3b8b423da505d0531a95..4632272e41aa819339569055749d3a6101197769 100644 (file)
@@ -179,7 +179,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 bdf3507810cb767767cd8496ea510f9a14497f7c..83185752cc025b71115955c2fda96ba591713664 100644 (file)
@@ -187,7 +187,8 @@ static int c2_dealloc_pd(struct ib_pd *pd)
        return 0;
 }
 
-static struct ib_ah *c2_ah_create(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
+static struct ib_ah *c2_ah_create(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                                 struct ib_udata *udata)
 {
        pr_debug("%s:%u\n", __func__, __LINE__);
        return ERR_PTR(-ENOSYS);
index 811b24a539c0037c83704339b19bcbdcf8060b77..67f4e81eed9f33e71fec77945b5a66f080ac7609 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 66bd6a2ad83b04f34e2b5fbb822e0b8ff062359b..7465caa538b367316ef54fc36fcd2cba13035347 100644 (file)
@@ -59,7 +59,8 @@ 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 44ea9390417ceb0a572058ff9097be0d3871fe8e..9f1bf4d6dd65acbcc892addb3fb292863c8e8f91 100644 (file)
@@ -1760,7 +1760,8 @@ static int ipath_dealloc_pd(struct ib_pd *ibpd)
  * This may be called from interrupt context.
  */
 static struct ib_ah *ipath_create_ah(struct ib_pd *pd,
-                                    struct ib_ah_attr *ah_attr)
+                                    struct ib_ah_attr *ah_attr,
+                                    struct ib_udata *udata)
 {
        struct ipath_ah *ah;
        struct ib_ah *ret;
index 5e588698a885ab580150f6fd74af941ed515ced6..b72fbfa9a191a25531b8b6d3122c7464139e74c4 100644 (file)
@@ -110,7 +110,8 @@ 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 1d19744333eba6a9b172989d3e747fd79a3bd2b8..0d4ad73b5ef02779b5b0b9f68946e243e14b6a2c 100644 (file)
@@ -683,7 +683,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 66080580e24db3e90c887bcea7132e6687bc3d33..98217406013fa41871bef0510fe58a11618e3d08 100644 (file)
@@ -51,7 +51,8 @@ struct ib_ah *create_ib_ah(struct ib_ah_attr *ah_attr,
        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;
 
index dff1cfcdf476cfed06d8835cd5316d234df09e1e..7c3c3fb78291e5d20222d9b77e6bfb57055892fb 100644 (file)
@@ -529,7 +529,8 @@ int mlx5_MAD_IFC(struct mlx5_ib_dev *dev, int ignore_mkey, int ignore_bkey,
                 void *in_mad, void *response_mad);
 struct ib_ah *create_ib_ah(struct ib_ah_attr *ah_attr,
                           struct mlx5_ib_ah *ah);
-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 415f8e1a54dbc82cf4ab81bf5ad98bd9034d0733..a6c68dac901e5fc29aa710fdbf6f65944a1f36a5 100644 (file)
@@ -405,7 +405,8 @@ 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 c0d0296e7a003089dec6d8d180de2bb6dd05964d..dbc853375f63ec138d2504658d96e9afe93a5ee5 100644 (file)
@@ -865,7 +865,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 f5a5ea836dbdc9fe4f12e6f26e1acca5dac3c6d1..b15c24d5d8d0db1f23cdadacfe4552e3d2dae09d 100644 (file)
@@ -97,7 +97,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;
        bool isvlan = false;
index 726a87cf22dcb215d2a105f08a054395bb0c6804..99aae596f3d2fe3b6db0aa9fc6b40f58e6cb959b 100644 (file)
@@ -34,7 +34,8 @@ enum {
        OCRDMA_AH_VLAN_VALID_SHIFT      = 0x1F
 };
 
-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 4a3599890ea5f114655a34e472bee9197d73bd2c..0f22bddb405d82845f701fddaa70124e454e6d59 100644 (file)
@@ -1818,7 +1818,8 @@ bail:
  * This may be called from interrupt context.
  */
 static struct ib_ah *qib_create_ah(struct ib_pd *pd,
-                                  struct ib_ah_attr *ah_attr)
+                                  struct ib_ah_attr *ah_attr,
+                                  struct ib_udata *udata)
 {
        struct qib_ah *ah;
        struct ib_ah *ret;
index 53bd6a2d9cdbbae4545a70d1d070b17eafb18154..74e179710d742b7024192229454bf707bb0d8a8a 100644 (file)
@@ -717,7 +717,8 @@ 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 bb864f5aed708e1f2ea5bb287fa00ef586bdb1ea..b64df82e73f32f933918b2c46af7d3a0ef362a37 100644 (file)
@@ -58,7 +58,8 @@ 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 907f3cde870fcce59cde9fc942c1f2d154cb3a3e..744c3f244584bf13f4f5cefa318cfdc5185292d4 100644 (file)
@@ -1529,7 +1529,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,