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

[Xen-devel] Re: [Bug 1612] Can't start VM when vif set and udev version is greater than 151



>>> On 06.07.10 at 17:10, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> wrote:
>> ------- Comment #28 from silversens@xxxxxxxxx  2010-07-05 10:20 -------
>> (In reply to comment #26)
>> > (In reply to comment #25)
>> > > Great, 
>> > > 
>> > > Will it be applyed in every xen kernel, or only from 2.6.32 ?
>> > > 
>> > The policy is to stick bug-fixes in xen/next which are then pulled in
>> > xen/stable-2.6.32.x. But this being such a serious issue, and a small patch
>> > that I think Jeremy would stick it in 2.6.31 once it has passed review.
>> > 
>> 
>> Its been a few weeks now, do you know when this patch will be included in
>> jeremy's repository ? If not can you paste a link here to this patch ?
>> 
> 
> Soooo.. the last I remember it was that the patch for this was not
> appropiate. But I don't remember the details - is there a forthcoming
> patch that can fix the outstanding issue?
> 
> Or is the patch ready and we forgot about it?

For reference, below is the diff for what we're now using.

Jan

--- 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 *);
@@ -39,13 +41,18 @@ static int netback_remove(struct xenbus_
 
        netback_remove_accelerators(be, dev);
 
-       if (be->netif) {
+       if (be->netif)
                kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
+
+       down_write(&teardown_sem);
+       if (be->netif) {
                netif_disconnect(be->netif);
                be->netif = NULL;
        }
-       kfree(be);
        dev_set_drvdata(&dev->dev, NULL);
+       up_write(&teardown_sem);
+       kfree(be);
+
        return 0;
 }
 
@@ -151,8 +158,7 @@ fail:
  */
 static int netback_uevent(struct xenbus_device *xdev, struct kobj_uevent_env 
*env)
 {
-       struct backend_info *be = dev_get_drvdata(&xdev->dev);
-       netif_t *netif = be->netif;
+       struct backend_info *be;
        char *val;
 
        DPRINTK("netback_uevent");
@@ -163,12 +169,15 @@ static int netback_uevent(struct xenbus_
                xenbus_dev_fatal(xdev, err, "reading script");
                return err;
        }
-       else {
-               add_uevent_var(env, "script=%s", val);
-               kfree(val);
-       }
 
-       add_uevent_var(env, "vif=%s", netif->dev->name);
+       add_uevent_var(env, "script=%s", val);
+       kfree(val);
+
+       down_read(&teardown_sem);
+       be = dev_get_drvdata(&xdev->dev);
+       if (be && be->netif)
+               add_uevent_var(env, "vif=%s", be->netif->dev->name);
+       up_read(&teardown_sem);
 
        return 0;
 }
@@ -179,6 +188,7 @@ static void backend_create_netif(struct 
        int err;
        long handle;
        struct xenbus_device *dev = be->dev;
+       netif_t *netif;
 
        if (be->netif != NULL)
                return;
@@ -189,13 +199,13 @@ static void backend_create_netif(struct 
                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);
 }



_______________________________________________
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®.