svn commit: r301158 - head/sys/dev/cxgbe/iw_cxgbe
Navdeep Parhar
np at FreeBSD.org
Wed Jun 1 18:46:55 UTC 2016
Author: np
Date: Wed Jun 1 18:46:54 2016
New Revision: 301158
URL: https://svnweb.freebsd.org/changeset/base/301158
Log:
iw_cxgbe: Fix panic that occurs when c4iw_ev_handler tries to acquire
comp_handler_lock but c4iw_destroy_cq has already freed the CQ memory
(which is where the lock resides).
Submitted by: Krishnamraju Eraparaju @ Chelsio
Sponsored by: Chelsio Communications
Modified:
head/sys/dev/cxgbe/iw_cxgbe/ev.c
Modified: head/sys/dev/cxgbe/iw_cxgbe/ev.c
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/ev.c Wed Jun 1 18:32:20 2016 (r301157)
+++ head/sys/dev/cxgbe/iw_cxgbe/ev.c Wed Jun 1 18:46:54 2016 (r301158)
@@ -194,13 +194,22 @@ int c4iw_ev_handler(struct sge_iq *iq, c
struct c4iw_cq *chp;
unsigned long flag;
+ spin_lock_irqsave(&dev->lock, flag);
chp = get_chp(dev, qid);
if (chp) {
+ atomic_inc(&chp->refcnt);
+ spin_unlock_irqrestore(&dev->lock, flag);
+
spin_lock_irqsave(&chp->comp_handler_lock, flag);
(*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context);
spin_unlock_irqrestore(&chp->comp_handler_lock, flag);
- } else
+ if (atomic_dec_and_test(&chp->refcnt))
+ wake_up(&chp->wait);
+ } else {
CTR2(KTR_IW_CXGBE, "%s unknown cqid 0x%x", __func__, qid);
+ spin_unlock_irqrestore(&dev->lock, flag);
+ }
+
return 0;
}
#endif
More information about the svn-src-all
mailing list