aboutsummaryrefslogtreecommitdiffstats
path: root/tty/tty-implement-btm-as-mutex-instead-of-bkl.patch
diff options
Diffstat (limited to 'tty/tty-implement-btm-as-mutex-instead-of-bkl.patch')
-rw-r--r--tty/tty-implement-btm-as-mutex-instead-of-bkl.patch139
1 files changed, 139 insertions, 0 deletions
diff --git a/tty/tty-implement-btm-as-mutex-instead-of-bkl.patch b/tty/tty-implement-btm-as-mutex-instead-of-bkl.patch
new file mode 100644
index 00000000000000..ce84ae064e6b9a
--- /dev/null
+++ b/tty/tty-implement-btm-as-mutex-instead-of-bkl.patch
@@ -0,0 +1,139 @@
+From arnd@arndb.de Wed Jun 16 13:46:10 2010
+From: Arnd Bergmann <arnd@arndb.de>
+Date: Tue, 1 Jun 2010 22:53:09 +0200
+Subject: tty: implement BTM as mutex instead of BKL
+To: Greg KH <gregkh@suse.de>
+Cc: linux-kernel@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>, Alan Cox <alan@lxorguk.ukuu.org.uk>, Frederic Weisbecker <fweisbec@gmail.com>, John Kacur <jkacur@redhat.com>
+Message-ID: <1275425591-8803-30-git-send-email-arnd@arndb.de>
+
+
+The tty locking now follows the rules for mutexes, so
+we can replace the BKL usage with a new subsystem
+wide mutex.
+
+This patch for now makes the new behaviour an optional
+experimental feature that can be enabled for testing
+purposes.
+
+Using a regular mutex here will change the behaviour
+when blocked on the BTM from spinning to sleeping,
+but that should not be visible to the user.
+
+Using the mutex also means that all the BTM is now
+covered by lockdep.
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/char/Makefile | 1 +
+ drivers/char/tty_mutex.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/tty.h | 8 ++++++++
+ lib/Kconfig.debug | 10 ++++++++++
+ 4 files changed, 66 insertions(+)
+
+--- a/drivers/char/Makefile
++++ b/drivers/char/Makefile
+@@ -9,6 +9,7 @@ FONTMAPFILE = cp437.uni
+
+ obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.o
+
++obj-$(CONFIG_TTY_MUTEX) += tty_mutex.o
+ obj-$(CONFIG_LEGACY_PTYS) += pty.o
+ obj-$(CONFIG_UNIX98_PTYS) += pty.o
+ obj-y += misc.o
+--- /dev/null
++++ b/drivers/char/tty_mutex.c
+@@ -0,0 +1,47 @@
++/*
++ * drivers/char/tty_lock.c
++ */
++#include <linux/tty.h>
++#include <linux/module.h>
++#include <linux/kallsyms.h>
++#include <linux/semaphore.h>
++#include <linux/sched.h>
++
++/*
++ * The 'big tty mutex'
++ *
++ * This mutex is taken and released by tty_lock() and tty_unlock(),
++ * replacing the older big kernel lock.
++ * It can no longer be taken recursively, and does not get
++ * released implicitly while sleeping.
++ *
++ * Don't use in new code.
++ */
++static DEFINE_MUTEX(big_tty_mutex);
++struct task_struct *__big_tty_mutex_owner;
++EXPORT_SYMBOL_GPL(__big_tty_mutex_owner);
++
++/*
++ * Getting the big tty mutex.
++ */
++void __lockfunc tty_lock(void)
++{
++ struct task_struct *task = current;
++
++ WARN_ON(__big_tty_mutex_owner == task);
++
++ mutex_lock(&big_tty_mutex);
++ __big_tty_mutex_owner = task;
++}
++EXPORT_SYMBOL(tty_lock);
++
++void __lockfunc tty_unlock(void)
++{
++ struct task_struct *task = current;
++
++ WARN_ON(__big_tty_mutex_owner != task);
++ __big_tty_mutex_owner = NULL;
++
++ mutex_unlock(&big_tty_mutex);
++}
++EXPORT_SYMBOL(tty_unlock);
+--- a/include/linux/tty.h
++++ b/include/linux/tty.h
+@@ -574,7 +574,14 @@ extern int vt_ioctl(struct tty_struct *t
+ extern long vt_compat_ioctl(struct tty_struct *tty, struct file * file,
+ unsigned int cmd, unsigned long arg);
+
++/* tty_mutex.c */
+ /* functions for preparation of BKL removal */
++#ifdef CONFIG_TTY_MUTEX
++extern void __lockfunc tty_lock(void) __acquires(tty_lock);
++extern void __lockfunc tty_unlock(void) __releases(tty_lock);
++extern struct task_struct *__big_tty_mutex_owner;
++#define tty_locked() (current == __big_tty_mutex_owner)
++#else
+ static inline void tty_lock(void) __acquires(kernel_lock)
+ {
+ #ifdef CONFIG_LOCK_KERNEL
+@@ -588,6 +595,7 @@ static inline void tty_unlock(void) __re
+ unlock_kernel();
+ }
+ #define tty_locked() (kernel_locked())
++#endif
+
+ /*
+ * wait_event_interruptible_tty -- wait for a condition with the tty lock held
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -428,6 +428,16 @@ config RT_MUTEX_TESTER
+ help
+ This option enables a rt-mutex tester.
+
++config TTY_MUTEX
++ bool "Use a mutex instead of BKL for TTY locking"
++ depends on EXPERIMENTAL && SMP
++ help
++ The TTY subsystem traditionally depends on the big kernel lock
++ for serialization. Saying Y here replaces the BKL with the Big
++ TTY Mutex (BTM).
++ Building a kernel without the BKL is only possible with TTY_MUTEX
++ enabled.
++
+ config DEBUG_SPINLOCK
+ bool "Spinlock and rw-lock debugging: basic checks"
+ depends on DEBUG_KERNEL