lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 04 Jun 2017 13:34:31 +0200 From: Mike Galbraith <efault@....de> To: Vegard Nossum <vegard.nossum@...cle.com>, Greg Kroah-Hartman <gregkh@...uxfoundation.org> Cc: Dave Jones <davej@...emonkey.org.uk>, Linux Kernel <linux-kernel@...r.kernel.org>, Jiri Slaby <jslaby@...e.com> Subject: Re: [bisected] Re: tty lockdep trace On Sun, 2017-06-04 at 12:00 +0200, Vegard Nossum wrote: > > I don't know how you did it, but this passes my testing (reproducers for > both the original issue and the lockdep splat/hang). I suppose I can sign it off, see if that inspires anyone to come up with something better. drivers/tty: Fix 925bb1ce47f4 circular locking dependency 925bb1ce47f4 (tty: fix port buffer locking) upset lockdep by holding buf->lock while acquiring tty->atomic_write_lock. Move acquisition to flush_to_ldisc(), taking it prior to taking buf->lock. Costs a reference, but appeases lockdep. Signed-off-by: Mike Galbraith <efault@....de> Fixes: 925bb1ce47f4 ("tty: fix port buffer locking") --- drivers/tty/tty_buffer.c | 10 ++++++++++ drivers/tty/tty_port.c | 2 -- 2 files changed, 10 insertions(+), 2 deletions(-) --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -465,7 +465,13 @@ static void flush_to_ldisc(struct work_s { struct tty_port *port = container_of(work, struct tty_port, buf.work); struct tty_bufhead *buf = &port->buf; + struct tty_struct *tty = READ_ONCE(port->itty); + struct tty_ldisc *disc = NULL; + if (tty) + disc = tty_ldisc_ref(tty); + if (disc) + mutex_lock(&tty->atomic_write_lock); mutex_lock(&buf->lock); while (1) { @@ -501,6 +507,10 @@ static void flush_to_ldisc(struct work_s } mutex_unlock(&buf->lock); + if (disc) { + mutex_unlock(&tty->atomic_write_lock); + tty_ldisc_deref(disc); + } } --- a/drivers/tty/tty_port.c +++ b/drivers/tty/tty_port.c @@ -34,9 +34,7 @@ static int tty_port_default_receive_buf( if (!disc) return 0; - mutex_lock(&tty->atomic_write_lock); ret = tty_ldisc_receive_buf(disc, p, (char *)f, count); - mutex_unlock(&tty->atomic_write_lock); tty_ldisc_deref(disc);
Powered by blists - more mailing lists