* [git pull] InfiniBand fixes
@ 2005-09-20 22:08 Roland Dreier
2005-09-20 22:08 ` [PATCH 01/10] IPoIB: fix module removal race Roland Dreier
0 siblings, 1 reply; 11+ messages in thread
From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw)
To: torvalds; +Cc: linux-kernel, openib-general
Linus, please pull from
master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
This tree is also available from kernel.org mirrors at:
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/roland/infiniband.git
This will pull the following changes (patches also sent as replies to this email):
Hal Rosenstock:
IPoIB: Fix SA client retransmission strategy
IB: Fix data length for RMPP SA sends
Michael S. Tsirkin:
IPoIB: fix module removal race
IB/mthca: Fix device removal memory leak
Roland Dreier:
IB/mthca: assign ACK timeout field correctly
IB/mthca: fix posting of first work request
IB/mthca: Initialize eq->nent before we use it
IB/mthca: Fix posting work requests to shared receive queues
IB/mthca: Don't try to set srq->last for userspace SRQs
IPoIB: Don't flush workqueue from within workqueue
drivers/infiniband/core/user_mad.c | 5 +-
drivers/infiniband/hw/mthca/mthca_eq.c | 16 ++------
drivers/infiniband/hw/mthca/mthca_qp.c | 51 +++++++++++-------------
drivers/infiniband/hw/mthca/mthca_srq.c | 25 +++++-------
drivers/infiniband/ulp/ipoib/ipoib.h | 2 -
drivers/infiniband/ulp/ipoib/ipoib_ib.c | 4 +-
drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 +
drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 13 +++---
8 files changed, 55 insertions(+), 63 deletions(-)
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 01/10] IPoIB: fix module removal race 2005-09-20 22:08 [git pull] InfiniBand fixes Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 02/10] IB/mthca: assign ACK timeout field correctly Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general From: Michael S. Tsirkin <mst@mellanox.co.il> Since ipoib uses queue_delayed_work to run flush task on port state events, it must flush scheduled work after unregistering the event handler. Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) b21607256f3370b9eba48cd0b67e8686c6b51a64 diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -1005,6 +1005,7 @@ debug_failed: register_failed: ib_unregister_event_handler(&priv->event_handler); + flush_scheduled_work(); event_failed: ipoib_dev_cleanup(priv->dev); @@ -1057,6 +1058,7 @@ static void ipoib_remove_one(struct ib_d list_for_each_entry_safe(priv, tmp, dev_list, list) { ib_unregister_event_handler(&priv->event_handler); + flush_scheduled_work(); unregister_netdev(priv->dev); ipoib_dev_cleanup(priv->dev); ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 02/10] IB/mthca: assign ACK timeout field correctly 2005-09-20 22:08 ` [PATCH 01/10] IPoIB: fix module removal race Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 03/10] IB/mthca: fix posting of first work request Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general The hardware reads the ACK timeout field from the most significant 5 bits of struct mthca_qp_path's ackto field, not the least significant bits. This fix has the driver put the timeout in the right place. Without this, we get a timeout that is 2^8 times too small. Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_qp.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) 6fd9dccd77024ea85b65aa3e8f1cce22caa0d578 diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c @@ -687,7 +687,7 @@ int mthca_modify_qp(struct ib_qp *ibqp, } if (attr_mask & IB_QP_TIMEOUT) { - qp_context->pri_path.ackto = attr->timeout; + qp_context->pri_path.ackto = attr->timeout << 3; qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_ACK_TIMEOUT); } ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 03/10] IB/mthca: fix posting of first work request 2005-09-20 22:08 ` [PATCH 02/10] IB/mthca: assign ACK timeout field correctly Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 04/10] IPoIB: Fix SA client retransmission strategy Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general Fix posting first WQE for mem-free HCAs: we need to link to previous WQE even in that case. While we're at it, simplify code for Tavor-mode HCAs. We don't really need the conditional test there either; we can similarly always link to the previous WQE. Based on Michael S. Tsirkin's analogous fix for userspace libmthca. Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_qp.c | 48 ++++++++++++++----------------- drivers/infiniband/hw/mthca/mthca_srq.c | 14 ++++----- 2 files changed, 28 insertions(+), 34 deletions(-) bfb454be124d30e9bd140d9c6ef6aec549f4d293 diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c @@ -227,7 +227,6 @@ static void mthca_wq_init(struct mthca_w wq->last_comp = wq->max - 1; wq->head = 0; wq->tail = 0; - wq->last = NULL; } void mthca_qp_event(struct mthca_dev *dev, u32 qpn, @@ -1103,6 +1102,9 @@ static int mthca_alloc_qp_common(struct } } + qp->sq.last = get_send_wqe(qp, qp->sq.max - 1); + qp->rq.last = get_recv_wqe(qp, qp->rq.max - 1); + return 0; } @@ -1583,15 +1585,13 @@ int mthca_tavor_post_send(struct ib_qp * goto out; } - if (prev_wqe) { - ((struct mthca_next_seg *) prev_wqe)->nda_op = - cpu_to_be32(((ind << qp->sq.wqe_shift) + - qp->send_wqe_offset) | - mthca_opcode[wr->opcode]); - wmb(); - ((struct mthca_next_seg *) prev_wqe)->ee_nds = - cpu_to_be32((size0 ? 0 : MTHCA_NEXT_DBD) | size); - } + ((struct mthca_next_seg *) prev_wqe)->nda_op = + cpu_to_be32(((ind << qp->sq.wqe_shift) + + qp->send_wqe_offset) | + mthca_opcode[wr->opcode]); + wmb(); + ((struct mthca_next_seg *) prev_wqe)->ee_nds = + cpu_to_be32((size0 ? 0 : MTHCA_NEXT_DBD) | size); if (!size0) { size0 = size; @@ -1688,13 +1688,11 @@ int mthca_tavor_post_receive(struct ib_q qp->wrid[ind] = wr->wr_id; - if (likely(prev_wqe)) { - ((struct mthca_next_seg *) prev_wqe)->nda_op = - cpu_to_be32((ind << qp->rq.wqe_shift) | 1); - wmb(); - ((struct mthca_next_seg *) prev_wqe)->ee_nds = - cpu_to_be32(MTHCA_NEXT_DBD | size); - } + ((struct mthca_next_seg *) prev_wqe)->nda_op = + cpu_to_be32((ind << qp->rq.wqe_shift) | 1); + wmb(); + ((struct mthca_next_seg *) prev_wqe)->ee_nds = + cpu_to_be32(MTHCA_NEXT_DBD | size); if (!size0) size0 = size; @@ -1905,15 +1903,13 @@ int mthca_arbel_post_send(struct ib_qp * goto out; } - if (likely(prev_wqe)) { - ((struct mthca_next_seg *) prev_wqe)->nda_op = - cpu_to_be32(((ind << qp->sq.wqe_shift) + - qp->send_wqe_offset) | - mthca_opcode[wr->opcode]); - wmb(); - ((struct mthca_next_seg *) prev_wqe)->ee_nds = - cpu_to_be32(MTHCA_NEXT_DBD | size); - } + ((struct mthca_next_seg *) prev_wqe)->nda_op = + cpu_to_be32(((ind << qp->sq.wqe_shift) + + qp->send_wqe_offset) | + mthca_opcode[wr->opcode]); + wmb(); + ((struct mthca_next_seg *) prev_wqe)->ee_nds = + cpu_to_be32(MTHCA_NEXT_DBD | size); if (!size0) { size0 = size; diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c @@ -189,7 +189,6 @@ int mthca_alloc_srq(struct mthca_dev *de srq->max = attr->max_wr; srq->max_gs = attr->max_sge; - srq->last = NULL; srq->counter = 0; if (mthca_is_memfree(dev)) @@ -264,6 +263,7 @@ int mthca_alloc_srq(struct mthca_dev *de srq->first_free = 0; srq->last_free = srq->max - 1; + srq->last = get_wqe(srq, srq->max - 1); return 0; @@ -446,13 +446,11 @@ int mthca_tavor_post_srq_recv(struct ib_ ((struct mthca_data_seg *) wqe)->addr = 0; } - if (likely(prev_wqe)) { - ((struct mthca_next_seg *) prev_wqe)->nda_op = - cpu_to_be32((ind << srq->wqe_shift) | 1); - wmb(); - ((struct mthca_next_seg *) prev_wqe)->ee_nds = - cpu_to_be32(MTHCA_NEXT_DBD); - } + ((struct mthca_next_seg *) prev_wqe)->nda_op = + cpu_to_be32((ind << srq->wqe_shift) | 1); + wmb(); + ((struct mthca_next_seg *) prev_wqe)->ee_nds = + cpu_to_be32(MTHCA_NEXT_DBD); srq->wrid[ind] = wr->wr_id; srq->first_free = next_ind; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 04/10] IPoIB: Fix SA client retransmission strategy 2005-09-20 22:08 ` [PATCH 03/10] IB/mthca: fix posting of first work request Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 05/10] IB/mthca: Initialize eq->nent before we use it Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general From: Hal Rosenstock <halr@voltaire.com> We got a little mixed up with what the backoff member holds in the IPoIB multicast group structure: sometimes it was used as a number of seconds, and sometimes it was used as a number of jiffies. Fix the code so that backoff is always in seconds. Signed-off-by: Hal Rosenstock <halr@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) d24ef0519e081774db6a1515ad8dadefd3fcd508 diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c @@ -145,7 +145,7 @@ static struct ipoib_mcast *ipoib_mcast_a mcast->dev = dev; mcast->created = jiffies; - mcast->backoff = HZ; + mcast->backoff = 1; mcast->logcount = 0; INIT_LIST_HEAD(&mcast->list); @@ -396,7 +396,7 @@ static void ipoib_mcast_join_complete(in IPOIB_GID_ARG(mcast->mcmember.mgid), status); if (!status && !ipoib_mcast_join_finish(mcast, mcmember)) { - mcast->backoff = HZ; + mcast->backoff = 1; down(&mcast_mutex); if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) queue_work(ipoib_workqueue, &priv->mcast_task); @@ -496,7 +496,7 @@ static void ipoib_mcast_join(struct net_ if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) queue_delayed_work(ipoib_workqueue, &priv->mcast_task, - mcast->backoff); + mcast->backoff * HZ); up(&mcast_mutex); } else mcast->query_id = ret; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 05/10] IB/mthca: Initialize eq->nent before we use it 2005-09-20 22:08 ` [PATCH 04/10] IPoIB: Fix SA client retransmission strategy Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 06/10] IB/mthca: Fix posting work requests to shared receive queues Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general In mthca_create_eq(), we call get_eqe() before setting eq->nent. This is wrong, because get_eqe() uses eq->nent. Fix this, and clean up the code a little while we're at it. (We got lucky with the current code, because eq->nent was cleared to 0, which get_eqe() made happen to do the right thing) Pointed out by Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_eq.c | 16 +++++----------- 1 files changed, 5 insertions(+), 11 deletions(-) 8b194835d2f28c793d25d2c41753af2b7ee29f31 diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c --- a/drivers/infiniband/hw/mthca/mthca_eq.c +++ b/drivers/infiniband/hw/mthca/mthca_eq.c @@ -476,12 +476,8 @@ static int __devinit mthca_create_eq(str int i; u8 status; - /* Make sure EQ size is aligned to a power of 2 size. */ - for (i = 1; i < nent; i <<= 1) - ; /* nothing */ - nent = i; - - eq->dev = dev; + eq->dev = dev; + eq->nent = roundup_pow_of_two(max(nent, 2)); eq->page_list = kmalloc(npages * sizeof *eq->page_list, GFP_KERNEL); @@ -512,7 +508,7 @@ static int __devinit mthca_create_eq(str memset(eq->page_list[i].buf, 0, PAGE_SIZE); } - for (i = 0; i < nent; ++i) + for (i = 0; i < eq->nent; ++i) set_eqe_hw(get_eqe(eq, i)); eq->eqn = mthca_alloc(&dev->eq_table.alloc); @@ -528,8 +524,6 @@ static int __devinit mthca_create_eq(str if (err) goto err_out_free_eq; - eq->nent = nent; - memset(eq_context, 0, sizeof *eq_context); eq_context->flags = cpu_to_be32(MTHCA_EQ_STATUS_OK | MTHCA_EQ_OWNER_HW | @@ -538,7 +532,7 @@ static int __devinit mthca_create_eq(str if (mthca_is_memfree(dev)) eq_context->flags |= cpu_to_be32(MTHCA_EQ_STATE_ARBEL); - eq_context->logsize_usrpage = cpu_to_be32((ffs(nent) - 1) << 24); + eq_context->logsize_usrpage = cpu_to_be32((ffs(eq->nent) - 1) << 24); if (mthca_is_memfree(dev)) { eq_context->arbel_pd = cpu_to_be32(dev->driver_pd.pd_num); } else { @@ -569,7 +563,7 @@ static int __devinit mthca_create_eq(str dev->eq_table.arm_mask |= eq->eqn_mask; mthca_dbg(dev, "Allocated EQ %d with %d entries\n", - eq->eqn, nent); + eq->eqn, eq->nent); return err; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 06/10] IB/mthca: Fix posting work requests to shared receive queues 2005-09-20 22:08 ` [PATCH 05/10] IB/mthca: Initialize eq->nent before we use it Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 07/10] IB/mthca: Don't try to set srq->last for userspace SRQs Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general The error handling paths in mthca_tavor_post_srq_recv() and mthca_arbel_post_srq_recv() are quite bogus, the result of a screwed up merge. Fix them so they work as intended. Pointed out by Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_srq.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) b95e7b96cd976a5974fa2ae8f3a1af510cb8d4c9 diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c @@ -409,7 +409,7 @@ int mthca_tavor_post_srq_recv(struct ib_ mthca_err(dev, "SRQ %06x full\n", srq->srqn); err = -ENOMEM; *bad_wr = wr; - return nreq; + break; } wqe = get_wqe(srq, ind); @@ -427,7 +427,7 @@ int mthca_tavor_post_srq_recv(struct ib_ err = -EINVAL; *bad_wr = wr; srq->last = prev_wqe; - return nreq; + break; } for (i = 0; i < wr->num_sge; ++i) { @@ -456,8 +456,6 @@ int mthca_tavor_post_srq_recv(struct ib_ srq->first_free = next_ind; } - return nreq; - if (likely(nreq)) { __be32 doorbell[2]; @@ -501,7 +499,7 @@ int mthca_arbel_post_srq_recv(struct ib_ mthca_err(dev, "SRQ %06x full\n", srq->srqn); err = -ENOMEM; *bad_wr = wr; - return nreq; + break; } wqe = get_wqe(srq, ind); @@ -517,7 +515,7 @@ int mthca_arbel_post_srq_recv(struct ib_ if (unlikely(wr->num_sge > srq->max_gs)) { err = -EINVAL; *bad_wr = wr; - return nreq; + break; } for (i = 0; i < wr->num_sge; ++i) { ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 07/10] IB/mthca: Don't try to set srq->last for userspace SRQs 2005-09-20 22:08 ` [PATCH 06/10] IB/mthca: Fix posting work requests to shared receive queues Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 08/10] IB: Fix data length for RMPP SA sends Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general Subject: [PATCH] IB/mthca: Don't try to set srq->last for userspace SRQs Userspace SRQs don't have a buffer allocated for them in the kernel, so it doesn't make sense to set srq->last during initialization. In fact, this can crash trying to follow a nonexistent buffer pointer. Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_srq.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) 6577ae51cf52f5fb0e4a85e673dd7bf2d0074e3e diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c @@ -172,6 +172,8 @@ static int mthca_alloc_srq_buf(struct mt scatter->lkey = cpu_to_be32(MTHCA_INVAL_LKEY); } + srq->last = get_wqe(srq, srq->max - 1); + return 0; } @@ -263,7 +265,6 @@ int mthca_alloc_srq(struct mthca_dev *de srq->first_free = 0; srq->last_free = srq->max - 1; - srq->last = get_wqe(srq, srq->max - 1); return 0; ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 08/10] IB: Fix data length for RMPP SA sends 2005-09-20 22:08 ` [PATCH 07/10] IB/mthca: Don't try to set srq->last for userspace SRQs Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 09/10] IPoIB: Don't flush workqueue from within workqueue Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general Subject: [PATCH] IB: Fix data length for RMPP SA sends From: Hal Rosenstock <halr@voltaire.com> Date: 1127163061 -0700 We need to subtract off the header length from our payload length when sending multi-packet SA messages. Signed-off-by: Hal Rosenstock <halr@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/core/user_mad.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) eff4c654b1a4a5e5493fbdc3affa6dd48765c085 diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c --- a/drivers/infiniband/core/user_mad.c +++ b/drivers/infiniband/core/user_mad.c @@ -334,10 +334,11 @@ static ssize_t ib_umad_write(struct file ret = -EINVAL; goto err_ah; } - /* Validate that management class can support RMPP */ + + /* Validate that the management class can support RMPP */ if (rmpp_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_ADM) { hdr_len = offsetof(struct ib_sa_mad, data); - data_len = length; + data_len = length - hdr_len; } else if ((rmpp_mad->mad_hdr.mgmt_class >= IB_MGMT_CLASS_VENDOR_RANGE2_START) && (rmpp_mad->mad_hdr.mgmt_class <= IB_MGMT_CLASS_VENDOR_RANGE2_END)) { hdr_len = offsetof(struct ib_vendor_mad, data); ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 09/10] IPoIB: Don't flush workqueue from within workqueue 2005-09-20 22:08 ` [PATCH 08/10] IB: Fix data length for RMPP SA sends Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 2005-09-20 22:08 ` [PATCH 10/10] IB/mthca: Fix device removal memory leak Roland Dreier 0 siblings, 1 reply; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general Subject: [PATCH] IPoIB: Don't flush workqueue from within workqueue ipoib_mcast_restart_task() is always called from within the single-threaded IPoIB workqueue, so flushing the workqueue from within the function can lead to a recursion overflow. But since we're running in a single-threaded workqueue, we're already synchronized against other items in the workqueue, so just get rid of the flush in ipoib_mcast_restart_task(). Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/ulp/ipoib/ipoib.h | 2 +- drivers/infiniband/ulp/ipoib/ipoib_ib.c | 4 ++-- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) 8d2cae0651502028bf64844508ab18528bbd65c2 diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h @@ -257,7 +257,7 @@ void ipoib_mcast_send(struct net_device void ipoib_mcast_restart_task(void *dev_ptr); int ipoib_mcast_start_thread(struct net_device *dev); -int ipoib_mcast_stop_thread(struct net_device *dev); +int ipoib_mcast_stop_thread(struct net_device *dev, int flush); void ipoib_mcast_dev_down(struct net_device *dev); void ipoib_mcast_dev_flush(struct net_device *dev); diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c @@ -432,7 +432,7 @@ int ipoib_ib_dev_down(struct net_device flush_workqueue(ipoib_workqueue); } - ipoib_mcast_stop_thread(dev); + ipoib_mcast_stop_thread(dev, 1); /* * Flush the multicast groups first so we stop any multicast joins. The @@ -599,7 +599,7 @@ void ipoib_ib_dev_cleanup(struct net_dev ipoib_dbg(priv, "cleaning up ib_dev\n"); - ipoib_mcast_stop_thread(dev); + ipoib_mcast_stop_thread(dev, 1); /* Delete the broadcast address and the local address */ ipoib_mcast_dev_down(dev); diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c @@ -598,7 +598,7 @@ int ipoib_mcast_start_thread(struct net_ return 0; } -int ipoib_mcast_stop_thread(struct net_device *dev) +int ipoib_mcast_stop_thread(struct net_device *dev, int flush) { struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_mcast *mcast; @@ -610,7 +610,8 @@ int ipoib_mcast_stop_thread(struct net_d cancel_delayed_work(&priv->mcast_task); up(&mcast_mutex); - flush_workqueue(ipoib_workqueue); + if (flush) + flush_workqueue(ipoib_workqueue); if (priv->broadcast && priv->broadcast->query) { ib_sa_cancel_query(priv->broadcast->query_id, priv->broadcast->query); @@ -832,7 +833,7 @@ void ipoib_mcast_restart_task(void *dev_ ipoib_dbg_mcast(priv, "restarting multicast task\n"); - ipoib_mcast_stop_thread(dev); + ipoib_mcast_stop_thread(dev, 0); spin_lock_irqsave(&priv->lock, flags); ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 10/10] IB/mthca: Fix device removal memory leak 2005-09-20 22:08 ` [PATCH 09/10] IPoIB: Don't flush workqueue from within workqueue Roland Dreier @ 2005-09-20 22:08 ` Roland Dreier 0 siblings, 0 replies; 11+ messages in thread From: Roland Dreier @ 2005-09-20 22:08 UTC (permalink / raw) To: torvalds; +Cc: linux-kernel, openib-general Subject: [PATCH] IB/mthca: Fix device removal memory leak From: Michael S. Tsirkin <mst@mellanox.co.il> Date: 1127238888 -0700 Clean up QP table array on device removal. Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com> --- drivers/infiniband/hw/mthca/mthca_qp.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) 71eea47d853bb0ce0c6befe11b3e08111263170f diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c @@ -2123,5 +2123,6 @@ void __devexit mthca_cleanup_qp_table(st for (i = 0; i < 2; ++i) mthca_CONF_SPECIAL_QP(dev, i, 0, &status); + mthca_array_cleanup(&dev->qp_table.qp, dev->limits.num_qps); mthca_alloc_cleanup(&dev->qp_table.alloc); } ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2005-09-20 22:11 UTC | newest] Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2005-09-20 22:08 [git pull] InfiniBand fixes Roland Dreier 2005-09-20 22:08 ` [PATCH 01/10] IPoIB: fix module removal race Roland Dreier 2005-09-20 22:08 ` [PATCH 02/10] IB/mthca: assign ACK timeout field correctly Roland Dreier 2005-09-20 22:08 ` [PATCH 03/10] IB/mthca: fix posting of first work request Roland Dreier 2005-09-20 22:08 ` [PATCH 04/10] IPoIB: Fix SA client retransmission strategy Roland Dreier 2005-09-20 22:08 ` [PATCH 05/10] IB/mthca: Initialize eq->nent before we use it Roland Dreier 2005-09-20 22:08 ` [PATCH 06/10] IB/mthca: Fix posting work requests to shared receive queues Roland Dreier 2005-09-20 22:08 ` [PATCH 07/10] IB/mthca: Don't try to set srq->last for userspace SRQs Roland Dreier 2005-09-20 22:08 ` [PATCH 08/10] IB: Fix data length for RMPP SA sends Roland Dreier 2005-09-20 22:08 ` [PATCH 09/10] IPoIB: Don't flush workqueue from within workqueue Roland Dreier 2005-09-20 22:08 ` [PATCH 10/10] IB/mthca: Fix device removal memory leak Roland Dreier
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®