IB: Remove 'uobject->context' dependency in object destroy APIs
[linux-2.6-microblaze.git] / drivers / infiniband / hw / nes / nes_verbs.c
index 828e4af..244255b 100644 (file)
@@ -52,7 +52,7 @@ atomic_t qps_created;
 atomic_t sw_qps_destroyed;
 
 static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev);
-static int nes_dereg_mr(struct ib_mr *ib_mr);
+static int nes_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);
 
 /**
  * nes_alloc_mw
@@ -306,9 +306,8 @@ static int alloc_fast_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
 /*
  * nes_alloc_mr
  */
-static struct ib_mr *nes_alloc_mr(struct ib_pd *ibpd,
-                                 enum ib_mr_type mr_type,
-                                 u32 max_num_sg)
+static struct ib_mr *nes_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
+                                 u32 max_num_sg, struct ib_udata *udata)
 {
        struct nes_pd *nespd = to_nespd(ibpd);
        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
@@ -386,7 +385,7 @@ static struct ib_mr *nes_alloc_mr(struct ib_pd *ibpd,
        return ibmr;
 
 err:
-       nes_dereg_mr(ibmr);
+       nes_dereg_mr(ibmr, udata);
 
        return ERR_PTR(-ENOMEM);
 }
@@ -700,7 +699,7 @@ static int nes_alloc_pd(struct ib_pd *pd, struct ib_ucontext *context,
 /**
  * nes_dealloc_pd
  */
-static void nes_dealloc_pd(struct ib_pd *ibpd)
+static void nes_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 {
        struct nes_ucontext *nesucontext;
        struct nes_pd *nespd = to_nespd(ibpd);
@@ -708,8 +707,12 @@ static void nes_dealloc_pd(struct ib_pd *ibpd)
        struct nes_device *nesdev = nesvnic->nesdev;
        struct nes_adapter *nesadapter = nesdev->nesadapter;
 
-       if ((ibpd->uobject) && (ibpd->uobject->context)) {
-               nesucontext = to_nesucontext(ibpd->uobject->context);
+       if (udata) {
+               nesucontext =
+                       rdma_udata_to_drv_context(
+                               udata,
+                               struct nes_ucontext,
+                               ibucontext);
                nes_debug(NES_DBG_PD, "Clearing bit %u from allocated doorbells\n",
                                nespd->mmap_db_index);
                clear_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
@@ -1039,53 +1042,48 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
                                }
                                if (req.user_qp_buffer)
                                        nesqp->nesuqp_addr = req.user_qp_buffer;
-                               if (udata) {
-                                       nesqp->user_mode = 1;
-                                       if (virt_wqs) {
-                                               err = 1;
-                                               list_for_each_entry(nespbl, &nes_ucontext->qp_reg_mem_list, list) {
-                                                       if (nespbl->user_base == (unsigned long )req.user_wqe_buffers) {
-                                                               list_del(&nespbl->list);
-                                                               err = 0;
-                                                               nes_debug(NES_DBG_QP, "Found PBL for virtual QP. nespbl=%p. user_base=0x%lx\n",
-                                                                         nespbl, nespbl->user_base);
-                                                               break;
-                                                       }
-                                               }
-                                               if (err) {
-                                                       nes_debug(NES_DBG_QP, "Didn't Find PBL for virtual QP. address = %llx.\n",
-                                                                 (long long unsigned int)req.user_wqe_buffers);
-                                                       nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
-                                                       kfree(nesqp->allocated_buffer);
-                                                       return ERR_PTR(-EFAULT);
+
+                               nesqp->user_mode = 1;
+                               if (virt_wqs) {
+                                       err = 1;
+                                       list_for_each_entry(nespbl, &nes_ucontext->qp_reg_mem_list, list) {
+                                               if (nespbl->user_base == (unsigned long )req.user_wqe_buffers) {
+                                                       list_del(&nespbl->list);
+                                                       err = 0;
+                                                       nes_debug(NES_DBG_QP, "Found PBL for virtual QP. nespbl=%p. user_base=0x%lx\n",
+                                                                 nespbl, nespbl->user_base);
+                                                       break;
                                                }
                                        }
-
-                                       nesqp->mmap_sq_db_index =
-                                               find_next_zero_bit(nes_ucontext->allocated_wqs,
-                                                                  NES_MAX_USER_WQ_REGIONS, nes_ucontext->first_free_wq);
-                                       /* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
-                                                       nespd->mmap_db_index); */
-                                       if (nesqp->mmap_sq_db_index >= NES_MAX_USER_WQ_REGIONS) {
-                                               nes_debug(NES_DBG_QP,
-                                                         "db index > max user regions, failing create QP\n");
+                                       if (err) {
+                                               nes_debug(NES_DBG_QP, "Didn't Find PBL for virtual QP. address = %llx.\n",
+                                                         (long long unsigned int)req.user_wqe_buffers);
                                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
-                                               if (virt_wqs) {
-                                                       pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
-                                                                           nespbl->pbl_pbase);
-                                                       kfree(nespbl);
-                                               }
                                                kfree(nesqp->allocated_buffer);
-                                               return ERR_PTR(-ENOMEM);
+                                               return ERR_PTR(-EFAULT);
                                        }
-                                       set_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
-                                       nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = nesqp;
-                                       nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index + 1;
-                               } else {
+                               }
+
+                               nesqp->mmap_sq_db_index =
+                                       find_next_zero_bit(nes_ucontext->allocated_wqs,
+                                                          NES_MAX_USER_WQ_REGIONS, nes_ucontext->first_free_wq);
+                               /* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
+                                               nespd->mmap_db_index); */
+                               if (nesqp->mmap_sq_db_index >= NES_MAX_USER_WQ_REGIONS) {
+                                       nes_debug(NES_DBG_QP,
+                                                 "db index > max user regions, failing create QP\n");
                                        nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
+                                       if (virt_wqs) {
+                                               pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
+                                                                   nespbl->pbl_pbase);
+                                               kfree(nespbl);
+                                       }
                                        kfree(nesqp->allocated_buffer);
-                                       return ERR_PTR(-EFAULT);
+                                       return ERR_PTR(-ENOMEM);
                                }
+                               set_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
+                               nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = nesqp;
+                               nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index + 1;
                        }
                        err = (!virt_wqs) ? nes_setup_mmap_qp(nesqp, nesvnic, sq_size, rq_size) :
                                        nes_setup_virt_qp(nesqp, nespbl, nesvnic, sq_size, rq_size);
@@ -1303,7 +1301,7 @@ static void nes_clean_cq(struct nes_qp *nesqp, struct nes_cq *nescq)
 /**
  * nes_destroy_qp
  */
-static int nes_destroy_qp(struct ib_qp *ibqp)
+static int nes_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 {
        struct nes_qp *nesqp = to_nesqp(ibqp);
        struct nes_ucontext *nes_ucontext;
@@ -1343,8 +1341,12 @@ static int nes_destroy_qp(struct ib_qp *ibqp)
        }
 
        if (nesqp->user_mode) {
-               if ((ibqp->uobject)&&(ibqp->uobject->context)) {
-                       nes_ucontext = to_nesucontext(ibqp->uobject->context);
+               if (udata) {
+                       nes_ucontext =
+                               rdma_udata_to_drv_context(
+                                       udata,
+                                       struct nes_ucontext,
+                                       ibucontext);
                        clear_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
                        nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = NULL;
                        if (nes_ucontext->first_free_wq > nesqp->mmap_sq_db_index) {
@@ -1631,7 +1633,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev,
 /**
  * nes_destroy_cq
  */
-static int nes_destroy_cq(struct ib_cq *ib_cq)
+static int nes_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata)
 {
        struct nes_cq *nescq;
        struct nes_device *nesdev;
@@ -2382,7 +2384,7 @@ reg_user_mr_err:
 /**
  * nes_dereg_mr
  */
-static int nes_dereg_mr(struct ib_mr *ib_mr)
+static int nes_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
 {
        struct nes_mr *nesmr = to_nesmr(ib_mr);
        struct nes_vnic *nesvnic = to_nesvnic(ib_mr->device);