[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 07/07/2010 10:18 AM, Konrad Rzeszutek Wilk wrote:
> 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)) {
>   

The extra {} helps, but I was thinking more along the lines of:

        if (be && be->netif && add_uevent_var(env, "vif=%s", netif->dev->name)) 
{
                ...

(with line break after the second && if that's too long).

> +                     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);
>  }
>   


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