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

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



On Wed, Jul 07, 2010 at 08:26:20AM -0700, Jeremy Fitzhardinge wrote:
> On 07/07/2010 07:48 AM, Konrad Rzeszutek Wilk wrote:
> > 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.

Here is a redux that is compile and regression tested. And I've
addressed your concerns Jeremy. Putting this on the BZ to solicit some
testing from folks.

diff --git a/drivers/xen/netback/xenbus.c b/drivers/xen/netback/xenbus.c
index ba7b1de..7a9ae2e 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;
 }
 
@@ -187,9 +194,15 @@ 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 +212,7 @@ static void backend_create_netif(struct backend_info *be)
        int err;
        long handle;
        struct xenbus_device *dev = be->dev;
+       struct xen_netif *netif;
 
        if (be->netif != NULL)
                return;
@@ -209,13 +223,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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.