From: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
To: Petr Mladek <pmladek@suse.com>,
Steven Rostedt <rostedt@goodmis.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Dmitry Vyukov <dvyukov@google.com>,
linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Subject: [RFC][PATCH 2/6] tty: add tty_port locking helpers
Date: Fri, 15 Jun 2018 18:39:15 +0900 [thread overview]
Message-ID: <20180615093919.559-3-sergey.senozhatsky@gmail.com> (raw)
In-Reply-To: <20180615093919.559-1-sergey.senozhatsky@gmail.com>
TTY port spin_lock is one of the locks that can cause a
printk-recursion deadlock, thus we need to lock it from
printk_safe context. E.g.
ioctl()
tty_ioctl()
spin_lock(&tty_port->lock)
printk()
call_console_drivers()
foo_console_write()
spin_lock(&uart_port->lock)
tty_wakeup()
spin_lock(&tty_port->lock) << deadlock
This patch adds tty_port->lock helper macros which take care
of printk_safe context and redirect potentially unsafe printk()
calls to per-CPU buffers, which we flush later from safe a
context. The helper macros will turn the above mentioned deadlock
scenario into:
ioctl()
tty_ioctl()
printk_safe_enter()
spin_lock(&tty_port->lock)
printk()
printk_safe_log_store()
irq_work_queue()
spin_unlock(&tty_port->lock)
printk_safe_exit()
IRQ
printk_safe_flush_buffer()
vprintk_deferred()
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
---
include/linux/tty.h | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/include/linux/tty.h b/include/linux/tty.h
index c56e3978b00f..828f91ab680b 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -252,6 +252,30 @@ struct tty_port {
void *client_data;
};
+#define tty_port_lock_irq(lock) \
+ do { \
+ printk_safe_enter_irq(); \
+ spin_lock(lock); \
+ } while (0)
+
+#define tty_port_unlock_irq(lock) \
+ do { \
+ spin_unlock(lock); \
+ printk_safe_exit_irq(); \
+ } while (0)
+
+#define tty_port_lock_irqsave(lock, flags) \
+ do { \
+ printk_safe_enter_irqsave(flags); \
+ spin_lock(lock); \
+ } while (0)
+
+#define tty_port_unlock_irqrestore(lock, flags) \
+ do { \
+ spin_unlock(lock); \
+ printk_safe_exit_irqrestore(flags); \
+ } while (0)
+
/* tty_port::iflags bits -- use atomic bit ops */
#define TTY_PORT_INITIALIZED 0 /* device is initialized */
#define TTY_PORT_SUSPENDED 1 /* device is suspended */
--
2.17.1
next prev parent reply other threads:[~2018-06-15 9:40 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-15 9:39 [RFC][PATCH 0/6] Use printk_safe context for TTY and UART port locks Sergey Senozhatsky
2018-06-15 9:39 ` [RFC][PATCH 1/6] printk: move printk_safe macros to printk header Sergey Senozhatsky
2018-06-18 6:27 ` Sergey Senozhatsky
2018-06-15 9:39 ` Sergey Senozhatsky [this message]
2018-06-15 9:39 ` [RFC][PATCH 3/6] tty/pty: switch to tty_port helpers Sergey Senozhatsky
2018-06-15 9:39 ` [RFC][PATCH 4/6] serial: add uart port locking helpers Sergey Senozhatsky
2018-06-15 9:39 ` [RFC][PATCH 5/6] serial: switch to uart_port " Sergey Senozhatsky
2018-06-15 9:39 ` [RFC][PATCH 6/6] tty: 8250: " Sergey Senozhatsky
2018-06-18 13:38 ` [RFC][PATCH 0/6] Use printk_safe context for TTY and UART port locks Alan Cox
2018-06-19 0:53 ` Sergey Senozhatsky
2018-06-19 8:30 ` Petr Mladek
2018-06-19 8:59 ` Sergey Senozhatsky
2018-06-20 2:01 ` Linus Torvalds
2018-06-20 2:34 ` Steven Rostedt
2018-06-20 2:44 ` Linus Torvalds
2018-06-22 16:21 ` Alan Cox
2018-06-22 16:39 ` Peter Zijlstra
2018-06-23 5:21 ` Sergey Senozhatsky
2018-06-20 2:56 ` Sergey Senozhatsky
2018-06-20 2:50 ` Sergey Senozhatsky
2018-06-20 3:38 ` Linus Torvalds
2018-06-20 4:28 ` Sergey Senozhatsky
2018-06-28 2:55 ` Sergey Senozhatsky
2018-06-19 8:08 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180615093919.559-3-sergey.senozhatsky@gmail.com \
--to=sergey.senozhatsky.work@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=dvyukov@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=jslaby@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=sergey.senozhatsky@gmail.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.