On Sat, Feb 12, 2005 at 04:50:23PM +0000, Christian Heim wrote: > Well, i have to setup ISDN here at home, and wanted to use both channels. > I am able to add the second channel, but then the kernel (at least i think) > starts to complain. > > >17:36:22 kraftwerk Badness in local_bh_enable at kernel/softirq.c:140 > >17:36:22 kraftwerk [<c011b201>] local_bh_enable+0x71/0x80 > >17:36:22 kraftwerk [<c030c1a7>] isdn_ppp_xmit+0xe7/0x7d0
isdn_net_get_locked_lp is doing a local_bh_enable with hard IRQs disabled. This is not allowed. The following patch fixes the problem by removing the unnecessary local_bh_enable while the hard IRQs are disabled. Signed-off-by: Herbert Xu <[EMAIL PROTECTED]> Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
===== drivers/isdn/i4l/isdn_net.h 1.48 vs edited ===== --- 1.48/drivers/isdn/i4l/isdn_net.h 2004-06-23 00:44:03 +10:00 +++ edited/drivers/isdn/i4l/isdn_net.h 2005-02-14 08:52:19 +11:00 @@ -78,18 +78,19 @@ spin_lock_irqsave(&nd->queue_lock, flags); lp = nd->queue; /* get lp on top of queue */ - spin_lock_bh(&nd->queue->xmit_lock); + spin_lock(&nd->queue->xmit_lock); while (isdn_net_lp_busy(nd->queue)) { - spin_unlock_bh(&nd->queue->xmit_lock); + spin_unlock(&nd->queue->xmit_lock); nd->queue = nd->queue->next; if (nd->queue == lp) { /* not found -- should never happen */ lp = NULL; goto errout; } - spin_lock_bh(&nd->queue->xmit_lock); + spin_lock(&nd->queue->xmit_lock); } lp = nd->queue; nd->queue = nd->queue->next; + local_bh_disable(); errout: spin_unlock_irqrestore(&nd->queue_lock, flags); return lp;