Thanks for your analysis. The patch you propose does indeed prevent the "circular locking dependency" message, with no noticeable ill effect. I cannot say why xmit_lock was taken around isdn_net_lp_busy() in the first place. The ISDN4Linux people would be the ones to comment on that. If none of them objects, I propose you add a Signed-off-by line to your patch and submit it to Karsten Keil, the ISDN maintainer, for inclusion. You can also add a "Tested-by: Tilman Schmidt " line. Thanks, Tilman Am 19.10.2009 07:27 schrieb Xiaotian Feng: > So there's a circular locking dependency.. Looking into isdn_net_get_locked_lp() [...] > Why do we need to hold xmit_lock while using > isdn_net_lp_busy(nd->queue) ? Can following patch fix this bug? > > --- > diff --git a/drivers/isdn/i4l/isdn_net.h b/drivers/isdn/i4l/isdn_net.h > index 74032d0..7511f08 100644 > --- a/drivers/isdn/i4l/isdn_net.h > +++ b/drivers/isdn/i4l/isdn_net.h > @@ -83,19 +83,19 @@ static __inline__ isdn_net_local * > isdn_net_get_locked_lp(isdn_net_dev *nd) > > spin_lock_irqsave(&nd->queue_lock, flags); > lp = nd->queue; /* get lp on top of queue */ > - spin_lock(&nd->queue->xmit_lock); > while (isdn_net_lp_busy(nd->queue)) { > - 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(&nd->queue->xmit_lock); > } > lp = nd->queue; > nd->queue = nd->queue->next; > + spin_unlock_irqrestore(&nd->queue_lock, flags); > + spin_lock(&lp->xmit_lock); > local_bh_disable(); > + return lp; > errout: > spin_unlock_irqrestore(&nd->queue_lock, flags); > return lp; > -- Tilman Schmidt E-Mail: tilman@imap.cc Bonn, Germany Diese Nachricht besteht zu 100% aus wiederverwerteten Bits. Ungeöffnet mindestens haltbar bis: (siehe Rückseite)