RDMA/nes: Encapsulate logic nes_put_cqp_request()
authorRoland Dreier <rolandd@cisco.com>
Tue, 15 Jul 2008 06:48:49 +0000 (23:48 -0700)
committerRoland Dreier <rolandd@cisco.com>
Tue, 15 Jul 2008 06:48:49 +0000 (23:48 -0700)
The iw_nes driver repeats the logic

if (atomic_dec_and_test(&cqp_request->refcount)) {
if (cqp_request->dynamic) {
kfree(cqp_request);
} else {
spin_lock_irqsave(&nesdev->cqp.lock, flags);
list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
}
}

over and over.  Wrap this up in functions nes_free_cqp_request() and
nes_put_cqp_request() to simplify such code.

In addition to making the source smaller and more readable, this shrinks
the compiled code quite a bit:

add/remove: 2/0 grow/shrink: 0/13 up/down: 164/-1692 (-1528)
function                                     old     new   delta
nes_free_cqp_request                           -     147    +147
nes_put_cqp_request                            -      17     +17
nes_modify_qp                               2316    2293     -23
nes_hw_modify_qp                             737     657     -80
nes_dereg_mr                                 945     860     -85
flush_wqes                                   501     416     -85
nes_manage_apbvt                             648     560     -88
nes_reg_mr                                  1117    1026     -91
nes_cqp_ce_handler                           927     769    -158
nes_alloc_mw                                1052     884    -168
nes_create_qp                               5314    5141    -173
nes_alloc_fmr                               2212    2035    -177
nes_destroy_cq                              1097     918    -179
nes_create_cq                               2787    2598    -189
nes_dealloc_mw                               762     566    -196

Signed-off-by: Roland Dreier <rolandd@cisco.com>
Acked-by: Faisal Latif <flatif@neteffect.com>
drivers/infiniband/hw/nes/nes.h
drivers/infiniband/hw/nes/nes_hw.c
drivers/infiniband/hw/nes/nes_utils.c
drivers/infiniband/hw/nes/nes_verbs.c

index 61b46e9c7d2d5ed079acad11ec9ec3f836263280..fe88bec48949caecdca110c52fe6512fcf6935fc 100644 (file)
@@ -538,6 +538,10 @@ void nes_read_1G_phy_reg(struct nes_device *, u8, u8, u16 *);
 void nes_write_10G_phy_reg(struct nes_device *, u16, u8, u16, u16);
 void nes_read_10G_phy_reg(struct nes_device *, u8, u8, u16);
 struct nes_cqp_request *nes_get_cqp_request(struct nes_device *);
+void nes_free_cqp_request(struct nes_device *nesdev,
+                         struct nes_cqp_request *cqp_request);
+void nes_put_cqp_request(struct nes_device *nesdev,
+                        struct nes_cqp_request *cqp_request);
 void nes_post_cqp_request(struct nes_device *, struct nes_cqp_request *, int);
 int nes_arp_table(struct nes_device *, u32, u8 *, u32);
 void nes_mh_fix(unsigned long);
index d3278f111ca7dcba33bf5b12de3c01d337309122..80e486653ec966d8b84322f8642f2146a9ccc28b 100644 (file)
@@ -2710,39 +2710,11 @@ static void nes_cqp_ce_handler(struct nes_device *nesdev, struct nes_hw_cq *cq)
                                        barrier();
                                        cqp_request->request_done = 1;
                                        wake_up(&cqp_request->waitq);
-                                       if (atomic_dec_and_test(&cqp_request->refcount)) {
-                                               nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
-                                                               cqp_request,
-                                                               le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX])&0x3f);
-                                               if (cqp_request->dynamic) {
-                                                       kfree(cqp_request);
-                                               } else {
-                                                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                               }
-                                       }
-                               } else if (cqp_request->callback) {
-                                       /* Envoke the callback routine */
-                                       cqp_request->cqp_callback(nesdev, cqp_request);
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
+                                       nes_put_cqp_request(nesdev, cqp_request);
                                } else {
-                                       nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
-                                                       cqp_request,
-                                                       le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f);
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
+                                       if (cqp_request->callback)
+                                               cqp_request->cqp_callback(nesdev, cqp_request);
+                                       nes_free_cqp_request(nesdev, cqp_request);
                                }
                        } else {
                                wake_up(&nesdev->cqp.waitq);
@@ -3149,7 +3121,6 @@ int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
 {
        struct nes_device *nesdev = nesvnic->nesdev;
        struct nes_hw_cqp_wqe *cqp_wqe;
-       unsigned long flags;
        struct nes_cqp_request *cqp_request;
        int ret = 0;
        u16 major_code;
@@ -3184,15 +3155,9 @@ int nes_manage_apbvt(struct nes_vnic *nesvnic, u32 accel_local_port,
        nes_debug(NES_DBG_QP, "Completed, ret=%u,  CQP Major:Minor codes = 0x%04X:0x%04X\n",
                        ret, cqp_request->major_code, cqp_request->minor_code);
        major_code = cqp_request->major_code;
-       if (atomic_dec_and_test(&cqp_request->refcount)) {
-               if (cqp_request->dynamic) {
-                       kfree(cqp_request);
-               } else {
-                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-               }
-       }
+
+       nes_put_cqp_request(nesdev, cqp_request);
+
        if (!ret)
                return -ETIME;
        else if (major_code)
@@ -3262,7 +3227,6 @@ void nes_manage_arp_cache(struct net_device *netdev, unsigned char *mac_addr,
 void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
                u32 which_wq, u32 wait_completion)
 {
-       unsigned long flags;
        struct nes_cqp_request *cqp_request;
        struct nes_hw_cqp_wqe *cqp_wqe;
        int ret;
@@ -3294,14 +3258,6 @@ void flush_wqes(struct nes_device *nesdev, struct nes_qp *nesqp,
                nes_debug(NES_DBG_QP, "Flush SQ QP WQEs completed, ret=%u,"
                                " CQP Major:Minor codes = 0x%04X:0x%04X\n",
                                ret, cqp_request->major_code, cqp_request->minor_code);
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+               nes_put_cqp_request(nesdev, cqp_request);
        }
 }
index fe83d1b2b177161a395ed826a7521181834ab8c2..8f519c860872b5bc44d29bc20d502d502dafcd2f 100644 (file)
@@ -567,6 +567,30 @@ struct nes_cqp_request *nes_get_cqp_request(struct nes_device *nesdev)
        return cqp_request;
 }
 
+void nes_free_cqp_request(struct nes_device *nesdev,
+                         struct nes_cqp_request *cqp_request)
+{
+       unsigned long flags;
+
+       nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
+                 cqp_request,
+                 le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f);
+
+       if (cqp_request->dynamic) {
+               kfree(cqp_request);
+       } else {
+               spin_lock_irqsave(&nesdev->cqp.lock, flags);
+               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
+               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
+       }
+}
+
+void nes_put_cqp_request(struct nes_device *nesdev,
+                        struct nes_cqp_request *cqp_request)
+{
+       if (atomic_dec_and_test(&cqp_request->refcount))
+               nes_free_cqp_request(nesdev, cqp_request);
+}
 
 /**
  * nes_post_cqp_request
index d617da9bd35125fe510dd4b7aa9a7332f4066bce..464a98a6e119390b2aee9d9b7c5a407081a60d20 100644 (file)
@@ -55,7 +55,6 @@ static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev);
  * nes_alloc_mw
  */
 static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
-       unsigned long flags;
        struct nes_pd *nespd = to_nespd(ibpd);
        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
        struct nes_device *nesdev = nesvnic->nesdev;
@@ -128,15 +127,7 @@ static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
        if ((!ret) || (cqp_request->major_code)) {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+               nes_put_cqp_request(nesdev, cqp_request);
                kfree(nesmr);
                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
                if (!ret) {
@@ -144,17 +135,8 @@ static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
                } else {
                        return ERR_PTR(-ENOMEM);
                }
-       } else {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
        }
+       nes_put_cqp_request(nesdev, cqp_request);
 
        nesmr->ibmw.rkey = stag;
        nesmr->mode = IWNES_MEMREG_TYPE_MW;
@@ -178,7 +160,6 @@ static int nes_dealloc_mw(struct ib_mw *ibmw)
        struct nes_hw_cqp_wqe *cqp_wqe;
        struct nes_cqp_request *cqp_request;
        int err = 0;
-       unsigned long flags;
        int ret;
 
        /* Deallocate the window with the adapter */
@@ -204,32 +185,12 @@ static int nes_dealloc_mw(struct ib_mw *ibmw)
        nes_debug(NES_DBG_MR, "Deallocate STag completed, wait_event_timeout ret = %u,"
                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
                        ret, cqp_request->major_code, cqp_request->minor_code);
-       if ((!ret) || (cqp_request->major_code)) {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
-               if (!ret) {
-                       err = -ETIME;
-               } else {
-                       err = -EIO;
-               }
-       } else {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
-       }
+       if (!ret)
+               err = -ETIME;
+       else if (cqp_request->major_code)
+               err = -EIO;
+
+       nes_put_cqp_request(nesdev, cqp_request);
 
        nes_free_resource(nesadapter, nesadapter->allocated_mrs,
                        (ibmw->rkey & 0x0fffff00) >> 8);
@@ -526,29 +487,11 @@ static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
 
        if ((!ret) || (cqp_request->major_code)) {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+               nes_put_cqp_request(nesdev, cqp_request);
                ret = (!ret) ? -ETIME : -EIO;
                goto failed_leaf_vpbl_pages_alloc;
-       } else {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
        }
-
+       nes_put_cqp_request(nesdev, cqp_request);
        nesfmr->nesmr.ibfmr.lkey = stag;
        nesfmr->nesmr.ibfmr.rkey = stag;
        nesfmr->attr = *ibfmr_attr;
@@ -1487,15 +1430,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
                                        nesqp->hwqp.qp_id, ret, nesdev->cqp.sq_head, nesdev->cqp.sq_tail,
                                        cqp_request->major_code, cqp_request->minor_code);
                        if ((!ret) || (cqp_request->major_code)) {
-                               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
-                               }
+                               nes_put_cqp_request(nesdev, cqp_request);
                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
                                nes_free_qp_mem(nesdev, nesqp,virt_wqs);
                                kfree(nesqp->allocated_buffer);
@@ -1504,18 +1439,10 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
                                } else {
                                        return ERR_PTR(-EIO);
                                }
-                       } else {
-                               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                                       if (cqp_request->dynamic) {
-                                               kfree(cqp_request);
-                                       } else {
-                                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                                       }
-                               }
                        }
 
+                       nes_put_cqp_request(nesdev, cqp_request);
+
                        if (ibpd->uobject) {
                                uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
                                uresp.actual_sq_size = sq_size;
@@ -1827,32 +1754,15 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
        nes_debug(NES_DBG_CQ, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
                        nescq->hw_cq.cq_number, ret);
        if ((!ret) || (cqp_request->major_code)) {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+               nes_put_cqp_request(nesdev, cqp_request);
                if (!context)
                        pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
                                        nescq->hw_cq.cq_pbase);
                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
                kfree(nescq);
                return ERR_PTR(-EIO);
-       } else {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
        }
+       nes_put_cqp_request(nesdev, cqp_request);
 
        if (context) {
                /* free the nespbl */
@@ -1942,37 +1852,18 @@ static int nes_destroy_cq(struct ib_cq *ib_cq)
                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
                        nescq->hw_cq.cq_number, ret, cqp_request->major_code,
                        cqp_request->minor_code);
-       if ((!ret) || (cqp_request->major_code)) {
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
-               if (!ret) {
-                       nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
+       if (!ret) {
+               nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
                                        nescq->hw_cq.cq_number);
-                       ret = -ETIME;
-               } else {
-                       nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
+               ret = -ETIME;
+       } else if (cqp_request->major_code) {
+               nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
                                        nescq->hw_cq.cq_number);
-                       ret = -EIO;
-               }
+               ret = -EIO;
        } else {
                ret = 0;
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
        }
+       nes_put_cqp_request(nesdev, cqp_request);
 
        if (nescq->cq_mem_size)
                pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size,
@@ -2105,15 +1996,8 @@ static int nes_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
        major_code = cqp_request->major_code;
-       if (atomic_dec_and_test(&cqp_request->refcount)) {
-               if (cqp_request->dynamic) {
-                       kfree(cqp_request);
-               } else {
-                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-               }
-       }
+       nes_put_cqp_request(nesdev, cqp_request);
+
        if (!ret)
                return -ETIME;
        else if (major_code)
@@ -2771,15 +2655,9 @@ static int nes_dereg_mr(struct ib_mr *ib_mr)
 
        major_code = cqp_request->major_code;
        minor_code = cqp_request->minor_code;
-       if (atomic_dec_and_test(&cqp_request->refcount)) {
-               if (cqp_request->dynamic) {
-                       kfree(cqp_request);
-               } else {
-                       spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                       list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                       spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-               }
-       }
+
+       nes_put_cqp_request(nesdev, cqp_request);
+
        if (!ret) {
                nes_debug(NES_DBG_MR, "Timeout waiting to destroy STag,"
                                " ib_mr=%p, rkey = 0x%08X\n",
@@ -2904,7 +2782,6 @@ int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
        /* struct iw_cm_id *cm_id = nesqp->cm_id; */
        /* struct iw_cm_event cm_event; */
        struct nes_cqp_request *cqp_request;
-       unsigned long flags;
        int ret;
        u16 major_code;
 
@@ -2950,15 +2827,9 @@ int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
                                        nesqp->hwqp.qp_id, cqp_request->major_code,
                                        cqp_request->minor_code, next_iwarp_state);
                }
-               if (atomic_dec_and_test(&cqp_request->refcount)) {
-                       if (cqp_request->dynamic) {
-                               kfree(cqp_request);
-                       } else {
-                               spin_lock_irqsave(&nesdev->cqp.lock, flags);
-                               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
-                               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
-                       }
-               }
+
+               nes_put_cqp_request(nesdev, cqp_request);
+
                if (!ret)
                        return -ETIME;
                else if (major_code)