msleep() in interrupt handler?

victorascroft at gmail.com victorascroft at gmail.com
Thu Aug 20 08:35:31 EDT 2015


On 15-08-20 19:02:50, Woody Wu wrote:
> On Thursday, August 20, 2015, John de la Garza <john at jjdev.com> wrote:
> 
> > On Thu, Aug 20, 2015 at 01:45:34PM +0800, Woody Wu wrote:
> > > I did not see the message.  Actually my interrupt handler is calling
> > > i2c_transfer which in turn used msleep() somewhere in its code.  Is this
> > > normal or dangerous?
> >
> > Can you have the interrupt handler put the work on a workqueue
> > and quickly return?
> >
> 
> Yes, that is an option.  But I firstly need to know the old code is really
> bad. The interrupt is triggered by an i2c touchscreen, and  the interrupt
> handler use the i2c core code to start the i2c transferring.  I see in the
> i2c adapter code a msleep() was invoked at beginning of transfer.  I doubt
> that this is a potential problem.  But you know the i2c touchscreen driver
> code is also part of the mainline, so I am not sure my option.  You guys
> can check the code of atmel_mXT224_ts.c, the i2c adapter code is i2c_s3c.c

I checked the code. The kernel release I am checking in is 4.1.5. From what
I can see there is only atmel_mxt_ts.c and not atmel_mXT224_ts.c in drivers/
input/touchscreen. In this code, it is requesting a threaded irq with the
top handler being specified as null and the bottom handler specified.

Since the bottom handler is being used where i2c_transfer is called and
as such though on a quick check I do not see the msleep() call, even if
the msleep were called while in the bottom handler context it would be fine.

I do not know which code you are referring to but in hard interrupt context
atleast you can never ever call any function which can sleep. It is just
gonna blow in some way.

- Sanchayan.



More information about the Kernelnewbies mailing list