>>> On 3/12/2010 at 5:30 PM, in message <20100312223035.GM1878@xxxxxxxxxxx>,
>>> Pasi
Kärkkäinen<pasik@xxxxxx> wrote:
> 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?
Once again this patch is against 2.6.32 kernel (sles11 sp1). Sorry for not
making this clear in the patch.
Regards,
K. Y
> -- 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
|