diff options
Diffstat (limited to 'xen-2.4.16/net/dev.c')
-rw-r--r-- | xen-2.4.16/net/dev.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/xen-2.4.16/net/dev.c b/xen-2.4.16/net/dev.c index 4e36aa0d60..1ce6e9649e 100644 --- a/xen-2.4.16/net/dev.c +++ b/xen-2.4.16/net/dev.c @@ -2003,6 +2003,7 @@ inline int init_tx_header(u8 *data, unsigned int len, struct net_device *dev) return 0; } + /* * tx_skb_release * @@ -2017,11 +2018,21 @@ void tx_skb_release(struct sk_buff *skb) { int i; - for (i= 0; i < skb_shinfo(skb)->nr_frags; i++) + for ( i = 0; i < skb_shinfo(skb)->nr_frags; i++ ) skb_shinfo(skb)->frags[i].page->tot_count--; skb_shinfo(skb)->nr_frags = 0; + + /* + * XXX This assumes that, per vif, SKBs are processed in-order! + * Also, like lots of code in here -- we assume direct access to the + * consumer and producer indexes. This is likely safe for the + * forseeable future. + */ + sys_vif_list[skb->src_vif]->net_ring->tx_cons = + TX_RING_INC(sys_vif_list[skb->src_vif]->net_ring->tx_cons); } + /* * do_net_update: @@ -2045,8 +2056,7 @@ long do_net_update(void) rx_shadow_entry_t *rx; unsigned long pfn; struct pfn_info *page; - unsigned long *g_pte; - + unsigned long *g_pte; for ( j = 0; j < current->num_net_vifs; j++) { @@ -2056,12 +2066,13 @@ long do_net_update(void) current_vif = current->net_vif_list[j]; net_ring = current_vif->net_ring; + shadow_ring = current_vif->shadow_ring; /* * PHASE 1 -- TRANSMIT RING */ - for ( i = net_ring->tx_cons; + for ( i = shadow_ring->tx_cons; i != net_ring->tx_prod; i = TX_RING_INC(i) ) { @@ -2176,14 +2187,12 @@ long do_net_update(void) unmap_domain_mem(g_data); } } - net_ring->tx_cons = i; + shadow_ring->tx_cons = i; /* * PHASE 2 -- RECEIVE RING */ - shadow_ring = current_vif->shadow_ring; - for ( i = shadow_ring->rx_prod; i != net_ring->rx_prod; i = RX_RING_INC(i) ) |