Subject: Re: PROBLEM: in_atomic() misuse all over the place

From: Andrew Morton <[email-masked]>
Date: Fri, 30 Jan 2009 21:49:33 -0800

On Sat, 31 Jan 2009 06:55:08 +0100 Andi Kleen <[email-masked]> wrote:

> > There's a bit of a problem here.  If someone accidentally uses
> > gfp_any() inside a spinlock, it will do a sleeping allocation on
> > non-preempt kernels and will do an atomic allocation on preemptible
> > kernels, so we won't get to see the warning which would allow us to fix
> > the bug.
> 
> Yes exporting the function to drivers is dangerous I agree because
> it's easy to abuse.
> 
> > Would using irq_count() work?  If so, that would fix this up.
> 
> There's nothing that works reliably to detect spinlocks on non
> preempt kernels.

Hang on.  You said

  That's typically for softirq vs non softirq, which is important for
  the network stack.

that's what in_softirq() does.

Now, if networking is indeed using in_atomic() to detect
are-we-inside-a-spinlock then networking is buggy.

If networking is _not_ doing that then we can safely switch it to
in_sortirq() or in_interrupt().  And this would reenable the bug
detection which networking's use of in_atomic() accidentally
suppressed.