RDMA/cxgb4: Detach from the LLD after unregistering with the RDMA core.
Subsystems (2)
PATCH 1/11 RDMA/cxgb4: Detach from the LLD after unregistering with the RDMA core.
In the RDMA core unregister path, kernel users will be calling down into the T4 provider to release resources. So we cannot detach from the LLD until this process completes.
---
drivers/infiniband/hw/cxgb4/device.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/infiniband/hw/cxgb4/device.c +1 -3
@@ -504,14 +504,12 @@ static void __exit c4iw_exit_module(void) {struct c4iw_dev *dev, *tmp; -cxgb4_unregister_uld (CXGB4_ULD_RDMA ); -mutex_lock (&dev_mutex);list_for_each_entry_safe (dev, tmp, &dev_list, entry) {c4iw_remove (dev); }mutex_unlock (&dev_mutex); - +cxgb4_unregister_uld (CXGB4_ULD_RDMA );c4iw_cm_term ();debugfs_remove_recursive (c4iw_debugfs_root); }
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20100520215727.32394.90669.stgit-T4OLL4TyM9aNDNWfRnPdfg@public.gmane.org
PATCH 2/11 RDMA/cxgb4: register rdma provider based on LLD state_change events.
The LLD now supports proper UP state change events, so move the rdma provider registration to UP path.
NOTE: This fixes a crash when loading iw_cxgb4 _after_ the NFSRDMA transport is up and running.
---
drivers/infiniband/hw/cxgb4/device.c | 46 +++++++++++++++++++++++++------- drivers/infiniband/hw/cxgb4/iw_cxgb4.h | 1 + drivers/infiniband/hw/cxgb4/provider.c | 2 + 3 files changed, 39 insertions(+), 10 deletions(-)
drivers/infiniband/hw/cxgb4/device.c +36 -10
@@ -306,7 +306,8 @@ static void c4iw_remove(struct c4iw_dev *dev)PDBG ("%s c4iw_dev %p\n" , __func__, dev);cancel_delayed_work_sync (&dev->db_drop_task);list_del (&dev->entry); -c4iw_unregister_device (dev); +if (dev->registered) +c4iw_unregister_device (dev);c4iw_rdev_close (&dev->rdev);idr_destroy (&dev->cqidr);idr_destroy (&dev->qpidr);
@@ -343,12 +344,6 @@ static struct c4iw_dev *c4iw_alloc(const struct cxgb4_lld_info *infop)list_add_tail (&devp->entry, &dev_list);mutex_unlock (&dev_mutex); -if (c4iw_register_device (devp)) { - printk(KERN_ERR MOD "Unable to register device\n"); -mutex_lock (&dev_mutex); -c4iw_remove (devp); -mutex_unlock (&dev_mutex); - }if (c4iw_debugfs_root) { devp->debugfs_root = debugfs_create_dir( pci_name(devp->rdev.lldi.pdev),
@@ -379,9 +374,6 @@ static void *c4iw_uld_add(const struct cxgb4_lld_info *infop)for (i =0 ; i < dev->rdev.lldi.nrxq; i++)PDBG ("rxqid[%u] %u\n" , i, dev->rdev.lldi.rxq_ids[i]); - - printk(KERN_INFO MOD "Initialized device %s\n", - pci_name(dev->rdev.lldi.pdev)); out:return dev; }
@@ -471,7 +463,41 @@ nomem:static int c4iw_uld_state_change (void *handle,enum cxgb4_state new_state) { +struct c4iw_dev *dev = handle; +PDBG ("%s new_state %u\n" , __func__, new_state); +switch (new_state) { +case CXGB4_STATE_UP : + printk(KERN_INFO MOD "%s: Up\n", pci_name(dev->rdev.lldi.pdev)); +if (!dev->registered) { +int ret; + ret =c4iw_register_device (dev); +if (ret) + printk(KERN_ERR MOD +"%s: RDMA registration failed: %d\n" , +pci_name (dev->rdev.lldi.pdev), ret); + } +break ; +case CXGB4_STATE_DOWN : + printk(KERN_INFO MOD "%s: Down\n", + pci_name(dev->rdev.lldi.pdev)); +if (dev->registered) +c4iw_unregister_device (dev); +break ; +case CXGB4_STATE_START_RECOVERY : + printk(KERN_INFO MOD "%s: Fatal Error\n", + pci_name(dev->rdev.lldi.pdev)); +if (dev->registered) +c4iw_unregister_device (dev); +break ; +case CXGB4_STATE_DETACH : + printk(KERN_INFO MOD "%s: Detach\n", + pci_name(dev->rdev.lldi.pdev)); +mutex_lock (&dev_mutex); +c4iw_remove (dev); +mutex_unlock (&dev_mutex); +break ; + }return 0 ; }
drivers/infiniband/hw/cxgb4/iw_cxgb4.h +1 -0
@@ -152,6 +152,7 @@ struct c4iw_dev {struct list_head entry;struct delayed_work db_drop_task;struct dentry *debugfs_root; +u8 registered; };static inline struct c4iw_dev *to_c4iw_dev (struct ib_device *ibdev)
drivers/infiniband/hw/cxgb4/provider.c +2 -0
@@ -496,6 +496,7 @@ int c4iw_register_device(struct c4iw_dev *dev)if (ret) goto bail2; } + dev->registered =1 ;return 0 ; bail2:ib_unregister_device (&dev->ibdev);
@@ -514,5 +515,6 @@ void c4iw_unregister_device(struct c4iw_dev *dev) c4iw_class_attributes[i]);ib_unregister_device (&dev->ibdev);kfree (dev->ibdev.iwcm); + dev->registered =0 ;return ; }
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 3/11 RDMA/cxgb4: CQ size must be IQ size - 2.
In reply to a message not in the archive1 for the status page
1 to always have 1 free entry to detect full.
---
drivers/infiniband/hw/cxgb4/cq.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
drivers/infiniband/hw/cxgb4/cq.c +4 -1
@@ -780,6 +780,9 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,/* account for the status page. */ entries++; +/* IQ needs one extra entry to differentiate full vs empty. */ + entries++; +/* * entries must be multiple of 16 for HW. */
@@ -801,7 +804,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, chp->rhp = rhp; chp->cq.size--;/* status page */ - chp->ibcq.cqe = chp->cq.size; + chp->ibcq.cqe = chp->cq.size -1 ;spin_lock_init (&chp->lock);atomic_set (&chp->refcnt,1 );init_waitqueue_head (&chp->wait);
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20100520215738.32394.60360.stgit-T4OLL4TyM9aNDNWfRnPdfg@public.gmane.org
RE: [PATCH 03/11] RDMA/cxgb4: CQ size must be IQ size - 2.
Quoted 10 lines
/* account for the status page. */ entries++;drivers/infiniband/hw/cxgb4/cq.c +3
-0+/* IQ needs one extra entry to differentiate full vs empty. */ + entries++; +/* * entries must be multiple of 16 for HW. */
drivers/infiniband/hw/cxgb4/cq.c struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int · line 808
Quoted 6 lines
drivers/infiniband/hw/cxgb4/cq.c +1
-1@@ -801,7 +804,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, chp->rhp = rhp; chp->cq.size--;/* status page */ - chp->ibcq.cqe = chp->cq.size; + chp->ibcq.cqe = chp->cq.size -1 ;
Why does the status page adjust using size--, but we use size - 1 for the extra entry?
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 27BBA4336B784434AAE16BB1126AD59C-Zpru7NauK7drdx17CPfAsdBPR1lH4CV8@public.gmane.org
Re: [PATCH 03/11] RDMA/cxgb4: CQ size must be IQ size - 2.
Quoted 12 lines · Sean Hefty
Quoted 12 lines
/* account for the status page. */ entries++;drivers/infiniband/hw/cxgb4/cq.c +3
-0+/* IQ needs one extra entry to differentiate full vs empty. */ + entries++; +/* * entries must be multiple of 16 for HW. */(quoted diff) +0
-0@@ -801,7 +804,7 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,
Quoted 10 lines
drivers/infiniband/hw/cxgb4/cq.c struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,
Quoted 5 lines
drivers/infiniband/hw/cxgb4/cq.c +1
-1chp->rhp = rhp; chp->cq.size--;/* status page */ - chp->ibcq.cqe = chp->cq.size; + chp->ibcq.cqe = chp->cq.size -1 ;Why does the status page adjust using size--, but we use size - 1 for the extra entry?
chp->cq.size is the actual number of entries that can write-to by the HW. But since one must always be available to detect "full" vs "empty", we tell the ULP that the size is one less than that.
Steve.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 4/11 RDMA/cxgb4: Optimize CQ overflow detection.
In reply to a message not in the archive1) save the timestamp flit in the cq when we consume a CQE
2) always compare the saved flit with the previous entry flit when reading the next CQE entry. If the flits don't compare, then we have overflowed.
---
drivers/infiniband/hw/cxgb4/cq.c | 1 + drivers/infiniband/hw/cxgb4/t4.h | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 12 deletions(-)
drivers/infiniband/hw/cxgb4/cq.c +1 -0
@@ -373,6 +373,7 @@ static void create_read_req_cqe(struct t4_wq *wq, struct t4_cqe *hw_cqe,V_CQE_SWCQE (SW_CQE (hw_cqe)) |V_CQE_OPCODE (FW_RI_READ_REQ ) | V_CQE_TYPE(1)); + read_cqe->bits_type_ts = hw_cqe->bits_type_ts; }/*
drivers/infiniband/hw/cxgb4/t4.h +16 -12
@@ -434,7 +434,7 @@ struct t4_cq {struct c4iw_rdev *rdev;u64 ugts;size_t memsize; -u64 timestamp; +__be64 bits_type_ts;u32 cqid;u16 size;/* including status page */ u16 cidx;
@@ -487,6 +487,7 @@ static inline void t4_swcq_consume(struct t4_cq *cq)static inline void t4_hwcq_consume (struct t4_cq *cq) { + cq->bits_type_ts = cq->queue[cq->cidx].bits_type_ts; cq->cidx_inc++;if (++cq->cidx == cq->size) { cq->cidx =0 ;
@@ -501,20 +502,23 @@ static inline int t4_valid_cqe(struct t4_cq *cq, struct t4_cqe *cqe)static inline int t4_next_hw_cqe (struct t4_cq *cq,struct t4_cqe **cqe) { -int ret =0 ; -u64 bits_type_ts =be64_to_cpu (cq->queue[cq->cidx].bits_type_ts); +int ret; +u16 prev_cidx; -if (G_CQE_GENBIT (bits_type_ts) == cq->gen) { - *cqe = &cq->queue[cq->cidx]; - cq->timestamp =G_CQE_TS (bits_type_ts); - }else if (G_CQE_TS (bits_type_ts) > cq->timestamp) - ret = -EOVERFLOW ; +if (cq->cidx ==0 ) + prev_cidx = cq->size -1 ;else - ret = -ENODATA ; -if (ret == -EOVERFLOW ) { - printk(KERN_ERR MOD "cq overflow cqid %u\n", cq->cqid); + prev_cidx = cq->cidx -1 ; + +if (cq->queue[prev_cidx].bits_type_ts != cq->bits_type_ts) { + ret = -EOVERFLOW ; cq->error =1 ; - } + printk(KERN_ERR MOD "cq overflow cqid %u\n", cq->cqid); + }else if (t4_valid_cqe (cq, &cq->queue[cq->cidx])) { + *cqe = &cq->queue[cq->cidx]; + ret =0 ; + }else + ret = -ENODATA ;return ret; }
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 5/11 RDMA/cxgb4: Fix overflow bug in cq arm.
In reply to a message not in the archive- wrap cq->cqidx_inc based on cq size.
- optimize t4_arm_cq logic.
---
drivers/infiniband/hw/cxgb4/t4.h | 31 ++++++++++++------------------- 1 files changed, 12 insertions(+), 19 deletions(-)
drivers/infiniband/hw/cxgb4/t4.h +12 -19
@@ -449,25 +449,17 @@ struct t4_cq {static inline int t4_arm_cq (struct t4_cq *cq,int se) {u32 val; -u16 inc; - -do { -/* -* inc must be less the both the max update value -and- -* the size of the CQ. -*/ - inc = cq->cidx_inc <=CIDXINC_MASK ? cq->cidx_inc : -CIDXINC_MASK ; - inc = inc <= (cq->size -1 ) ? inc : (cq->size -1 ); -if (inc == cq->cidx_inc) - val =SEINTARM (se) |CIDXINC (inc) |TIMERREG (6 ) | -INGRESSQID (cq->cqid); -else - val =SEINTARM (0 ) |CIDXINC (inc) |TIMERREG (7 ) | -INGRESSQID (cq->cqid); - cq->cidx_inc -= inc; + +while (cq->cidx_inc >CIDXINC_MASK ) { + val =SEINTARM (0 ) |CIDXINC (CIDXINC_MASK ) |TIMERREG (7 ) | +INGRESSQID (cq->cqid);writel (val, cq->gts); - }while (cq->cidx_inc); + cq->cidx_inc -=CIDXINC_MASK ; + } + val =SEINTARM (se) |CIDXINC (cq->cidx_inc) |TIMERREG (6 ) | +INGRESSQID (cq->cqid); +writel (val, cq->gts); + cq->cidx_inc =0 ;return 0 ; }
@@ -488,7 +480,8 @@ static inline void t4_swcq_consume(struct t4_cq *cq)static inline void t4_hwcq_consume (struct t4_cq *cq) { cq->bits_type_ts = cq->queue[cq->cidx].bits_type_ts; - cq->cidx_inc++; +if (++cq->cidx_inc == cq->size) + cq->cidx_inc =0 ;if (++cq->cidx == cq->size) { cq->cidx =0 ; cq->gen ^=1 ;
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 6/11 RDMA/cxgb4: Return proper errors in fastreg mr/pbl allocation.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/mem.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-)
drivers/infiniband/hw/cxgb4/mem.c +6 -2
@@ -712,8 +712,10 @@ struct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth) php =to_c4iw_pd (pd); rhp = php->rhp; mhp =kzalloc (sizeof (*mhp),GFP_KERNEL ); -if (!mhp) +if (!mhp) { + ret = -ENOMEM ; goto err; + } mhp->rhp = rhp; ret =alloc_pbl (mhp, pbl_depth);
@@ -730,8 +732,10 @@ struct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth) mhp->attr.state =1 ; mmid = (stag) >>8 ; mhp->ibmr.rkey = mhp->ibmr.lkey = stag; -if (insert_handle (rhp, &rhp->mmidr, mhp, mmid)) +if (insert_handle (rhp, &rhp->mmidr, mhp, mmid)) { + ret = -ENOMEM ; goto err3; + }PDBG ("%s mmid 0x%x mhp %p stag 0x%x\n" , __func__, mmid, mhp, stag);return &(mhp->ibmr);
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 7/11 RDMA/cxgb4: Don't limit fastreg page list depth.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/mem.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
drivers/infiniband/hw/cxgb4/mem.c +0 -3
@@ -759,9 +759,6 @@ struct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl(struct ib_device *device,dma_addr_t dma_addr;int size =sizeof *c4pl + page_list_len *sizeof (u64); -if (page_list_len >T4_MAX_FR_DEPTH ) -return ERR_PTR (-EINVAL ); - c4pl =dma_alloc_coherent (&dev->rdev.lldi.pdev->dev, size, &dma_addr,GFP_KERNEL );if (!c4pl)
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 8/11 RDMA/cxgb4: Update some HW limits.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/t4.h | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-)
drivers/infiniband/hw/cxgb4/t4.h +9 -8
@@ -41,11 +41,13 @@#define T4_MAX_NUM_QP (1<<16)#define T4_MAX_NUM_CQ (1<<15)#define T4_MAX_NUM_PD (1<<15) -#define T4_MAX_PBL_SIZE 256 -#define T4_MAX_RQ_SIZE 1024 -#define T4_MAX_SQ_SIZE 1024 -#define T4_MAX_QP_DEPTH (T4_MAX_RQ_SIZE-1) -#define T4_MAX_CQ_DEPTH 8192 +#define T4_EQ_STATUS_ENTRIES (L1_CACHE_BYTES > 64 ? 2 : 1) +#define T4_MAX_EQ_SIZE (65520 - T4_EQ_STATUS_ENTRIES) +#define T4_MAX_IQ_SIZE (65520 - 1) +#define T4_MAX_RQ_SIZE (8192 - T4_EQ_STATUS_ENTRIES) +#define T4_MAX_SQ_SIZE (T4_MAX_EQ_SIZE - 1) +#define T4_MAX_QP_DEPTH (T4_MAX_RQ_SIZE - 1) +#define T4_MAX_CQ_DEPTH (T4_MAX_IQ_SIZE - 1)#define T4_MAX_NUM_STAG (1<<15)#define T4_MAX_MR_SIZE (~0ULL - 1)#define T4_PAGESIZE_MASK 0xffff000/* 4KB-128MB */
@@ -79,12 +81,11 @@ struct t4_status_page { sizeof(struct fw_ri_isgl)) / sizeof(struct fw_ri_sge))#define T4_MAX_FR_IMMD ((T4_SQ_NUM_BYTES - sizeof(struct fw_ri_fr_nsmr_wr) - \ sizeof(struct fw_ri_immd))) -#define T4_MAX_FR_DEPTH 255 +#define T4_MAX_FR_DEPTH (T4_MAX_FR_IMMD / sizeof(u64))#define T4_RQ_NUM_SLOTS 2#define T4_RQ_NUM_BYTES (T4_EQ_SIZE * T4_RQ_NUM_SLOTS) -#define T4_MAX_RECV_SGE ((T4_RQ_NUM_BYTES - sizeof(struct fw_ri_recv_wr) - \ - sizeof(struct fw_ri_isgl)) / sizeof(struct fw_ri_sge)) +#define T4_MAX_RECV_SGE 4union t4_wr {struct fw_ri_res_wr res;
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 9/11 RDMA/cxgb4: Set fence flag for inv-local-stag work requests.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/qp.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/infiniband/hw/cxgb4/qp.c +2 -0
@@ -588,6 +588,8 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, err =build_fastreg (wqe, wr, &len16);break ;case IB_WR_LOCAL_INV : +if (wr->send_flags &IB_SEND_FENCE ) + fw_flags |=FW_RI_LOCAL_FENCE_FLAG ; fw_opcode =FW_RI_INV_LSTAG_WR ; swsqe->opcode =FW_RI_LOCAL_INV ; err =build_inv_stag (wqe, wr, &len16);
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 10/11 RDMA/cxgb4: Support IB_WR_READ_WITH_INV opcode.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/qp.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
drivers/infiniband/hw/cxgb4/qp.c +5 -1
@@ -572,9 +572,13 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, err =build_rdma_write (wqe, wr, &len16);break ;case IB_WR_RDMA_READ : +case IB_WR_RDMA_READ_WITH_INV : fw_opcode =FW_RI_RDMA_READ_WR ; swsqe->opcode =FW_RI_READ_REQ ; - fw_flags =0 ; +if (wr->opcode ==IB_WR_RDMA_READ_WITH_INV ) + fw_flags |=FW_RI_RDMA_READ_INVALIDATE ; +else + fw_flags =0 ; err =build_rdma_read (wqe, wr, &len16);if (err)break ;
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 11/11 RDMA/cxgb4: Only insert sq qid in lookup table.
In reply to a message not in the archive---
drivers/infiniband/hw/cxgb4/qp.c | 25 +++++++++---------------- 1 files changed, 9 insertions(+), 16 deletions(-)
drivers/infiniband/hw/cxgb4/qp.c +9 -16
@@ -1345,7 +1345,6 @@ int c4iw_destroy_qp(struct ib_qp *ib_qp)wait_event (qhp->wait, !qhp->ep);remove_handle (rhp, &rhp->qpidr, qhp->wq.sq.qid); -remove_handle (rhp, &rhp->qpidr, qhp->wq.rq.qid);atomic_dec (&qhp->refcnt);wait_event (qhp->wait, !atomic_read (&qhp->refcnt));
@@ -1448,30 +1447,26 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,if (ret) goto err2; - ret =insert_handle (rhp, &rhp->qpidr, qhp, qhp->wq.rq.qid); -if (ret) - goto err3; -if (udata) { mm1 =kmalloc (sizeof *mm1,GFP_KERNEL );if (!mm1) { ret = -ENOMEM ; - goto err4; + goto err3; } mm2 =kmalloc (sizeof *mm2,GFP_KERNEL );if (!mm2) { ret = -ENOMEM ; - goto err5; + goto err4; } mm3 =kmalloc (sizeof *mm3,GFP_KERNEL );if (!mm3) { ret = -ENOMEM ; - goto err6; + goto err5; } mm4 =kmalloc (sizeof *mm4,GFP_KERNEL );if (!mm4) { ret = -ENOMEM ; - goto err7; + goto err6; } uresp.qid_mask = rhp->rdev.qpmask;
@@ -1493,7 +1488,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,spin_unlock (&ucontext->mmap_lock); ret =ib_copy_to_udata (udata, &uresp,sizeof uresp);if (ret) - goto err8; + goto err7; mm1->key = uresp.sq_key; mm1->addr =virt_to_phys (qhp->wq.sq.queue); mm1->len =PAGE_ALIGN (qhp->wq.sq.memsize);
@@ -1517,16 +1512,14 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs, __func__, qhp, qhp->attr.sq_num_entries, qhp->attr.rq_num_entries, qhp->wq.sq.qid);return &qhp->ibqp; -err8: -kfree (mm4); err7: -kfree (mm3); +kfree (mm4); err6: -kfree (mm2); +kfree (mm3); err5: -kfree (mm1); +kfree (mm2); err4: -remove_handle (rhp, &rhp->qpidr, qhp->wq.rq.qid); +kfree (mm1); err3:remove_handle (rhp, &rhp->qpidr, qhp->wq.sq.qid); err2:
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Roland Dreier
Appliedthanks, applied all 11.
Signature · 6 lines
Roland Dreier <[email protected]> || For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/index.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html