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

Commit 2fc20661 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

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: default avatarJiri Slaby <jslaby@suse.cz>
Acked-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 57c94121
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -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)
{
{
	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)


	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)
			/* 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)
							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);
+3 −2
Original line number Original line Diff line number Diff line
@@ -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 {
#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))