[linux-2.6.18-xen] Netfront accelerator bug fix

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[linux-2.6.18-xen] Netfront accelerator bug fix

Xen patchbot-linux-2.6.18-xen
# HG changeset patch
# User Keir Fraser <[hidden email]>
# Date 1195835216 0
# Node ID fd879c0688bf123a85dcfa371f863da3542ab8af
# Parent  a9f723af5e187da97efe374ffd5b7ca8cf493a36
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.

Signed-off-by: Kieran Mansley <[hidden email]>
---
 drivers/xen/netfront/accel.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)

diff -r a9f723af5e18 -r fd879c0688bf drivers/xen/netfront/accel.c
--- a/drivers/xen/netfront/accel.c Thu Nov 22 14:28:31 2007 +0000
+++ b/drivers/xen/netfront/accel.c Fri Nov 23 16:26:56 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;
 }

_______________________________________________
Xen-changelog mailing list
[hidden email]
http://lists.xensource.com/xen-changelog