* [PATCH 0/3] Console preparatory work
@ 2010-05-19 12:10 Alan Cox
2010-05-19 12:11 ` [PATCH 1/3] vc: Locking clean up Alan Cox
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Alan Cox @ 2010-05-19 12:10 UTC (permalink / raw)
To: greg, linux-serial
Preparatory locking clean up and tty_port work for the console.
---
Alan Cox (3):
tty: Move the vt_tty field from the vc_data into the standard tty_port
tty: Make vt's have a tty_port
vc: Locking clean up
drivers/char/keyboard.c | 10 +++++-----
drivers/char/selection.c | 4 ++++
drivers/char/vt.c | 19 +++++++++++--------
drivers/char/vt_ioctl.c | 2 +-
include/linux/console_struct.h | 3 ++-
5 files changed, 23 insertions(+), 15 deletions(-)
--
Signature|No Signature
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] vc: Locking clean up
2010-05-19 12:10 [PATCH 0/3] Console preparatory work Alan Cox
@ 2010-05-19 12:11 ` Alan Cox
2010-05-19 12:11 ` [PATCH 2/3] tty: Make vt's have a tty_port Alan Cox
2010-05-19 12:11 ` [PATCH 3/3] tty: Move the vt_tty field from the vc_data into the standard tty_port Alan Cox
2 siblings, 0 replies; 4+ messages in thread
From: Alan Cox @ 2010-05-19 12:11 UTC (permalink / raw)
To: greg, linux-serial
The virtual console layer uses the BKL for various things that don't really
need it. Clean them out. Someone really needs to relock selection.c in its
entirity. Have fun...
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/char/selection.c | 4 ++++
drivers/char/vt.c | 7 ++++---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/char/selection.c b/drivers/char/selection.c
index f97b9e8..6e79340 100644
--- a/drivers/char/selection.c
+++ b/drivers/char/selection.c
@@ -26,6 +26,7 @@
#include <linux/selection.h>
#include <linux/tiocl.h>
#include <linux/console.h>
+#include <linux/smp_lock.h>
/* Don't take this from <ctype.h>: 011-015 on the screen aren't spaces */
#define isspace(c) ((c) == ' ')
@@ -312,6 +313,8 @@ int paste_selection(struct tty_struct *tty)
struct tty_ldisc *ld;
DECLARE_WAITQUEUE(wait, current);
+ lock_kernel();
+
acquire_console_sem();
poke_blanked_console();
release_console_sem();
@@ -335,5 +338,6 @@ int paste_selection(struct tty_struct *tty)
__set_current_state(TASK_RUNNING);
tty_ldisc_deref(ld);
+ unlock_kernel();
return 0;
}
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index bd1d116..c5e30e3 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -280,8 +280,12 @@ static inline unsigned short *screenpos(struct vc_data *vc, int offset, int view
return p;
}
+/* Called from the keyboard irq path.. */
static inline void scrolldelta(int lines)
{
+ /* FIXME */
+ /* scrolldelta needs some kind of consistency lock, but the BKL was
+ and still is not protecting versus the scheduled back end */
scrollback_delta += lines;
schedule_console_callback();
}
@@ -2604,8 +2608,6 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
return -EFAULT;
ret = 0;
- lock_kernel();
-
switch (type)
{
case TIOCL_SETSEL:
@@ -2680,7 +2682,6 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
ret = -EINVAL;
break;
}
- unlock_kernel();
return ret;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] tty: Make vt's have a tty_port
2010-05-19 12:10 [PATCH 0/3] Console preparatory work Alan Cox
2010-05-19 12:11 ` [PATCH 1/3] vc: Locking clean up Alan Cox
@ 2010-05-19 12:11 ` Alan Cox
2010-05-19 12:11 ` [PATCH 3/3] tty: Move the vt_tty field from the vc_data into the standard tty_port Alan Cox
2 siblings, 0 replies; 4+ messages in thread
From: Alan Cox @ 2010-05-19 12:11 UTC (permalink / raw)
To: greg, linux-serial
The vt layer isn't safely handling reference counts to tty object on the input
side. Add a tty port structure to the vt layer in order to implement this using
the standard helpers.
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/char/vt.c | 2 ++
include/linux/console_struct.h | 2 ++
2 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index c5e30e3..e5269cc 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -772,6 +772,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
if (!vc)
return -ENOMEM;
vc_cons[currcons].d = vc;
+ tty_port_init(&vc->port);
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
visual_init(vc, currcons, 1);
if (!*vc->vc_uni_pagedir_loc)
@@ -2909,6 +2910,7 @@ static int __init con_init(void)
for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
vc_cons[currcons].d = vc = kzalloc(sizeof(struct vc_data), GFP_NOWAIT);
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
+ tty_port_init(&vc->port);
visual_init(vc, currcons, 1);
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
vc_init(vc, vc->vc_rows, vc->vc_cols,
diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
index 38fe59d..57e83f1 100644
--- a/include/linux/console_struct.h
+++ b/include/linux/console_struct.h
@@ -21,6 +21,8 @@ struct vt_struct;
#define NPAR 16
struct vc_data {
+ struct tty_port port; /* Upper level data */
+
unsigned short vc_num; /* Console number */
unsigned int vc_cols; /* [#] Console size */
unsigned int vc_rows;
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] tty: Move the vt_tty field from the vc_data into the standard tty_port
2010-05-19 12:10 [PATCH 0/3] Console preparatory work Alan Cox
2010-05-19 12:11 ` [PATCH 1/3] vc: Locking clean up Alan Cox
2010-05-19 12:11 ` [PATCH 2/3] tty: Make vt's have a tty_port Alan Cox
@ 2010-05-19 12:11 ` Alan Cox
2 siblings, 0 replies; 4+ messages in thread
From: Alan Cox @ 2010-05-19 12:11 UTC (permalink / raw)
To: greg, linux-serial
This takes all the tty references through the expected interface points so
we can refcount them.
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
drivers/char/keyboard.c | 10 +++++-----
drivers/char/vt.c | 10 +++++-----
drivers/char/vt_ioctl.c | 2 +-
include/linux/console_struct.h | 1 -
4 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index 54109dc..ec733f1 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -299,7 +299,7 @@ int kbd_rate(struct kbd_repeat *rep)
*/
static void put_queue(struct vc_data *vc, int ch)
{
- struct tty_struct *tty = vc->vc_tty;
+ struct tty_struct *tty = vc->port.tty;
if (tty) {
tty_insert_flip_char(tty, ch, 0);
@@ -309,7 +309,7 @@ static void put_queue(struct vc_data *vc, int ch)
static void puts_queue(struct vc_data *vc, char *cp)
{
- struct tty_struct *tty = vc->vc_tty;
+ struct tty_struct *tty = vc->port.tty;
if (!tty)
return;
@@ -485,7 +485,7 @@ static void fn_show_ptregs(struct vc_data *vc)
static void fn_hold(struct vc_data *vc)
{
- struct tty_struct *tty = vc->vc_tty;
+ struct tty_struct *tty = vc->port.tty;
if (rep || !tty)
return;
@@ -563,7 +563,7 @@ static void fn_inc_console(struct vc_data *vc)
static void fn_send_intr(struct vc_data *vc)
{
- struct tty_struct *tty = vc->vc_tty;
+ struct tty_struct *tty = vc->port.tty;
if (!tty)
return;
@@ -1162,7 +1162,7 @@ static void kbd_keycode(unsigned int keycode, int down, int hw_raw)
struct keyboard_notifier_param param = { .vc = vc, .value = keycode, .down = down };
int rc;
- tty = vc->vc_tty;
+ tty = vc->port.tty;
if (tty && (!tty->driver_data)) {
/* No driver data? Strange. Okay we fix it then. */
diff --git a/drivers/char/vt.c b/drivers/char/vt.c
index e5269cc..2ba720f 100644
--- a/drivers/char/vt.c
+++ b/drivers/char/vt.c
@@ -961,12 +961,12 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
* Resize a virtual console as seen from the console end of things. We
* use the common vc_do_resize methods to update the structures. The
* caller must hold the console sem to protect console internals and
- * vc->vc_tty
+ * vc->port.tty
*/
int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows)
{
- return vc_do_resize(vc->vc_tty, vc, cols, rows);
+ return vc_do_resize(vc->port.tty, vc, cols, rows);
}
/**
@@ -2795,12 +2795,12 @@ static int con_open(struct tty_struct *tty, struct file *filp)
struct vc_data *vc = vc_cons[currcons].d;
/* Still being freed */
- if (vc->vc_tty) {
+ if (vc->port.tty) {
release_console_sem();
return -ERESTARTSYS;
}
tty->driver_data = vc;
- vc->vc_tty = tty;
+ vc->port.tty = tty;
if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
@@ -2828,7 +2828,7 @@ static void con_shutdown(struct tty_struct *tty)
struct vc_data *vc = tty->driver_data;
BUG_ON(vc == NULL);
acquire_console_sem();
- vc->vc_tty = NULL;
+ vc->port.tty = NULL;
release_console_sem();
tty_shutdown(tty);
}
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c
index 6aa1028..625f77d 100644
--- a/drivers/char/vt_ioctl.c
+++ b/drivers/char/vt_ioctl.c
@@ -1367,7 +1367,7 @@ void vc_SAK(struct work_struct *work)
acquire_console_sem();
vc = vc_con->d;
if (vc) {
- tty = vc->vc_tty;
+ tty = vc->port.tty;
/*
* SAK should also work in all raw modes and reset
* them properly.
diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
index 57e83f1..3364898 100644
--- a/include/linux/console_struct.h
+++ b/include/linux/console_struct.h
@@ -58,7 +58,6 @@ struct vc_data {
/* VT terminal data */
unsigned int vc_state; /* Escape sequence parser state */
unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */
- struct tty_struct *vc_tty; /* TTY we are attached to */
/* data for manual vt switching */
struct vt_mode vt_mode;
struct pid *vt_pid;
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-19 12:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-19 12:10 [PATCH 0/3] Console preparatory work Alan Cox
2010-05-19 12:11 ` [PATCH 1/3] vc: Locking clean up Alan Cox
2010-05-19 12:11 ` [PATCH 2/3] tty: Make vt's have a tty_port Alan Cox
2010-05-19 12:11 ` [PATCH 3/3] tty: Move the vt_tty field from the vc_data into the standard tty_port Alan Cox
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).