Re: use of preempt_count instead of in_atomic() at leds-gpio.c

From: Stefan Richter
Date: Fri Mar 21 2008 - 13:02:58 EST


PS,
I wrote:
Tetsuo Handa wrote:
So, it is impossible to know whether I am inside a spinlock or not.
OK. That's not what I want to do.

I want to make sure that my code (not a device driver) is called only from a context where use of down()/mutex_lock()/kmalloc(GFP_KERNEL)/
get_user_pages()/kmap() etc. are permitted.
Is "if (in_atomic()) return;" check a correct method for avoiding deadlocks when my code was accidentally called from a context
where use of down()/mutex_lock()/kmalloc(GFP_KERNEL)/get_user_pages()/
kmap() etc. are not permitted?

No. Quoting Andrew: "in_atomic() returns false inside spinlock on non-preemptible kernels."

You shouldn't sleep while holding a spinlock. As soon as another thread

or interrupt handler or tasklet

attempts to take the spinlock, it will be stuck in a busy-wait loop.
--
Stefan Richter
-=====-==--- --== =-=-=
http://arcgraph.de/sr/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/