aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorPeter Hurley <peter@hurleysoftware.com>2013-11-22 12:09:55 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-08 19:57:38 -0500
commit4d18e6eff81e1d4d81d0942d5b7e96904b3b32df (patch)
treea6c66c84189a50bff8b6b05a7187a8cda4b67cfc /drivers/tty
parent82f91fe092b6eacd82e976b8955443f9fd97d07e (diff)
tty: Enable configurable tty flip buffer limit
Allow driver to configure its maximum flip buffer memory consumption/limit. This is necessary for very-high speed line rates (in excess of 10MB/sec) because the flip buffers can be saturated before the line discipline has a chance to throttle the input. Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/tty_buffer.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
index c043136fbe51..57eb34b2ec24 100644
--- a/drivers/tty/tty_buffer.c
+++ b/drivers/tty/tty_buffer.c
@@ -26,7 +26,7 @@
26 * Byte threshold to limit memory consumption for flip buffers. 26 * Byte threshold to limit memory consumption for flip buffers.
27 * The actual memory limit is > 2x this amount. 27 * The actual memory limit is > 2x this amount.
28 */ 28 */
29#define TTYB_MEM_LIMIT 65536 29#define TTYB_DEFAULT_MEM_LIMIT 65536
30 30
31/* 31/*
32 * We default to dicing tty buffer allocations to this many characters 32 * We default to dicing tty buffer allocations to this many characters
@@ -89,7 +89,7 @@ void tty_buffer_unlock_exclusive(struct tty_port *port)
89 89
90int tty_buffer_space_avail(struct tty_port *port) 90int tty_buffer_space_avail(struct tty_port *port)
91{ 91{
92 int space = TTYB_MEM_LIMIT - atomic_read(&port->buf.memory_used); 92 int space = port->buf.mem_limit - atomic_read(&port->buf.memory_used);
93 return max(space, 0); 93 return max(space, 0);
94} 94}
95 95
@@ -162,7 +162,7 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
162 162
163 /* Should possibly check if this fails for the largest buffer we 163 /* Should possibly check if this fails for the largest buffer we
164 have queued and recycle that ? */ 164 have queued and recycle that ? */
165 if (atomic_read(&port->buf.memory_used) > TTYB_MEM_LIMIT) 165 if (atomic_read(&port->buf.memory_used) > port->buf.mem_limit)
166 return NULL; 166 return NULL;
167 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC); 167 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
168 if (p == NULL) 168 if (p == NULL)
@@ -536,4 +536,22 @@ void tty_buffer_init(struct tty_port *port)
536 atomic_set(&buf->memory_used, 0); 536 atomic_set(&buf->memory_used, 0);
537 atomic_set(&buf->priority, 0); 537 atomic_set(&buf->priority, 0);
538 INIT_WORK(&buf->work, flush_to_ldisc); 538 INIT_WORK(&buf->work, flush_to_ldisc);
539 buf->mem_limit = TTYB_DEFAULT_MEM_LIMIT;
539} 540}
541
542/**
543 * tty_buffer_set_limit - change the tty buffer memory limit
544 * @port: tty port to change
545 *
546 * Change the tty buffer memory limit.
547 * Must be called before the other tty buffer functions are used.
548 */
549
550int tty_buffer_set_limit(struct tty_port *port, int limit)
551{
552 if (limit < MIN_TTYB_SIZE)
553 return -EINVAL;
554 port->buf.mem_limit = limit;
555 return 0;
556}
557EXPORT_SYMBOL_GPL(tty_buffer_set_limit);