diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-09-30 11:47:07 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-09-30 11:47:07 +0000 |
commit | 763bc56849e6d65586cb0cb2f27506708ed1ec7a (patch) | |
tree | 8d8da2e4e32225e9adc55caab4e9823d1000925e | |
parent | 440df4e78b054404360595d8e7d00bf5773b4c01 (diff) | |
download | xen-763bc56849e6d65586cb0cb2f27506708ed1ec7a.tar.gz xen-763bc56849e6d65586cb0cb2f27506708ed1ec7a.tar.bz2 xen-763bc56849e6d65586cb0cb2f27506708ed1ec7a.zip |
bitkeeper revision 1.475 (3f796d3bblNbmAFIYOUxNwNgsLILNg)split-1.0latest-stable
network.c, dev.c, keyhandler.c:
Stronger SMP memory barriers in the newtork code.
-rw-r--r-- | xen/common/keyhandler.c | 27 | ||||
-rw-r--r-- | xen/net/dev.c | 2 | ||||
-rw-r--r-- | xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c | 6 |
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; } |