Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ff66e8c authored by Roland Dreier's avatar Roland Dreier
Browse files

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: default avatarRoland Dreier <rolandd@cisco.com>
Acked-by: default avatarFaisal Latif <flatif@neteffect.com>
parent ee1e2c82
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);
+8 −52
Original line number Diff line number Diff line
@@ -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);
					nes_put_cqp_request(nesdev, 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 */
					if (cqp_request->callback)
						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);
					}
				} 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);
					}
					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);
	}
}
+24 −0
Original line number Diff line number Diff line
@@ -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
+30 −159
Original line number Diff line number Diff line
@@ -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) {
	if (!ret)
		err = -ETIME;
		} else {
	else if (cqp_request->major_code)
		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);
			}
		}
	}

	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",
					nescq->hw_cq.cq_number);
		ret = -ETIME;
		} else {
	} else if (cqp_request->major_code) {
		nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
					nescq->hw_cq.cq_number);
		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)