WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [linux-2.6.18-xen] netfront accel: Better watch handling

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] netfront accel: Better watch handling across suspend/resume
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 07 Apr 2009 08:40:03 -0700
Delivery-date: Tue, 07 Apr 2009 08:40:10 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1239096570 -3600
# Node ID e5d3f2fa3428ca1d3ee265647b60239509cd798c
# Parent  950b9eb2766128f85adf52d5aabcd15eb8c77dc0
netfront accel: Better watch handling across suspend/resume

Signed-off-by: Kieran Mansley <kmansley@xxxxxxxxxxxxxx>
---
 drivers/xen/netfront/accel.c |   43 ++++++++++++++++++++++++++++---------------
 1 files changed, 28 insertions(+), 15 deletions(-)

diff -r 950b9eb27661 -r e5d3f2fa3428 drivers/xen/netfront/accel.c
--- a/drivers/xen/netfront/accel.c      Mon Apr 06 13:51:20 2009 +0100
+++ b/drivers/xen/netfront/accel.c      Tue Apr 07 10:29:30 2009 +0100
@@ -50,6 +50,8 @@ static int netfront_load_accelerator(str
 static int netfront_load_accelerator(struct netfront_info *np, 
                                     struct xenbus_device *dev, 
                                     const char *frontend);
+
+static void netfront_accelerator_remove_watch(struct netfront_info *np);
 
 /*
  * List of all netfront accelerator plugin modules available.  Each
@@ -164,8 +166,11 @@ void netfront_accelerator_add_watch(stru
 {
        int err;
        
-       /* Check we're not trying to overwrite an existing watch */
-       BUG_ON(np->accel_vif_state.accel_watch.node != NULL);
+       /* 
+        * If old watch exists, e.g. from before suspend/resume,
+        * remove it now 
+        */
+       netfront_accelerator_remove_watch(np);
 
        /* Get a watch on the accelerator plugin */
        err = xenbus_watch_path2(np->xbdev, np->xbdev->otherend, 
@@ -180,6 +185,19 @@ void netfront_accelerator_add_watch(stru
 }
 
 
+static void 
+netfront_accelerator_purge_watch(struct netfront_accel_vif_state *vif_state)
+{
+       flush_workqueue(accel_watch_workqueue);
+
+       /* Clean up any state left from watch */
+       if (vif_state->accel_frontend != NULL) {
+               kfree(vif_state->accel_frontend);
+               vif_state->accel_frontend = NULL;
+       }
+}
+
+
 static
 void netfront_accelerator_remove_watch(struct netfront_info *np)
 {
@@ -191,13 +209,7 @@ void netfront_accelerator_remove_watch(s
                kfree(vif_state->accel_watch.node);
                vif_state->accel_watch.node = NULL;
 
-               flush_workqueue(accel_watch_workqueue);
-
-               /* Clean up any state left from watch */
-               if (vif_state->accel_frontend != NULL) {
-                       kfree(vif_state->accel_frontend);
-                       vif_state->accel_frontend = NULL;
-               }
+               netfront_accelerator_purge_watch(vif_state);
        }       
 }
 
@@ -670,8 +682,6 @@ int netfront_accelerator_suspend(struct 
 {
        int rc = 0;
        
-       netfront_accelerator_remove_watch(np);
-
        mutex_lock(&accelerator_mutex);
 
        /* Check that we've got a device that was accelerated */
@@ -692,13 +702,16 @@ int netfront_accelerator_suspend_cancel(
 int netfront_accelerator_suspend_cancel(struct netfront_info *np,
                                        struct xenbus_device *dev)
 {
+       netfront_accelerator_purge_watch(&np->accel_vif_state);
+
        /* 
-        * Setting the watch will cause it to fire and probe the
-        * accelerator, so no need to call accelerator_probe_new_vif()
-        * directly here
+        * Gratuitously fire the watch handler to reinstate the
+        * configured accelerator
         */
        if (dev->state == XenbusStateConnected)
-               netfront_accelerator_add_watch(np);
+               queue_work(accel_watch_workqueue, 
+                          &np->accel_vif_state.accel_work);
+
        return 0;
 }
 

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [linux-2.6.18-xen] netfront accel: Better watch handling across suspend/resume, Xen patchbot-linux-2.6.18-xen <=