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.
>
>
> 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);/
>
Hm. Post-compile typo?
> 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)) {
>
I would tend to fold these into a single if(); the double if looks odd.
> + 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);
> }
>
J
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|