Эх сурвалжийг харах

[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>
Paul Fulghum 19 жил өмнө
parent
commit
33b37a33c2

+ 4 - 12
drivers/char/tty_io.c

@@ -267,7 +267,6 @@ static struct tty_buffer *tty_buffer_alloc(size_t size)
 	p->used = 0;
 	p->used = 0;
 	p->size = size;
 	p->size = size;
 	p->next = NULL;
 	p->next = NULL;
-	p->active = 0;
 	p->commit = 0;
 	p->commit = 0;
 	p->read = 0;
 	p->read = 0;
 	p->char_buf_ptr = (char *)(p->data);
 	p->char_buf_ptr = (char *)(p->data);
@@ -327,10 +326,9 @@ int tty_buffer_request_room(struct tty_struct *tty, size_t size)
 	/* OPTIMISATION: We could keep a per tty "zero" sized buffer to
 	/* OPTIMISATION: We could keep a per tty "zero" sized buffer to
 	   remove this conditional if its worth it. This would be invisible
 	   remove this conditional if its worth it. This would be invisible
 	   to the callers */
 	   to the callers */
-	if ((b = tty->buf.tail) != NULL) {
+	if ((b = tty->buf.tail) != NULL)
 		left = b->size - b->used;
 		left = b->size - b->used;
-		b->active = 1;
-	} else
+	else
 		left = 0;
 		left = 0;
 
 
 	if (left < size) {
 	if (left < size) {
@@ -338,12 +336,10 @@ int tty_buffer_request_room(struct tty_struct *tty, size_t size)
 		if ((n = tty_buffer_find(tty, size)) != NULL) {
 		if ((n = tty_buffer_find(tty, size)) != NULL) {
 			if (b != NULL) {
 			if (b != NULL) {
 				b->next = n;
 				b->next = n;
-				b->active = 0;
 				b->commit = b->used;
 				b->commit = b->used;
 			} else
 			} else
 				tty->buf.head = n;
 				tty->buf.head = n;
 			tty->buf.tail = n;
 			tty->buf.tail = n;
-			n->active = 1;
 		} else
 		} else
 			size = left;
 			size = left;
 	}
 	}
@@ -404,10 +400,8 @@ void tty_schedule_flip(struct tty_struct *tty)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&tty->buf.lock, flags);
 	spin_lock_irqsave(&tty->buf.lock, flags);
-	if (tty->buf.tail != NULL) {
-		tty->buf.tail->active = 0;
+	if (tty->buf.tail != NULL)
 		tty->buf.tail->commit = tty->buf.tail->used;
 		tty->buf.tail->commit = tty->buf.tail->used;
-	}
 	spin_unlock_irqrestore(&tty->buf.lock, flags);
 	spin_unlock_irqrestore(&tty->buf.lock, flags);
 	schedule_delayed_work(&tty->buf.work, 1);
 	schedule_delayed_work(&tty->buf.work, 1);
 }
 }
@@ -2902,10 +2896,8 @@ void tty_flip_buffer_push(struct tty_struct *tty)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&tty->buf.lock, flags);
 	spin_lock_irqsave(&tty->buf.lock, flags);
-	if (tty->buf.tail != NULL) {
-		tty->buf.tail->active = 0;
+	if (tty->buf.tail != NULL)
 		tty->buf.tail->commit = tty->buf.tail->used;
 		tty->buf.tail->commit = tty->buf.tail->used;
-	}
 	spin_unlock_irqrestore(&tty->buf.lock, flags);
 	spin_unlock_irqrestore(&tty->buf.lock, flags);
 
 
 	if (tty->low_latency)
 	if (tty->low_latency)

+ 1 - 3
include/linux/kbd_kern.h

@@ -155,10 +155,8 @@ static inline void con_schedule_flip(struct tty_struct *t)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 	spin_lock_irqsave(&t->buf.lock, flags);
 	spin_lock_irqsave(&t->buf.lock, flags);
-	if (t->buf.tail != NULL) {
-		t->buf.tail->active = 0;
+	if (t->buf.tail != NULL)
 		t->buf.tail->commit = t->buf.tail->used;
 		t->buf.tail->commit = t->buf.tail->used;
-	}
 	spin_unlock_irqrestore(&t->buf.lock, flags);
 	spin_unlock_irqrestore(&t->buf.lock, flags);
 	schedule_work(&t->buf.work);
 	schedule_work(&t->buf.work);
 }
 }

+ 0 - 1
include/linux/tty.h

@@ -57,7 +57,6 @@ struct tty_buffer {
 	unsigned char *flag_buf_ptr;
 	unsigned char *flag_buf_ptr;
 	int used;
 	int used;
 	int size;
 	int size;
-	int active;
 	int commit;
 	int commit;
 	int read;
 	int read;
 	/* Data points here */
 	/* Data points here */

+ 1 - 1
include/linux/tty_flip.h

@@ -12,7 +12,7 @@ static inline int tty_insert_flip_char(struct tty_struct *tty,
 					unsigned char ch, char flag)
 					unsigned char ch, char flag)
 {
 {
 	struct tty_buffer *tb = tty->buf.tail;
 	struct tty_buffer *tb = tty->buf.tail;
-	if (tb && tb->active && tb->used < tb->size) {
+	if (tb && tb->used < tb->size) {
 		tb->flag_buf_ptr[tb->used] = flag;
 		tb->flag_buf_ptr[tb->used] = flag;
 		tb->char_buf_ptr[tb->used++] = ch;
 		tb->char_buf_ptr[tb->used++] = ch;
 		return 1;
 		return 1;