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

Re: [Xen-devel][PATCH]: Fix some bugs in usbfront



On Fri, Mar 12, 2010 at 11:25:21AM -0700, Ky Srinivasan wrote:
> The attached patch fixes some  bugs in usbfront.
> 

What kernel version is this patch against? linux-2.6.18-xen? 

-- Pasi

> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
> 
> 
> 
> 

> Bug#584218: Fix a  scheduling race in usbfront. Create the thread only after 
> we 
> are connected. The current code schedules the thread at a point where the 
> communication rings are not initialized yet.
> 
> Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
> 
> Index: linux/drivers/xen/usbfront/xenbus.c
> ===================================================================
> --- linux.orig/drivers/xen/usbfront/xenbus.c  2010-03-10 12:10:58.000000000 
> -0700
> +++ linux/drivers/xen/usbfront/xenbus.c       2010-03-10 12:17:24.000000000 
> -0700
> @@ -192,11 +192,23 @@ static int connect(struct xenbus_device
>       usbif_conn_request_t *req;
>       int i, idx, err;
>       int notify;
> +     char name[TASK_COMM_LEN];
> +     struct usb_hcd *hcd;
> +
> +     hcd = info_to_hcd(info);
> +     snprintf(name, TASK_COMM_LEN, "xenhcd.%d", hcd->self.busnum);
>  
>       err = talk_to_backend(dev, info);
>       if (err)
>               return err;
>  
> +     info->kthread = kthread_run(xenhcd_schedule, info, name);
> +     if (IS_ERR(info->kthread)) {
> +             err = PTR_ERR(info->kthread);
> +             info->kthread = NULL;
> +             xenbus_dev_fatal(dev, err, "Error creating thread");
> +             return err;
> +     }
>       /* prepare ring for hotplug notification */
>       for (idx = 0, i = 0; i < USB_CONN_RING_SIZE; i++) {
>               req = RING_GET_REQUEST(&info->conn_ring, idx);
> @@ -274,7 +286,6 @@ static int usbfront_probe(struct xenbus_
>       int err;
>       struct usb_hcd *hcd;
>       struct usbfront_info *info;
> -     char name[TASK_COMM_LEN];
>  
>       if (usb_disabled())
>               return -ENODEV;
> @@ -298,13 +309,6 @@ static int usbfront_probe(struct xenbus_
>       }
>  
>       init_waitqueue_head(&info->wq);
> -     snprintf(name, TASK_COMM_LEN, "xenhcd.%d", hcd->self.busnum);
> -     info->kthread = kthread_run(xenhcd_schedule, info, name);
> -     if (IS_ERR(info->kthread)) {
> -             err = PTR_ERR(info->kthread);
> -             info->kthread = NULL;
> -             goto fail;
> -     }
>  
>       return 0;
>  
> @@ -343,8 +347,8 @@ static void backend_changed(struct xenbu
>       case XenbusStateInitWait:
>               if (dev->state != XenbusStateInitialising)
>                       break;
> -             connect(dev);
> -             xenbus_switch_state(dev, XenbusStateConnected);
> +             if (!connect(dev))
> +                     xenbus_switch_state(dev, XenbusStateConnected);
>               break;
>  
>       case XenbusStateClosing:

> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel


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