aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/common/keyhandler.c27
-rw-r--r--xen/net/dev.c2
-rw-r--r--xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c6
3 files changed, 22 insertions, 13 deletions
diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c
index 3cd25a0e65..23b0527895 100644
--- a/xen/common/keyhandler.c
+++ b/xen/common/keyhandler.c
@@ -89,12 +89,15 @@ static char *task_states[] =
void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
{
- u_long flags;
+ unsigned long flags;
struct task_struct *p;
- shared_info_t *s;
+ shared_info_t *s;
+ net_vif_t *v;
printk("'%c' pressed -> dumping task queues\n", key);
+
read_lock_irqsave(&tasklist_lock, flags);
+
p = &idle0_task;
do {
printk("Xen: DOM %d, CPU %d [has=%c], state = %s, "
@@ -102,17 +105,21 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
p->domain, p->processor, p->has_cpu ? 'T':'F',
task_states[p->state], p->hyp_events);
s = p->shared_info;
- if(!is_idle_task(p)) {
- net_vif_t *v = find_vif_by_id((p->domain)<<VIF_DOMAIN_SHIFT);
+ if( !is_idle_task(p) )
+ {
+ net_vif_t *v = find_vif_by_id((p->domain)<<VIF_DOMAIN_SHIFT);
printk("Guest: events = %08lx, events_mask = %08lx\n",
s->events, s->events_mask);
- if (v) {
- printk("rx_prod=%d ,rx_cons=%d, tx_prod=%d, tx_cons=%d\n",
- v->rx_prod,v->rx_cons,v->tx_prod,v->tx_cons );
- printk("rx_req_cons=%d, rx_resp_prod=%d, tx_req_cons=%d, tx_resp_prod=%d\n",
- v->rx_req_cons,v->rx_resp_prod,v->tx_req_cons,v->tx_resp_prod);
- put_vif(v);
+ if ( v != NULL )
+ {
+ printk("rx_prod=%d ,rx_cons=%d, tx_prod=%d, tx_cons=%d\n",
+ v->rx_prod, v->rx_cons, v->tx_prod, v->tx_cons );
+ printk("rx_req_cons=%d, rx_resp_prod=%d, "
+ "tx_req_cons=%d, tx_resp_prod=%d\n",
+ v->rx_req_cons, v->rx_resp_prod,
+ v->tx_req_cons, v->tx_resp_prod);
+ put_vif(v);
}
printk("Notifying guest...\n");
set_bit(_EVENT_DEBUG, &s->events);
diff --git a/xen/net/dev.c b/xen/net/dev.c
index af23219796..ec80189b58 100644
--- a/xen/net/dev.c
+++ b/xen/net/dev.c
@@ -2111,6 +2111,7 @@ static void __make_tx_response(net_vif_t *vif,
resp->status = st;
pos = TX_RING_INC(pos);
vif->tx_resp_prod = vif->shared_idxs->tx_resp_prod = pos;
+ smp_mb(); /* Update producer before checking event threshold. */
if ( pos == vif->shared_idxs->tx_event )
{
unsigned long cpu_mask = mark_guest_event(vif->domain, _EVENT_NET);
@@ -2139,6 +2140,7 @@ static void make_rx_response(net_vif_t *vif,
resp->offset = off;
pos = RX_RING_INC(pos);
vif->rx_resp_prod = vif->shared_idxs->rx_resp_prod = pos;
+ smp_mb(); /* Update producer before checking event threshold. */
if ( pos == vif->shared_idxs->rx_event )
{
unsigned long cpu_mask = mark_guest_event(vif->domain, _EVENT_NET);
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
index 786af5b692..51d86c8fb3 100644
--- a/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
+++ b/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
@@ -189,7 +189,7 @@ static void network_tx_buf_gc(struct net_device *dev)
/* Set a new event, then check for race with update of tx_cons. */
np->net_idx->tx_event =
TX_RING_ADD(prod, (atomic_read(&np->tx_entries)>>1) + 1);
- smp_mb();
+ mb();
}
while ( prod != np->net_idx->tx_resp_prod );
@@ -320,7 +320,7 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
np->stats.tx_packets++;
/* Only notify Xen if there are no outstanding responses. */
- smp_mb();
+ mb();
if ( np->net_idx->tx_resp_prod == i )
HYPERVISOR_net_update();
@@ -394,7 +394,7 @@ static void network_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
network_alloc_rx_buffers(dev);
/* Deal with hypervisor racing our resetting of rx_event. */
- smp_mb();
+ mb();
if ( np->net_idx->rx_resp_prod != i ) goto again;
}