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

[PATCH] remove active field from tty buffer structure

Remove 'active' field from tty buffer structure. This was added in 2.6.16
as part of a patch to make the new tty buffering SMP safe. This field is
unnecessary with the more intelligently written flush_to_ldisc that adds
receive_room handling.

Removing this field reverts to simpler logic where the tail buffer is
always the 'active' buffer, which should not be freed by flush_to_ldisc.
(active == buffer being filled with new data)

The result is simpler, smaller, and faster tty buffer code.

Signed-off-by: Paul Fulghum <paulkf@microgate.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Paul Fulghum and committed by
Linus Torvalds
33b37a33 2c3bb20f

+6 -17
+4 -12
drivers/char/tty_io.c
··· 267 267 p->used = 0; 268 268 p->size = size; 269 269 p->next = NULL; 270 - p->active = 0; 271 270 p->commit = 0; 272 271 p->read = 0; 273 272 p->char_buf_ptr = (char *)(p->data); ··· 326 327 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to 327 328 remove this conditional if its worth it. This would be invisible 328 329 to the callers */ 329 - if ((b = tty->buf.tail) != NULL) { 330 + if ((b = tty->buf.tail) != NULL) 330 331 left = b->size - b->used; 331 - b->active = 1; 332 - } else 332 + else 333 333 left = 0; 334 334 335 335 if (left < size) { ··· 336 338 if ((n = tty_buffer_find(tty, size)) != NULL) { 337 339 if (b != NULL) { 338 340 b->next = n; 339 - b->active = 0; 340 341 b->commit = b->used; 341 342 } else 342 343 tty->buf.head = n; 343 344 tty->buf.tail = n; 344 - n->active = 1; 345 345 } else 346 346 size = left; 347 347 } ··· 400 404 { 401 405 unsigned long flags; 402 406 spin_lock_irqsave(&tty->buf.lock, flags); 403 - if (tty->buf.tail != NULL) { 404 - tty->buf.tail->active = 0; 407 + if (tty->buf.tail != NULL) 405 408 tty->buf.tail->commit = tty->buf.tail->used; 406 - } 407 409 spin_unlock_irqrestore(&tty->buf.lock, flags); 408 410 schedule_delayed_work(&tty->buf.work, 1); 409 411 } ··· 2896 2902 { 2897 2903 unsigned long flags; 2898 2904 spin_lock_irqsave(&tty->buf.lock, flags); 2899 - if (tty->buf.tail != NULL) { 2900 - tty->buf.tail->active = 0; 2905 + if (tty->buf.tail != NULL) 2901 2906 tty->buf.tail->commit = tty->buf.tail->used; 2902 - } 2903 2907 spin_unlock_irqrestore(&tty->buf.lock, flags); 2904 2908 2905 2909 if (tty->low_latency)
+1 -3
include/linux/kbd_kern.h
··· 155 155 { 156 156 unsigned long flags; 157 157 spin_lock_irqsave(&t->buf.lock, flags); 158 - if (t->buf.tail != NULL) { 159 - t->buf.tail->active = 0; 158 + if (t->buf.tail != NULL) 160 159 t->buf.tail->commit = t->buf.tail->used; 161 - } 162 160 spin_unlock_irqrestore(&t->buf.lock, flags); 163 161 schedule_work(&t->buf.work); 164 162 }
-1
include/linux/tty.h
··· 57 57 unsigned char *flag_buf_ptr; 58 58 int used; 59 59 int size; 60 - int active; 61 60 int commit; 62 61 int read; 63 62 /* Data points here */
+1 -1
include/linux/tty_flip.h
··· 12 12 unsigned char ch, char flag) 13 13 { 14 14 struct tty_buffer *tb = tty->buf.tail; 15 - if (tb && tb->active && tb->used < tb->size) { 15 + if (tb && tb->used < tb->size) { 16 16 tb->flag_buf_ptr[tb->used] = flag; 17 17 tb->char_buf_ptr[tb->used++] = ch; 18 18 return 1;