[ofa-general] RE: [PATCH] RDMA/nes: Encapsulate logic nes_put_cqp_request()

Faisal Latif flatif at NetEffect.com
Wed Jul 2 15:17:06 PDT 2008


Acked-by: Faisal Latif <flatif at neteffect.com>

Thanks
Faisal

> -----Original Message-----
> From: Roland Dreier [mailto:rdreier at cisco.com]
> Sent: Tuesday, July 01, 2008 11:07 PM
> To: Faisal Latif; Chien Tung; Glenn Streiff
> Cc: general at lists.openfabrics.org
> Subject: [PATCH] RDMA/nes: Encapsulate logic nes_put_cqp_request()
> 
> 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 at cisco.com>
> ---
> Here's a cleanup I'll queue for 2.6.27 if it's OK with you.
> 
>  drivers/infiniband/hw/nes/nes.h       |    4 +
>  drivers/infiniband/hw/nes/nes_hw.c    |   60 ++---------
>  drivers/infiniband/hw/nes/nes_utils.c |   24 ++++
>  drivers/infiniband/hw/nes/nes_verbs.c |  189
+++++--------------------
> -------
>  4 files changed, 66 insertions(+), 211 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/nes/nes.h
> b/drivers/infiniband/hw/nes/nes.h
> index 61b46e9..fe88bec 100644
> --- a/drivers/infiniband/hw/nes/nes.h
> +++ b/drivers/infiniband/hw/nes/nes.h
> @@ -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);
> diff --git a/drivers/infiniband/hw/nes/nes_hw.c
> b/drivers/infiniband/hw/nes/nes_hw.c
> index d3278f1..80e4866 100644
> --- a/drivers/infiniband/hw/nes/nes_hw.c
> +++ b/drivers/infiniband/hw/nes/nes_hw.c
> @@ -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);
>  	}
>  }
> diff --git a/drivers/infiniband/hw/nes/nes_utils.c
> b/drivers/infiniband/hw/nes/nes_utils.c
> index fe83d1b..82abe9b 100644
> --- a/drivers/infiniband/hw/nes/nes_utils.c
> +++ b/drivers/infiniband/hw/nes/nes_utils.c
> @@ -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
> diff --git a/drivers/infiniband/hw/nes/nes_verbs.c
> b/drivers/infiniband/hw/nes/nes_verbs.c
> index d617da9..464a98a 100644
> --- a/drivers/infiniband/hw/nes/nes_verbs.c
> +++ b/drivers/infiniband/hw/nes/nes_verbs.c
> @@ -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)
> --
> 1.5.6




More information about the general mailing list