]> git.baikalelectronics.ru Git - kernel.git/commit
[NETFILTER]: Fix deadlock with ip_queue and tcp local input path.
authorHarald Welte <laforge@netfilter.org>
Mon, 30 May 2005 22:35:26 +0000 (15:35 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 May 2005 22:35:26 +0000 (15:35 -0700)
commit4935aa6a733240ff189dc3cdf814cac847c41b58
treedc310200df5988d4c71c346baad6a923a4bdeb9d
parentc9f0c5b94c6cf76a33ffd960a1fa7076c3603d55
[NETFILTER]: Fix deadlock with ip_queue and tcp local input path.

When we have ip_queue being used from LOCAL_IN, then we end up with a
situation where the verdicts coming back from userspace traverse the TCP
input path from syscall context.  While this seems to work most of the
time, there's an ugly deadlock:

syscall context is interrupted by the timer interrupt.  When the timer
interrupt leaves, the timer softirq get's scheduled and calls
tcp_delack_timer() and alike.  They themselves do bh_lock_sock(sk),
which is already held from somewhere else -> boom.

I've now tested the suggested solution by Patrick McHardy and Herbert Xu to
simply use local_bh_{en,dis}able().

Signed-off-by: Harald Welte <laforge@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/netfilter/ip_queue.c