[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |