aboutsummaryrefslogtreecommitdiffstats
path: root/xen
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-30 21:27:29 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-07-30 21:27:29 +0000
commitf7463a99139aaa01df0345830b79e48c0ee89fab (patch)
tree50716f78559189958bc4fc5d95a7ce428508477d /xen
parent2a1d0b3f0233b00c23f0b3020511fe25d0b31607 (diff)
downloadxen-f7463a99139aaa01df0345830b79e48c0ee89fab.tar.gz
xen-f7463a99139aaa01df0345830b79e48c0ee89fab.tar.bz2
xen-f7463a99139aaa01df0345830b79e48c0ee89fab.zip
bitkeeper revision 1.387 (3f283841sxL_1BFf_Dks40SWU9PRqg)
dev.c: Fix possible subtle race in new network tx code.
Diffstat (limited to 'xen')
-rw-r--r--xen/net/dev.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/xen/net/dev.c b/xen/net/dev.c
index b1a87ffb83..e9e965c7e9 100644
--- a/xen/net/dev.c
+++ b/xen/net/dev.c
@@ -836,6 +836,12 @@ static void tx_skb_release(struct sk_buff *skb)
__make_tx_response(vif, skb->guest_id, RING_STATUS_OK);
spin_unlock_irqrestore(&vif->tx_lock, flags);
+ /*
+ * Checks below must happen after the above response is posted.
+ * This avoids a possible race with a guest OS on another CPU.
+ */
+ smp_rmb();
+
if ( (vif->tx_cons == vif->tx_prod) && get_tx_bufs(vif) )
{
add_to_net_schedule_list_tail(vif);