From: Peter Hurley Date: Sat, 15 Jun 2013 13:36:04 +0000 (-0400) Subject: tty: Merge tty_buffer_find() into tty_buffer_alloc() X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=11b9faa44df76189b8346ff602a2c01c610c37eb;p=linux-beck.git tty: Merge tty_buffer_find() into tty_buffer_alloc() tty_buffer_find() implements a simple free list lookaside cache. Merge this functionality into tty_buffer_alloc() to reflect the more traditional alloc/free symmetry. Signed-off-by: Peter Hurley Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 56d460295c87..a428fa2f7259 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c @@ -64,6 +64,8 @@ void tty_buffer_free_all(struct tty_port *port) * @size: desired size (characters) * * Allocate a new tty buffer to hold the desired number of characters. + * We round our buffers off in 256 character chunks to get better + * allocation behaviour. * Return NULL if out of memory or the allocation would exceed the * per device queue * @@ -72,14 +74,29 @@ void tty_buffer_free_all(struct tty_port *port) static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size) { + struct tty_buffer **tbh = &port->buf.free; struct tty_buffer *p; + /* Round the buffer size out */ + size = __ALIGN_MASK(size, TTYB_ALIGN_MASK); + + if (size <= MIN_TTYB_SIZE) { + if (*tbh) { + p = *tbh; + *tbh = p->next; + goto found; + } + } + + /* Should possibly check if this fails for the largest buffer we + have queued and recycle that ? */ if (port->buf.memory_used + size > 65536) return NULL; p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC); if (p == NULL) return NULL; +found: tty_buffer_reset(p, size); port->buf.memory_used += size; return p; @@ -171,37 +188,6 @@ void tty_buffer_flush(struct tty_struct *tty) spin_unlock_irqrestore(&buf->lock, flags); } -/** - * tty_buffer_find - find a free tty buffer - * @tty: tty owning the buffer - * @size: characters wanted - * - * Locate an existing suitable tty buffer or if we are lacking one then - * allocate a new one. We round our buffers off in 256 character chunks - * to get better allocation behaviour. - * - * Locking: Caller must hold tty->buf.lock - */ - -static struct tty_buffer *tty_buffer_find(struct tty_port *port, size_t size) -{ - struct tty_buffer **tbh = &port->buf.free; - if (size <= MIN_TTYB_SIZE) { - if (*tbh) { - struct tty_buffer *t = *tbh; - - *tbh = t->next; - tty_buffer_reset(t, t->size); - port->buf.memory_used += t->size; - return t; - } - } - /* Round the buffer size out */ - 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 ? */ -} /** * tty_buffer_request_room - grow tty buffer if needed * @tty: tty structure @@ -230,7 +216,7 @@ int tty_buffer_request_room(struct tty_port *port, size_t size) if (left < size) { /* This is the slow path - looking for new buffers to use */ - if ((n = tty_buffer_find(port, size)) != NULL) { + if ((n = tty_buffer_alloc(port, size)) != NULL) { if (b != NULL) { b->next = n; b->commit = b->used;