aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>2003-02-27 19:12:00 +0000
committerkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>2003-02-27 19:12:00 +0000
commit6e00eab701cdea435adef931a428faa885daa64f (patch)
treebcbed132f4c6d02b45687c1b482a5647bd31b88e
parent4f8a42fc0e8f088bb15bd0830e3a59bbcfdde80b (diff)
downloadxen-6e00eab701cdea435adef931a428faa885daa64f.tar.gz
xen-6e00eab701cdea435adef931a428faa885daa64f.tar.bz2
xen-6e00eab701cdea435adef931a428faa885daa64f.zip
bitkeeper revision 1.105.1.4 (3e5e6300OW6aJoXNU_rtBiUn9RxCUQ)
network.c, dev.c: Fixed network transmit event dispatch. Was broken and not sending inter-CPU interrupts.
-rw-r--r--xen/net/dev.c21
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c4
2 files changed, 16 insertions, 9 deletions
diff --git a/xen/net/dev.c b/xen/net/dev.c
index 0bf8125014..03039e9c81 100644
--- a/xen/net/dev.c
+++ b/xen/net/dev.c
@@ -657,10 +657,11 @@ static void add_to_net_schedule_list_tail(net_vif_t *vif)
/* Destructor function for tx skbs. */
static void tx_skb_release(struct sk_buff *skb)
{
- int i;
+ int i, send = 0;
net_vif_t *vif = sys_vif_list[skb->src_vif];
unsigned int idx;
tx_shadow_entry_t *tx;
+ unsigned long cpu_mask;
for ( i = 0; i < skb_shinfo(skb)->nr_frags; i++ )
put_page_tot(skb_shinfo(skb)->frags[i].page);
@@ -691,9 +692,7 @@ static void tx_skb_release(struct sk_buff *skb)
if ( idx == vif->shadow_ring->tx_idx ) BUG();
tx = &vif->shadow_ring->tx_ring[idx];
vif->shadow_ring->tx_cons = TX_RING_INC(idx);
- if ( vif->shadow_ring->tx_cons == vif->net_ring->tx_event )
- set_bit(_EVENT_NET_TX,
- &sys_vif_list[skb->src_vif]->domain->shared_info->events);
+ if ( vif->shadow_ring->tx_cons == vif->net_ring->tx_event ) send = 1;
} while ( tx->status != RING_STATUS_OK );
/* Now skip over any more bad descriptors, up to the next good one. */
@@ -705,13 +704,19 @@ static void tx_skb_release(struct sk_buff *skb)
(tx->status == RING_STATUS_OK) )
break;
vif->shadow_ring->tx_cons = TX_RING_INC(idx);
- if ( vif->shadow_ring->tx_cons == vif->net_ring->tx_event )
- set_bit(_EVENT_NET_TX,
- &sys_vif_list[skb->src_vif]->domain->shared_info->events);
+ if ( vif->shadow_ring->tx_cons == vif->net_ring->tx_event ) send = 1;
} while ( 1 );
- /* Finally, update shared consumer index to the new private value. */
+ /* Update shared consumer index to the new private value. */
vif->net_ring->tx_cons = vif->shadow_ring->tx_cons;
+
+ /* Send a transmit event if requested. */
+ if ( send )
+ {
+ cpu_mask = mark_guest_event(
+ sys_vif_list[skb->src_vif]->domain, _EVENT_NET_TX);
+ guest_event_notify(cpu_mask);
+ }
}
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c
index adcff526b4..7ef9ce4ef8 100644
--- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c
+++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/network/network.c
@@ -23,6 +23,7 @@
#include <asm/io.h>
#include <net/sock.h>
+#include <net/pkt_sched.h>
#define NET_TX_IRQ _EVENT_NET_TX
#define NET_RX_IRQ _EVENT_NET_RX
@@ -185,7 +186,8 @@ static void network_tx_buf_gc(struct net_device *dev)
np->tx_idx = i;
/* Set a new event, then check for race with update of tx_cons. */
- np->net_ring->tx_event = TX_RING_INC(cons);
+ np->net_ring->tx_event =
+ TX_RING_ADD(cons, (atomic_read(&np->tx_entries)>>1) + 1);
smp_mb();
}
while ( cons != np->net_ring->tx_cons );