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-devel

Re: [Xen-devel] Re: [Bug 1612] Can't start VM when vif set and udev vers

On Wed, Jul 07, 2010 at 08:30:19AM +0100, Jan Beulich wrote:
> >>> On 06.07.10 at 18:46, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> 
> >>> wrote:
> >> For reference, below is the diff for what we're now using.
> > 
> > Ah nice.. 
> > 
> > I get this:
> > patch -p1 --dry-run < ~/p.patch 
> > patching file drivers/xen/netback/xenbus.c
> > Hunk #1 succeeded at 19 with fuzz 1.
> > Hunk #2 FAILED at 29.
> > Hunk #3 FAILED at 40.
> > patch: **** malformed patch at line 120: nv *env)
> > 
> > If it would not be too much trouble, can you attach it as an attachment?
> 
> Sure, here you go.

And attached is it redone against the pv-ops kernel. Let me poke the
folks on the BZ to see if they would be willing to test this.


diff --git a/drivers/xen/netback/xenbus.c b/drivers/xen/netback/xenbus.c
index ba7b1de..805ce48 100644
--- a/drivers/xen/netback/xenbus.c
+++ b/drivers/xen/netback/xenbus.c
@@ -19,6 +19,7 @@
 
 #include <stdarg.h>
 #include <linux/module.h>
+#include <linux/rwsem.h>
 #include <xen/xenbus.h>
 #include "common.h"
 
@@ -28,6 +29,7 @@
     printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
 #endif
 
+static DECLARE_RWSEM(teardown_sem);
 
 static int connect_rings(struct backend_info *);
 static void connect(struct backend_info *);
@@ -41,14 +43,19 @@ static int netback_remove(struct xenbus_device *dev)
        //netback_remove_accelerators(be, dev);
 
        unregister_hotplug_status_watch(be);
-       if (be->netif) {
+       if (be->netif)
                kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
+
+       down_write(&teardown_sem);
+       if (be->netif) {
                xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
                netif_disconnect(be->netif);
                be->netif = NULL;
        }
-       kfree(be);
        dev_set_drvdata(&dev->dev, NULL);
+       up_write(&teardown_sem);
+       kfree(be);
+
        return 0;
 }
 
@@ -168,7 +175,7 @@ static int netback_uevent(struct xenbus_device *xdev, 
struct kobj_uevent_env *en
 
        DPRINTK("netback_uevent");
 
-       be = dev_get_drvdata(&xdev->dev);
+       be = dev_get_drvdata(&xdev->dev);/
        if (!be)
                return 0;
        netif = be->netif;
@@ -187,9 +194,14 @@ static int netback_uevent(struct xenbus_device *xdev, 
struct kobj_uevent_env *en
                kfree(val);
        }
 
-       if (add_uevent_var(env, "vif=%s", netif->dev->name))
-               return -ENOMEM;
-
+       down_read(&teardown_sem);
+       be = dev_get_drvdata(&xdev->dev);
+       if (be && be->netif)
+               if (add_uevent_var(env, "vif=%s", netif->dev->name)) {
+                       up_read(&teardown_sem);
+                       return -ENOMEM;
+               }
+       up_read(&teardown_sem);
        return 0;
 }
 
@@ -199,6 +211,7 @@ static void backend_create_netif(struct backend_info *be)
        int err;
        long handle;
        struct xenbus_device *dev = be->dev;
+       netif_t *netif;
 
        if (be->netif != NULL)
                return;
@@ -209,13 +222,13 @@ static void backend_create_netif(struct backend_info *be)
                return;
        }
 
-       be->netif = netif_alloc(&dev->dev, dev->otherend_id, handle);
-       if (IS_ERR(be->netif)) {
-               err = PTR_ERR(be->netif);
-               be->netif = NULL;
+       netif = netif_alloc(&dev->dev, dev->otherend_id, handle);
+       if (IS_ERR(netif)) {
+               err = PTR_ERR(netif);
                xenbus_dev_fatal(dev, err, "creating interface");
                return;
        }
+       be->netif = netif;
 
        kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
 }

Attachment: netback-xenbus-redone.diff
Description: Text document

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