Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207915
b: refs/heads/master
c: b07471f
h: refs/heads/master
i:
  207913: 6609761
  207911: 5ed1f2d
v: v3
  • Loading branch information
Arnd Bergmann authored and Greg Kroah-Hartman committed Aug 10, 2010
1 parent b44a774 commit a336e0a
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ddcd9fb66ae7f448b517242c10a31d4e17bcad45
refs/heads/master: b07471fa51358ce64cc25e1501544502362e4404
1 change: 1 addition & 0 deletions trunk/drivers/char/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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-y += tty_mutex.o
obj-$(CONFIG_LEGACY_PTYS) += pty.o
obj-$(CONFIG_UNIX98_PTYS) += pty.o
obj-y += misc.o
Expand Down
47 changes: 47 additions & 0 deletions trunk/drivers/char/tty_mutex.c
Original file line number Diff line number Diff line change
@@ -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);
18 changes: 5 additions & 13 deletions trunk/include/linux/tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -578,20 +578,12 @@ extern int vt_ioctl(struct tty_struct *tty, struct file *file,
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 */
static inline void tty_lock(void) __acquires(kernel_lock)
{
#ifdef CONFIG_LOCK_KERNEL
/* kernel_locked is 1 for !CONFIG_LOCK_KERNEL */
WARN_ON(kernel_locked());
#endif
lock_kernel();
}
static inline void tty_unlock(void) __releases(kernel_lock)
{
unlock_kernel();
}
#define tty_locked() (kernel_locked())
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)

/*
* wait_event_interruptible_tty -- wait for a condition with the tty lock held
Expand Down

0 comments on commit a336e0a

Please sign in to comment.