提交 2fc20661 编写于 作者: J Jiri Slaby 提交者: Greg Kroah-Hartman

TTY: move TTY_FLUSH* flags to tty_port

They are only TTY buffers specific. And the buffers will go to
tty_port in the next patches. So to remove the need to have both
tty_port and tty_struct at some places, let us move the flags to
tty_port.
Signed-off-by: NJiri Slaby <jslaby@suse.cz>
Acked-by: NAlan Cox <alan@linux.intel.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 57c94121
...@@ -134,17 +134,18 @@ static void __tty_buffer_flush(struct tty_struct *tty) ...@@ -134,17 +134,18 @@ static void __tty_buffer_flush(struct tty_struct *tty)
void tty_buffer_flush(struct tty_struct *tty) void tty_buffer_flush(struct tty_struct *tty)
{ {
struct tty_port *port = tty->port;
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&tty->buf.lock, flags); spin_lock_irqsave(&tty->buf.lock, flags);
/* If the data is being pushed to the tty layer then we can't /* If the data is being pushed to the tty layer then we can't
process it here. Instead set a flag and the flush_to_ldisc process it here. Instead set a flag and the flush_to_ldisc
path will process the flush request before it exits */ path will process the flush request before it exits */
if (test_bit(TTY_FLUSHING, &tty->flags)) { if (test_bit(TTYP_FLUSHING, &port->iflags)) {
set_bit(TTY_FLUSHPENDING, &tty->flags); set_bit(TTYP_FLUSHPENDING, &port->iflags);
spin_unlock_irqrestore(&tty->buf.lock, flags); spin_unlock_irqrestore(&tty->buf.lock, flags);
wait_event(tty->read_wait, wait_event(tty->read_wait,
test_bit(TTY_FLUSHPENDING, &tty->flags) == 0); test_bit(TTYP_FLUSHPENDING, &port->iflags) == 0);
return; return;
} else } else
__tty_buffer_flush(tty); __tty_buffer_flush(tty);
...@@ -450,6 +451,7 @@ static void flush_to_ldisc(struct work_struct *work) ...@@ -450,6 +451,7 @@ static void flush_to_ldisc(struct work_struct *work)
{ {
struct tty_struct *tty = struct tty_struct *tty =
container_of(work, struct tty_struct, buf.work); container_of(work, struct tty_struct, buf.work);
struct tty_port *port = tty->port;
unsigned long flags; unsigned long flags;
struct tty_ldisc *disc; struct tty_ldisc *disc;
...@@ -459,7 +461,7 @@ static void flush_to_ldisc(struct work_struct *work) ...@@ -459,7 +461,7 @@ static void flush_to_ldisc(struct work_struct *work)
spin_lock_irqsave(&tty->buf.lock, flags); spin_lock_irqsave(&tty->buf.lock, flags);
if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) { if (!test_and_set_bit(TTYP_FLUSHING, &port->iflags)) {
struct tty_buffer *head; struct tty_buffer *head;
while ((head = tty->buf.head) != NULL) { while ((head = tty->buf.head) != NULL) {
int count; int count;
...@@ -477,7 +479,7 @@ static void flush_to_ldisc(struct work_struct *work) ...@@ -477,7 +479,7 @@ static void flush_to_ldisc(struct work_struct *work)
/* Ldisc or user is trying to flush the buffers /* Ldisc or user is trying to flush the buffers
we are feeding to the ldisc, stop feeding the we are feeding to the ldisc, stop feeding the
line discipline as we want to empty the queue */ line discipline as we want to empty the queue */
if (test_bit(TTY_FLUSHPENDING, &tty->flags)) if (test_bit(TTYP_FLUSHPENDING, &port->iflags))
break; break;
if (!tty->receive_room) if (!tty->receive_room)
break; break;
...@@ -491,14 +493,14 @@ static void flush_to_ldisc(struct work_struct *work) ...@@ -491,14 +493,14 @@ static void flush_to_ldisc(struct work_struct *work)
flag_buf, count); flag_buf, count);
spin_lock_irqsave(&tty->buf.lock, flags); spin_lock_irqsave(&tty->buf.lock, flags);
} }
clear_bit(TTY_FLUSHING, &tty->flags); clear_bit(TTYP_FLUSHING, &port->iflags);
} }
/* We may have a deferred request to flush the input buffer, /* We may have a deferred request to flush the input buffer,
if so pull the chain under the lock and empty the queue */ if so pull the chain under the lock and empty the queue */
if (test_bit(TTY_FLUSHPENDING, &tty->flags)) { if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) {
__tty_buffer_flush(tty); __tty_buffer_flush(tty);
clear_bit(TTY_FLUSHPENDING, &tty->flags); clear_bit(TTYP_FLUSHPENDING, &port->iflags);
wake_up(&tty->read_wait); wake_up(&tty->read_wait);
} }
spin_unlock_irqrestore(&tty->buf.lock, flags); spin_unlock_irqrestore(&tty->buf.lock, flags);
......
...@@ -197,6 +197,9 @@ struct tty_port { ...@@ -197,6 +197,9 @@ struct tty_port {
wait_queue_head_t close_wait; /* Close waiters */ wait_queue_head_t close_wait; /* Close waiters */
wait_queue_head_t delta_msr_wait; /* Modem status change */ wait_queue_head_t delta_msr_wait; /* Modem status change */
unsigned long flags; /* TTY flags ASY_*/ unsigned long flags; /* TTY flags ASY_*/
unsigned long iflags; /* TTYP_ internal flags */
#define TTYP_FLUSHING 1 /* Flushing to ldisc in progress */
#define TTYP_FLUSHPENDING 2 /* Queued buffer flush pending */
unsigned char console:1; /* port is a console */ unsigned char console:1; /* port is a console */
struct mutex mutex; /* Locking */ struct mutex mutex; /* Locking */
struct mutex buf_mutex; /* Buffer alloc lock */ struct mutex buf_mutex; /* Buffer alloc lock */
...@@ -309,8 +312,6 @@ struct tty_file_private { ...@@ -309,8 +312,6 @@ struct tty_file_private {
#define TTY_PTY_LOCK 16 /* pty private */ #define TTY_PTY_LOCK 16 /* pty private */
#define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */ #define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */
#define TTY_HUPPED 18 /* Post driver->hangup() */ #define TTY_HUPPED 18 /* Post driver->hangup() */
#define TTY_FLUSHING 19 /* Flushing to ldisc in progress */
#define TTY_FLUSHPENDING 20 /* Queued buffer flush pending */
#define TTY_HUPPING 21 /* ->hangup() in progress */ #define TTY_HUPPING 21 /* ->hangup() in progress */
#define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册