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