net: don't use in_atomic() in gfp_any()
authorAndrew Morton <akpm@linux-foundation.org>
Fri, 13 Feb 2009 00:43:17 +0000 (16:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Feb 2009 00:43:17 +0000 (16:43 -0800)
commit99709372736a216f99eb32b76fba835a2bfc93a8
tree62a84b976965436b841c65b63e52240d0b06bc29
parentfb0886745a75ce98bde3aac421adc69fe61a1905
net: don't use in_atomic() in gfp_any()

The problem is that in_atomic() will return false inside spinlocks if
CONFIG_PREEMPT=n.  This will lead to deadlockable GFP_KERNEL allocations
from spinlocked regions.

Secondly, if CONFIG_PREEMPT=y, this bug solves itself because networking
will instead use GFP_ATOMIC from this callsite.  Hence we won't get the
might_sleep() debugging warnings which would have informed us of the buggy
callsites.

Solve both these problems by switching to in_interrupt().  Now, if someone
runs a gfp_any() allocation from inside spinlock we will get the warning
if CONFIG_PREEMPT=y.

I reviewed all callsites and most of them were too complex for my little
brain and none of them documented their interface requirements.  I have no
idea what this patch will do.

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h