bitkeeper revision 1.475 (3f796d3bblNbmAFIYOUxNwNgsLILNg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 30 Sep 2003 11:47:07 +0000 (11:47 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 30 Sep 2003 11:47:07 +0000 (11:47 +0000)
network.c, dev.c, keyhandler.c:
  Stronger SMP memory barriers in the newtork code.

xen/common/keyhandler.c
xen/net/dev.c
xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c

index 3cd25a0e65563847e5e787be82ffbe281832f54a..23b05278958ddec0bdf263f7ab392ae24474ea04 100644 (file)
@@ -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); 
index af23219796ee765a39cde358a9a609d60f0bf93a..ec80189b58cd25d9e737ef60d2c3a8de797f8538 100644 (file)
@@ -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);
index 786af5b6923958ed36d99ef153b01f7130221748..51d86c8fb3f726ed1213d98f8ee7965231d81035 100644 (file)
@@ -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;
 }