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

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

To: "Konrad Rzeszutek Wilk" <konrad.wilk@xxxxxxxxxx>
Subject: [Xen-devel] Re: [Bug 1612] Can't start VM when vif set and udev version is greater than 151
From: "Jan Beulich" <JBeulich@xxxxxxxxxx>
Date: Tue, 06 Jul 2010 16:36:23 +0100
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>, james.harper@xxxxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxx, bastian@xxxxxxxxxxxx
Delivery-date: Tue, 06 Jul 2010 08:38:26 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20100706151023.GA25263@xxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <bug-1612-1575@xxxxxxxxxxxxxxxxxxxxxxxxxxx/bugzilla/> <201007051720.o65HKsI6030388@xxxxxxxxxxxxxxxxxxxxxx> <20100706151023.GA25263@xxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
>>> 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