[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Netfront accelerator bug fix



In testing Xen for the upcoming 3.2.0 release, we've found a bug in the
netfront accelerator support where if an accelerator was removed before
it had properly initialised it wasn't handled correctly.  Attached is a
patch to fix it.  

Signed-off-by: Kieran Mansley <kmansley@xxxxxxxxxxxxxx>

Also, we're currently testing the xen-unstable tree, but I presume there
will be a xen-3.2-testing tree in due course that we should take a look
at.

Thanks

Kieran



Ensure remove works properly if plugin hasn't called netfront_accelerator_ready

diff -r fced90d566f1 drivers/xen/netfront/accel.c
--- a/drivers/xen/netfront/accel.c      Sat Nov 10 10:18:28 2007 +0000
+++ b/drivers/xen/netfront/accel.c      Thu Nov 22 10:14:11 2007 +0000
@@ -465,15 +465,18 @@ static void accelerator_remove_hooks(str
                                 link) {
                spin_lock_irqsave(&accelerator->vif_states_lock, flags);
 
-               BUG_ON(vif_state->hooks == NULL);
-               hooks = vif_state->hooks;
-               accelerator_remove_single_hook(accelerator, vif_state);
+               if(vif_state->hooks) {
+                       hooks = vif_state->hooks;
+                       accelerator_remove_single_hook(accelerator, vif_state);
+                       
+                       /* Last chance to get statistics from the accelerator */
+                       hooks->get_stats(vif_state->np->netdev,
+                                        &vif_state->np->stats);
+               }
 
                spin_unlock_irqrestore(&accelerator->vif_states_lock, flags);
 
-               /* Last chance to get statistics from the accelerator */
-               hooks->get_stats(vif_state->np->netdev, &vif_state->np->stats);
-               hooks->remove(vif_state->dev);
+               accelerator->hooks->remove(vif_state->dev);
        }
        
        accelerator->hooks = NULL;
@@ -530,15 +533,16 @@ static int do_remove(struct netfront_inf
 
                /* Last chance to get statistics from the accelerator */
                hooks->get_stats(np->netdev, &np->stats);
-
+       }
+
+       if (accelerator->hooks) {
                spin_unlock_irqrestore(&accelerator->vif_states_lock, 
                                       *lock_flags);
 
-               rc = hooks->remove(dev);
+               rc = accelerator->hooks->remove(dev);
 
                spin_lock_irqsave(&accelerator->vif_states_lock, *lock_flags);
        }
-
  
        return rc;
 }

Attachment: netfront_accel_remove
Description: Text document

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.