tty: Fix flip buffer free list
authorPeter Hurley <peter@hurleysoftware.com>
Sat, 15 Jun 2013 13:36:02 +0000 (09:36 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2013 23:47:07 +0000 (16:47 -0700)
Since flip buffers are size-aligned to 256 bytes and all flip
buffers 512-bytes or larger are not added to the free list, the
free list only contains 256-byte flip buffers.

Remove the list search when allocating a new flip buffer.

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

index 170674cb68fc6457abd18f2a627cbe212453d1b5..a5e396217f765e7076d70257e966da0466a74445 100644 (file)
 #include <linux/module.h>
 #include <linux/ratelimit.h>
 
+
+#define MIN_TTYB_SIZE  256
+#define TTYB_ALIGN_MASK        255
+
 /**
  *     tty_buffer_free_all             -       free buffers used by a tty
  *     @tty: tty to free from
@@ -94,7 +98,7 @@ static void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)
        buf->memory_used -= b->size;
        WARN_ON(buf->memory_used < 0);
 
-       if (b->size >= 512)
+       if (b->size > MIN_TTYB_SIZE)
                kfree(b);
        else {
                b->next = buf->free;
@@ -176,9 +180,10 @@ void tty_buffer_flush(struct tty_struct *tty)
 static struct tty_buffer *tty_buffer_find(struct tty_port *port, size_t size)
 {
        struct tty_buffer **tbh = &port->buf.free;
-       while ((*tbh) != NULL) {
-               struct tty_buffer *t = *tbh;
-               if (t->size >= size) {
+       if (size <= MIN_TTYB_SIZE) {
+               if (*tbh) {
+                       struct tty_buffer *t = *tbh;
+
                        *tbh = t->next;
                        t->next = NULL;
                        t->used = 0;
@@ -187,10 +192,9 @@ static struct tty_buffer *tty_buffer_find(struct tty_port *port, size_t size)
                        port->buf.memory_used += t->size;
                        return t;
                }
-               tbh = &((*tbh)->next);
        }
        /* Round the buffer size out */
-       size = (size + 0xFF) & ~0xFF;
+       size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
        return tty_buffer_alloc(port, size);
        /* Should possibly check if this fails for the largest buffer we
           have queued and recycle that ? */