poll()/select()

John Baldwin jhb at freebsd.org
Mon Nov 21 16:31:46 GMT 2005


On Monday 21 November 2005 08:14 am, Konstantin Prokazoff wrote:
> Thanks for comment,
>
>     I think, after kernel inspection, problem (maybe) in preemption. While
> syscall to poll or select holds sellock, and if another thread (process)
> tries to syscall or we have taken interrupt (where handler use
> selrecord/selwakeup too), kernel will deadlock.
>     I have this situation cause to INTR_FAST interrupt handler in device
> driver for Digium's PCI board, which provides 4 T1/E1 interfaces. Problem
> 100% repetitive.
>     Another way to avoid such deadlock - provide different kthread/ithreads
> for select/poll mechanism.

You can't call selwakeup() from an INTR_FAST handler.  Try removing INTR_FAST 
and see if it fixes your issue.  If you want to use INTR_FAST, then realize 
that you can only use spin mutexes in your handler, and that any more 
complicated work like selwakeup() that uses regular mutexes will have to be 
deferred either by using a swi handler or dispatching a task to the Fast 
taskqueue.

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-hackers mailing list