Messages in this thread | | | Date | Wed, 23 Nov 2011 15:39:57 +0800 | Subject | Re: tty related lockdep trace during bootup on 3.2-rc2 | From | Cong Wang <> |
| |
On Wed, Nov 23, 2011 at 3:28 PM, Havard Skinnemoen <hskinnemoen@google.com> wrote: > On Tue, Nov 22, 2011 at 7:38 PM, Dave Jones <davej@redhat.com> wrote: >> From Linus' current tree... >> >> related to 5dc2470c602da8851907ec18942cd876c3b4ecc1 maybe ? > > Yes, probably. I did have a bad feeling about the locking, but it > seemed to behave well during testing. Wonder why I didn't see this. > > So what's happening is that tty_open() holds big_tty_mutex while > calling acm_tty_open which takes open_lock, and acm_tty_close holds > open_lock while calling tty_port_close_start which takes > big_tty_mutex?
Yes, exactly.
> > Not sure how to solve this. Not taking the lock before calling > tty_port_close_start means the tty_port may get freed before it > returns.
But...
static void acm_tty_hangup(struct tty_struct *tty) { struct acm *acm = tty->driver_data; tty_port_hangup(&acm->port); //<---------------- No open_mutex protected neither... mutex_lock(&open_mutex); acm_port_down(acm); mutex_unlock(&open_mutex); }
| |