diff options
Diffstat (limited to 'drivers/tty/tty_buffer.c')
| -rw-r--r-- | drivers/tty/tty_buffer.c | 46 | 
1 files changed, 41 insertions, 5 deletions
| diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index bfa431a8e690..595d8b49c745 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -532,6 +532,15 @@ static void flush_to_ldisc(struct work_struct *work)  } +static inline void tty_flip_buffer_commit(struct tty_buffer *tail) +{ +	/* +	 * Paired w/ acquire in flush_to_ldisc(); ensures flush_to_ldisc() sees +	 * buffer data. +	 */ +	smp_store_release(&tail->commit, tail->used); +} +  /**   * tty_flip_buffer_push		-	push terminal buffers   * @port: tty port to push @@ -546,16 +555,43 @@ void tty_flip_buffer_push(struct tty_port *port)  {  	struct tty_bufhead *buf = &port->buf; -	/* -	 * Paired w/ acquire in flush_to_ldisc(); ensures flush_to_ldisc() sees -	 * buffer data. -	 */ -	smp_store_release(&buf->tail->commit, buf->tail->used); +	tty_flip_buffer_commit(buf->tail);  	queue_work(system_unbound_wq, &buf->work);  }  EXPORT_SYMBOL(tty_flip_buffer_push);  /** + * tty_insert_flip_string_and_push_buffer - add characters to the tty buffer and + *	push + * @port: tty port + * @chars: characters + * @size: size + * + * The function combines tty_insert_flip_string() and tty_flip_buffer_push() + * with the exception of properly holding the @port->lock. + * + * To be used only internally (by pty currently). + * + * Returns: the number added. + */ +int tty_insert_flip_string_and_push_buffer(struct tty_port *port, +		const unsigned char *chars, size_t size) +{ +	struct tty_bufhead *buf = &port->buf; +	unsigned long flags; + +	spin_lock_irqsave(&port->lock, flags); +	size = tty_insert_flip_string(port, chars, size); +	if (size) +		tty_flip_buffer_commit(buf->tail); +	spin_unlock_irqrestore(&port->lock, flags); + +	queue_work(system_unbound_wq, &buf->work); + +	return size; +} + +/**   * tty_buffer_init		-	prepare a tty buffer structure   * @port: tty port to initialise   * | 
