Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c831c338 authored by Matthias Kaehlcke's avatar Matthias Kaehlcke Committed by Linus Torvalds
Browse files

use mutex instead of semaphore in virtual console driver



The virtual console driver uses a semaphore as mutex.  Use the mutex API
instead of the (binary) semaphore.

Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 159dde93
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -28,11 +28,13 @@
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/vt_kern.h>
#include <linux/selection.h>
#include <linux/kbd_kern.h>
#include <linux/console.h>
#include <linux/device.h>

#include <asm/uaccess.h>
#include <asm/byteorder.h>
#include <asm/unaligned.h>
@@ -69,11 +71,11 @@ static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)
{
	int size;

	down(&con_buf_sem);
	mutex_lock(&con_buf_mtx);
	size = vcs_size(file->f_path.dentry->d_inode);
	switch (orig) {
		default:
			up(&con_buf_sem);
			mutex_unlock(&con_buf_mtx);
			return -EINVAL;
		case 2:
			offset += size;
@@ -84,11 +86,11 @@ static loff_t vcs_lseek(struct file *file, loff_t offset, int orig)
			break;
	}
	if (offset < 0 || offset > size) {
		up(&con_buf_sem);
		mutex_unlock(&con_buf_mtx);
		return -EINVAL;
	}
	file->f_pos = offset;
	up(&con_buf_sem);
	mutex_unlock(&con_buf_mtx);
	return file->f_pos;
}

@@ -105,7 +107,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
	unsigned short *org = NULL;
	ssize_t ret;

	down(&con_buf_sem);
	mutex_lock(&con_buf_mtx);

	pos = *ppos;

@@ -262,7 +264,7 @@ vcs_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
		ret = read;
unlock_out:
	release_console_sem();
	up(&con_buf_sem);
	mutex_unlock(&con_buf_mtx);
	return ret;
}

@@ -279,7 +281,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
	u16 *org0 = NULL, *org = NULL;
	size_t ret;

	down(&con_buf_sem);
	mutex_lock(&con_buf_mtx);

	pos = *ppos;

@@ -449,7 +451,7 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
unlock_out:
	release_console_sem();

	up(&con_buf_sem);
	mutex_unlock(&con_buf_mtx);

	return ret;
}
+3 −2
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@
#include <linux/mm.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/vt_kern.h>
#include <linux/selection.h>
#include <linux/tiocl.h>
@@ -1952,7 +1953,7 @@ static void do_con_trol(struct tty_struct *tty, struct vc_data *vc, int c)
 * kernel memory allocation is available.
 */
char con_buf[CON_BUF_SIZE];
DECLARE_MUTEX(con_buf_sem);
DEFINE_MUTEX(con_buf_mtx);

/* is_double_width() is based on the wcwidth() implementation by
 * Markus Kuhn -- 2003-05-20 (Unicode 4.0)
@@ -2049,7 +2050,7 @@ static int do_con_write(struct tty_struct *tty, const unsigned char *buf, int co

	/* At this point 'buf' is guaranteed to be a kernel buffer
	 * and therefore no access to userspace (and therefore sleeping)
	 * will be needed.  The con_buf_sem serializes all tty based
	 * will be needed.  The con_buf_mtx serializes all tty based
	 * console rendering and vcs write/read operations.  We hold
	 * the console spinlock during the entire write.
	 */
+2 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#include <linux/vt.h>
#include <linux/kd.h>
#include <linux/tty.h>
#include <linux/mutex.h>
#include <linux/console_struct.h>
#include <linux/mm.h>

@@ -82,7 +83,7 @@ void reset_vc(struct vc_data *vc);

#define CON_BUF_SIZE (CONFIG_BASE_SMALL ? 256 : PAGE_SIZE)
extern char con_buf[CON_BUF_SIZE];
extern struct semaphore con_buf_sem;
extern struct mutex con_buf_mtx;
extern char vt_dont_switch;

struct vt_spawn_console {