Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tty: Use non-atomic state to signal flip buffer flush pending

Atomic bit ops are no longer required to indicate a flip buffer
flush is pending, as the flush_mutex is sufficient barrier.

Remove the unnecessary port .iflags field and localize flip buffer
state to struct tty_bufhead.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Peter Hurley and committed by
Greg Kroah-Hartman
0f56bd2f 8c1fb49b

+5 -5
+4 -3
drivers/tty/tty_buffer.c
··· 189 189 struct tty_port *port = tty->port; 190 190 struct tty_bufhead *buf = &port->buf; 191 191 192 - set_bit(TTYP_FLUSHPENDING, &port->iflags); 192 + buf->flushpending = 1; 193 193 194 194 mutex_lock(&buf->flush_mutex); 195 195 __tty_buffer_flush(port); 196 - clear_bit(TTYP_FLUSHPENDING, &port->iflags); 196 + buf->flushpending = 0; 197 197 mutex_unlock(&buf->flush_mutex); 198 198 } 199 199 ··· 426 426 int count; 427 427 428 428 /* Ldisc or user is trying to flush the buffers. */ 429 - if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) 429 + if (buf->flushpending) 430 430 break; 431 431 432 432 count = head->commit - head->read; ··· 505 505 buf->tail = &buf->sentinel; 506 506 init_llist_head(&buf->free); 507 507 atomic_set(&buf->memory_used, 0); 508 + buf->flushpending = 0; 508 509 INIT_WORK(&buf->work, flush_to_ldisc); 509 510 } 510 511
+1 -2
include/linux/tty.h
··· 68 68 struct tty_buffer *head; /* Queue head */ 69 69 struct work_struct work; 70 70 struct mutex flush_mutex; 71 + unsigned int flushpending:1; 71 72 struct tty_buffer sentinel; 72 73 struct llist_head free; /* Free queue head */ 73 74 atomic_t memory_used; /* In-use buffers excluding free list */ ··· 213 212 wait_queue_head_t close_wait; /* Close waiters */ 214 213 wait_queue_head_t delta_msr_wait; /* Modem status change */ 215 214 unsigned long flags; /* TTY flags ASY_*/ 216 - unsigned long iflags; /* TTYP_ internal flags */ 217 - #define TTYP_FLUSHPENDING 2 /* Queued buffer flush pending */ 218 215 unsigned char console:1, /* port is a console */ 219 216 low_latency:1; /* direct buffer flush */ 220 217 struct mutex mutex; /* Locking */