From 763bc56849e6d65586cb0cb2f27506708ed1ec7a Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Tue, 30 Sep 2003 11:47:07 +0000 Subject: bitkeeper revision 1.475 (3f796d3bblNbmAFIYOUxNwNgsLILNg) network.c, dev.c, keyhandler.c: Stronger SMP memory barriers in the newtork code. --- xen/common/keyhandler.c | 27 ++++++++++++++-------- xen/net/dev.c | 2 ++ .../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)<domain)<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; } -- cgit v1.2.3