svn commit: r261167 - head/sys/dev/virtio/network
Bryan Venteicher
bryanv at FreeBSD.org
Sat Jan 25 20:12:08 UTC 2014
Author: bryanv
Date: Sat Jan 25 19:57:30 2014
New Revision: 261167
URL: http://svnweb.freebsd.org/changeset/base/261167
Log:
Avoid queue unlock followed by relock when the enable interrupt race is lost
This already happens infrequently, and the hold time is still bounded since
we defer to a taskqueue after a few tries.
Modified:
head/sys/dev/virtio/network/if_vtnet.c
Modified: head/sys/dev/virtio/network/if_vtnet.c
==============================================================================
--- head/sys/dev/virtio/network/if_vtnet.c Sat Jan 25 19:55:42 2014 (r261166)
+++ head/sys/dev/virtio/network/if_vtnet.c Sat Jan 25 19:57:30 2014 (r261167)
@@ -1821,9 +1821,9 @@ vtnet_rx_vq_intr(void *xrxq)
return;
}
-again:
VTNET_RXQ_LOCK(rxq);
+again:
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
VTNET_RXQ_UNLOCK(rxq);
return;
@@ -1837,10 +1837,11 @@ again:
* This is an occasional condition or race (when !more),
* so retry a few times before scheduling the taskqueue.
*/
- rxq->vtnrx_stats.vrxs_rescheduled++;
- VTNET_RXQ_UNLOCK(rxq);
if (tries++ < VTNET_INTR_DISABLE_RETRIES)
goto again;
+
+ VTNET_RXQ_UNLOCK(rxq);
+ rxq->vtnrx_stats.vrxs_rescheduled++;
taskqueue_enqueue(rxq->vtnrx_tq, &rxq->vtnrx_intrtask);
} else
VTNET_RXQ_UNLOCK(rxq);
@@ -2408,9 +2409,9 @@ vtnet_tx_vq_intr(void *xtxq)
return;
}
-again:
VTNET_TXQ_LOCK(txq);
+again:
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
VTNET_TXQ_UNLOCK(txq);
return;
@@ -2426,9 +2427,10 @@ again:
* This is an occasional race, so retry a few times
* before scheduling the taskqueue.
*/
- VTNET_TXQ_UNLOCK(txq);
if (tries++ < VTNET_INTR_DISABLE_RETRIES)
goto again;
+
+ VTNET_TXQ_UNLOCK(txq);
txq->vtntx_stats.vtxs_rescheduled++;
taskqueue_enqueue(txq->vtntx_tq, &txq->vtntx_intrtask);
} else
More information about the svn-src-all
mailing list