NetBSD-Bugs archive

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

re: port-i386/47244: Fit PC2i (Atom processor) won't boot i386-current



>    Date: Sun, 25 Nov 2012 20:15:01 +0000 (UTC)
>    From: htodd%twofifty.com@localhost
> 
>    lockdebug_more(c0bdc16a,1,0,0,c07997ab,0,c24ad6d0,daa68944,c0934df1,0) at 
> netbsd:lockdebug_more
>    
> mutex_enter(c11dc788,c11dc788,c2509000,c043bc8e,0,daa689a8,c043ccb3,c29bbe0c,c2509e10,1)
>   at netbsd:mutex_enter+0x4a2
>    usb_add_task(c29bbe0c,c2509e10,1,c056a876,6,0,0,6,c2509254,c25098ec) at 
> netbsd:usb_add_task+0x28
>    
> run_do_async(0,c2509254,daa689e0,c0393b05,c2509254,c25098f2,1,c07956ed,c27e1154,c25098f0)
>  at netbsd:run_do_async+0xde
> 
> Looks like a bug from usbmp: the comment above usb_add_task in usb.c
> says that it can be used from any context, but the task queue lock is
> an adaptive mutex, which can't be taken in just any context.

indeed.  please try this patch (and ignore christos' :-)


Index: usb.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usb.c,v
retrieving revision 1.135
diff -p -r1.135 usb.c
*** usb.c       20 Jul 2012 23:18:02 -0000      1.135
--- usb.c       25 Nov 2012 23:04:10 -0000
*************** usb_once_init(void)
*** 224,230 ****
                taskq = &usb_taskq[i];
  
                TAILQ_INIT(&taskq->tasks);
!               mutex_init(&taskq->lock, MUTEX_DEFAULT, IPL_NONE);
                cv_init(&taskq->cv, "usbtsk");
                taskq->name = taskq_names[i];
                if (kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL,
--- 224,234 ----
                taskq = &usb_taskq[i];
  
                TAILQ_INIT(&taskq->tasks);
!               /*
!                * Since USB tasks are callable from any context, we have to
!                * make this lock a spinlock.
!                */
!               mutex_init(&taskq->lock, MUTEX_DEFAULT, IPL_USB);
                cv_init(&taskq->cv, "usbtsk");
                taskq->name = taskq_names[i];
                if (kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL,


Home | Main Index | Thread Index | Old Index