]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/tty/tty_buffer.c
tty: Ensure single-threaded flip buffer consumer with mutex
[mirror_ubuntu-artful-kernel.git] / drivers / tty / tty_buffer.c
CommitLineData
e0495736
AC
1/*
2 * Tty buffer allocation management
3 */
4
5#include <linux/types.h>
6#include <linux/errno.h>
7#include <linux/tty.h>
8#include <linux/tty_driver.h>
9#include <linux/tty_flip.h>
10#include <linux/timer.h>
11#include <linux/string.h>
12#include <linux/slab.h>
13#include <linux/sched.h>
14#include <linux/init.h>
15#include <linux/wait.h>
16#include <linux/bitops.h>
17#include <linux/delay.h>
18#include <linux/module.h>
593fb1ae 19#include <linux/ratelimit.h>
e0495736 20
1cef50e3
PH
21
22#define MIN_TTYB_SIZE 256
23#define TTYB_ALIGN_MASK 255
24
7bfe0b71
PH
25/*
26 * Byte threshold to limit memory consumption for flip buffers.
27 * The actual memory limit is > 2x this amount.
28 */
29#define TTYB_MEM_LIMIT 65536
30
31
32/**
33 * tty_buffer_space_avail - return unused buffer space
34 * @port - tty_port owning the flip buffer
35 *
36 * Returns the # of bytes which can be written by the driver without
37 * reaching the buffer limit.
38 *
39 * Note: this does not guarantee that memory is available to write
40 * the returned # of bytes (use tty_prepare_flip_string_xxx() to
41 * pre-allocate if memory guarantee is required).
42 */
43
44int tty_buffer_space_avail(struct tty_port *port)
45{
46 int space = TTYB_MEM_LIMIT - atomic_read(&port->buf.memory_used);
47 return max(space, 0);
48}
49
9dd5139f
PH
50static void tty_buffer_reset(struct tty_buffer *p, size_t size)
51{
52 p->used = 0;
53 p->size = size;
54 p->next = NULL;
55 p->commit = 0;
56 p->read = 0;
57}
58
e0495736
AC
59/**
60 * tty_buffer_free_all - free buffers used by a tty
61 * @tty: tty to free from
62 *
63 * Remove all the buffers pending on a tty whether queued with data
64 * or in the free ring. Must be called when the tty is no longer in use
e0495736
AC
65 */
66
ecbbfd44 67void tty_buffer_free_all(struct tty_port *port)
e0495736 68{
ecbbfd44 69 struct tty_bufhead *buf = &port->buf;
809850b7
PH
70 struct tty_buffer *p, *next;
71 struct llist_node *llist;
5cff39c6 72
2cf7b67e
PH
73 while ((p = buf->head) != NULL) {
74 buf->head = p->next;
7391ee16
PH
75 if (p->size > 0)
76 kfree(p);
e0495736 77 }
809850b7
PH
78 llist = llist_del_all(&buf->free);
79 llist_for_each_entry_safe(p, next, llist, free)
2cf7b67e 80 kfree(p);
809850b7 81
7391ee16
PH
82 tty_buffer_reset(&buf->sentinel, 0);
83 buf->head = &buf->sentinel;
84 buf->tail = &buf->sentinel;
7bfe0b71
PH
85
86 atomic_set(&buf->memory_used, 0);
e0495736
AC
87}
88
89/**
90 * tty_buffer_alloc - allocate a tty buffer
91 * @tty: tty device
92 * @size: desired size (characters)
93 *
94 * Allocate a new tty buffer to hold the desired number of characters.
11b9faa4
PH
95 * We round our buffers off in 256 character chunks to get better
96 * allocation behaviour.
e0495736
AC
97 * Return NULL if out of memory or the allocation would exceed the
98 * per device queue
e0495736
AC
99 */
100
ecbbfd44 101static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
e0495736 102{
809850b7 103 struct llist_node *free;
e0495736
AC
104 struct tty_buffer *p;
105
11b9faa4
PH
106 /* Round the buffer size out */
107 size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
108
109 if (size <= MIN_TTYB_SIZE) {
809850b7
PH
110 free = llist_del_first(&port->buf.free);
111 if (free) {
112 p = llist_entry(free, struct tty_buffer, free);
11b9faa4
PH
113 goto found;
114 }
115 }
116
117 /* Should possibly check if this fails for the largest buffer we
118 have queued and recycle that ? */
7bfe0b71 119 if (atomic_read(&port->buf.memory_used) > TTYB_MEM_LIMIT)
e0495736
AC
120 return NULL;
121 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
122 if (p == NULL)
123 return NULL;
9dd5139f 124
11b9faa4 125found:
9dd5139f 126 tty_buffer_reset(p, size);
7bfe0b71 127 atomic_add(size, &port->buf.memory_used);
e0495736
AC
128 return p;
129}
130
131/**
132 * tty_buffer_free - free a tty buffer
133 * @tty: tty owning the buffer
134 * @b: the buffer to free
135 *
136 * Free a tty buffer, or add it to the free list according to our
137 * internal strategy
e0495736
AC
138 */
139
ecbbfd44 140static void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)
e0495736 141{
ecbbfd44 142 struct tty_bufhead *buf = &port->buf;
5cff39c6 143
e0495736 144 /* Dumb strategy for now - should keep some stats */
7bfe0b71 145 WARN_ON(atomic_sub_return(b->size, &buf->memory_used) < 0);
e0495736 146
1cef50e3 147 if (b->size > MIN_TTYB_SIZE)
e0495736 148 kfree(b);
7391ee16 149 else if (b->size > 0)
809850b7 150 llist_add(&b->free, &buf->free);
e0495736
AC
151}
152
153/**
154 * __tty_buffer_flush - flush full tty buffers
155 * @tty: tty to flush
156 *
157 * flush all the buffers containing receive data. Caller must
158 * hold the buffer lock and must have ensured no parallel flush to
159 * ldisc is running.
e0495736
AC
160 */
161
ecbbfd44 162static void __tty_buffer_flush(struct tty_port *port)
e0495736 163{
ecbbfd44 164 struct tty_bufhead *buf = &port->buf;
2cf7b67e 165 struct tty_buffer *next;
e0495736 166
2cf7b67e 167 while ((next = buf->head->next) != NULL) {
64325a3b 168 tty_buffer_free(port, buf->head);
2cf7b67e 169 buf->head = next;
e0495736 170 }
64325a3b
IZ
171 WARN_ON(buf->head != buf->tail);
172 buf->head->read = buf->head->commit;
e0495736
AC
173}
174
175/**
176 * tty_buffer_flush - flush full tty buffers
177 * @tty: tty to flush
178 *
179 * flush all the buffers containing receive data. If the buffer is
180 * being processed by flush_to_ldisc then we defer the processing
181 * to that function
182 *
e9975fde
PH
183 * Locking: takes flush_mutex to ensure single-threaded flip buffer
184 * 'consumer'
e0495736
AC
185 */
186
187void tty_buffer_flush(struct tty_struct *tty)
188{
2fc20661 189 struct tty_port *port = tty->port;
ecbbfd44 190 struct tty_bufhead *buf = &port->buf;
e0495736 191
e9975fde 192 mutex_lock(&buf->flush_mutex);
e0495736
AC
193 /* If the data is being pushed to the tty layer then we can't
194 process it here. Instead set a flag and the flush_to_ldisc
195 path will process the flush request before it exits */
2fc20661
JS
196 if (test_bit(TTYP_FLUSHING, &port->iflags)) {
197 set_bit(TTYP_FLUSHPENDING, &port->iflags);
e9975fde 198 mutex_unlock(&buf->flush_mutex);
e0495736 199 wait_event(tty->read_wait,
2fc20661 200 test_bit(TTYP_FLUSHPENDING, &port->iflags) == 0);
e0495736 201 return;
e9975fde
PH
202 }
203
204 __tty_buffer_flush(port);
205 mutex_unlock(&buf->flush_mutex);
e0495736
AC
206}
207
e0495736 208/**
64325a3b 209 * tty_buffer_request_room - grow tty buffer if needed
e0495736
AC
210 * @tty: tty structure
211 * @size: size desired
212 *
213 * Make at least size bytes of linear space available for the tty
214 * buffer. If we fail return the size we managed to find.
e0495736 215 */
64325a3b 216int tty_buffer_request_room(struct tty_port *port, size_t size)
e0495736 217{
ecbbfd44 218 struct tty_bufhead *buf = &port->buf;
e0495736
AC
219 struct tty_buffer *b, *n;
220 int left;
e8437d7e 221
5cff39c6 222 b = buf->tail;
7391ee16 223 left = b->size - b->used;
e0495736
AC
224
225 if (left < size) {
226 /* This is the slow path - looking for new buffers to use */
11b9faa4 227 if ((n = tty_buffer_alloc(port, size)) != NULL) {
5cff39c6 228 buf->tail = n;
e8437d7e
PH
229 b->commit = b->used;
230 smp_mb();
231 b->next = n;
e0495736
AC
232 } else
233 size = left;
234 }
e0495736
AC
235 return size;
236}
237EXPORT_SYMBOL_GPL(tty_buffer_request_room);
238
239/**
2832fc11 240 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer
2f693357 241 * @port: tty port
e0495736 242 * @chars: characters
2832fc11 243 * @flag: flag value for each character
e0495736
AC
244 * @size: size
245 *
246 * Queue a series of bytes to the tty buffering. All the characters
ccc5ca8d 247 * passed are marked with the supplied flag. Returns the number added.
e0495736
AC
248 */
249
2f693357 250int tty_insert_flip_string_fixed_flag(struct tty_port *port,
2832fc11 251 const unsigned char *chars, char flag, size_t size)
e0495736
AC
252{
253 int copied = 0;
254 do {
d4bee0a6 255 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
64325a3b
IZ
256 int space = tty_buffer_request_room(port, goal);
257 struct tty_buffer *tb = port->buf.tail;
7391ee16 258 if (unlikely(space == 0))
e0495736 259 break;
1fc359fc
PH
260 memcpy(char_buf_ptr(tb, tb->used), chars, space);
261 memset(flag_buf_ptr(tb, tb->used), flag, space);
e0495736
AC
262 tb->used += space;
263 copied += space;
264 chars += space;
265 /* There is a small chance that we need to split the data over
266 several buffers. If this is the case we must loop */
267 } while (unlikely(size > copied));
268 return copied;
269}
2832fc11 270EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
e0495736
AC
271
272/**
273 * tty_insert_flip_string_flags - Add characters to the tty buffer
2f693357 274 * @port: tty port
e0495736
AC
275 * @chars: characters
276 * @flags: flag bytes
277 * @size: size
278 *
279 * Queue a series of bytes to the tty buffering. For each character
280 * the flags array indicates the status of the character. Returns the
281 * number added.
e0495736
AC
282 */
283
2f693357 284int tty_insert_flip_string_flags(struct tty_port *port,
e0495736
AC
285 const unsigned char *chars, const char *flags, size_t size)
286{
287 int copied = 0;
288 do {
d4bee0a6 289 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
64325a3b
IZ
290 int space = tty_buffer_request_room(port, goal);
291 struct tty_buffer *tb = port->buf.tail;
7391ee16 292 if (unlikely(space == 0))
e0495736 293 break;
1fc359fc
PH
294 memcpy(char_buf_ptr(tb, tb->used), chars, space);
295 memcpy(flag_buf_ptr(tb, tb->used), flags, space);
e0495736
AC
296 tb->used += space;
297 copied += space;
298 chars += space;
299 flags += space;
300 /* There is a small chance that we need to split the data over
301 several buffers. If this is the case we must loop */
302 } while (unlikely(size > copied));
303 return copied;
304}
305EXPORT_SYMBOL(tty_insert_flip_string_flags);
306
307/**
308 * tty_schedule_flip - push characters to ldisc
6732c8bb 309 * @port: tty port to push from
e0495736
AC
310 *
311 * Takes any pending buffers and transfers their ownership to the
312 * ldisc side of the queue. It then schedules those characters for
313 * processing by the line discipline.
cee4ad1e
IS
314 * Note that this function can only be used when the low_latency flag
315 * is unset. Otherwise the workqueue won't be flushed.
e0495736
AC
316 */
317
6732c8bb 318void tty_schedule_flip(struct tty_port *port)
e0495736 319{
6732c8bb 320 struct tty_bufhead *buf = &port->buf;
6732c8bb 321 WARN_ON(port->low_latency);
5cff39c6 322
7391ee16 323 buf->tail->commit = buf->tail->used;
5cff39c6 324 schedule_work(&buf->work);
e0495736
AC
325}
326EXPORT_SYMBOL(tty_schedule_flip);
327
328/**
329 * tty_prepare_flip_string - make room for characters
2f693357 330 * @port: tty port
e0495736
AC
331 * @chars: return pointer for character write area
332 * @size: desired size
333 *
334 * Prepare a block of space in the buffer for data. Returns the length
335 * available and buffer pointer to the space which is now allocated and
336 * accounted for as ready for normal characters. This is used for drivers
337 * that need their own block copy routines into the buffer. There is no
338 * guarantee the buffer is a DMA target!
e0495736
AC
339 */
340
2f693357 341int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
ecbbfd44 342 size_t size)
e0495736 343{
64325a3b 344 int space = tty_buffer_request_room(port, size);
e0495736 345 if (likely(space)) {
64325a3b 346 struct tty_buffer *tb = port->buf.tail;
1fc359fc
PH
347 *chars = char_buf_ptr(tb, tb->used);
348 memset(flag_buf_ptr(tb, tb->used), TTY_NORMAL, space);
e0495736
AC
349 tb->used += space;
350 }
351 return space;
352}
353EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
354
355/**
356 * tty_prepare_flip_string_flags - make room for characters
2f693357 357 * @port: tty port
e0495736
AC
358 * @chars: return pointer for character write area
359 * @flags: return pointer for status flag write area
360 * @size: desired size
361 *
362 * Prepare a block of space in the buffer for data. Returns the length
363 * available and buffer pointer to the space which is now allocated and
364 * accounted for as ready for characters. This is used for drivers
365 * that need their own block copy routines into the buffer. There is no
366 * guarantee the buffer is a DMA target!
e0495736
AC
367 */
368
2f693357 369int tty_prepare_flip_string_flags(struct tty_port *port,
e0495736
AC
370 unsigned char **chars, char **flags, size_t size)
371{
64325a3b 372 int space = tty_buffer_request_room(port, size);
e0495736 373 if (likely(space)) {
64325a3b 374 struct tty_buffer *tb = port->buf.tail;
1fc359fc
PH
375 *chars = char_buf_ptr(tb, tb->used);
376 *flags = flag_buf_ptr(tb, tb->used);
e0495736
AC
377 tb->used += space;
378 }
379 return space;
380}
381EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
382
383
da261e7f
PH
384static int
385receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
386{
387 struct tty_ldisc *disc = tty->ldisc;
1fc359fc
PH
388 unsigned char *p = char_buf_ptr(head, head->read);
389 char *f = flag_buf_ptr(head, head->read);
da261e7f 390
24a89d1c
PH
391 if (disc->ops->receive_buf2)
392 count = disc->ops->receive_buf2(tty, p, f, count);
393 else {
394 count = min_t(int, count, tty->receive_room);
395 if (count)
396 disc->ops->receive_buf(tty, p, f, count);
397 }
da261e7f
PH
398 head->read += count;
399 return count;
400}
e0495736
AC
401
402/**
403 * flush_to_ldisc
404 * @work: tty structure passed from work queue.
405 *
406 * This routine is called out of the software interrupt to flush data
407 * from the buffer chain to the line discipline.
408 *
e9975fde
PH
409 * The receive_buf method is single threaded for each tty instance.
410 *
411 * Locking: takes flush_mutex to ensure single-threaded flip buffer
412 * 'consumer'
e0495736
AC
413 */
414
415static void flush_to_ldisc(struct work_struct *work)
416{
ecbbfd44
JS
417 struct tty_port *port = container_of(work, struct tty_port, buf.work);
418 struct tty_bufhead *buf = &port->buf;
419 struct tty_struct *tty;
e0495736 420 struct tty_ldisc *disc;
e0495736 421
ecbbfd44 422 tty = port->itty;
34dcfb84 423 if (tty == NULL)
ecbbfd44
JS
424 return;
425
e0495736 426 disc = tty_ldisc_ref(tty);
36697529 427 if (disc == NULL)
e0495736
AC
428 return;
429
e9975fde 430 mutex_lock(&buf->flush_mutex);
45242006 431
2fc20661 432 if (!test_and_set_bit(TTYP_FLUSHING, &port->iflags)) {
7391ee16
PH
433 while (1) {
434 struct tty_buffer *head = buf->head;
45242006 435 int count;
45242006
LT
436
437 count = head->commit - head->read;
e0495736
AC
438 if (!count) {
439 if (head->next == NULL)
440 break;
5cff39c6 441 buf->head = head->next;
ecbbfd44 442 tty_buffer_free(port, head);
e0495736
AC
443 continue;
444 }
e9975fde
PH
445
446 mutex_unlock(&buf->flush_mutex);
da261e7f
PH
447
448 count = receive_buf(tty, head, count);
449
e9975fde
PH
450 mutex_lock(&buf->flush_mutex);
451
39f610e4
PH
452 /* Ldisc or user is trying to flush the buffers.
453 We may have a deferred request to flush the
454 input buffer, if so pull the chain under the lock
455 and empty the queue */
456 if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) {
457 __tty_buffer_flush(port);
458 clear_bit(TTYP_FLUSHPENDING, &port->iflags);
459 wake_up(&tty->read_wait);
460 break;
da261e7f
PH
461 } else if (!count)
462 break;
e0495736 463 }
2fc20661 464 clear_bit(TTYP_FLUSHING, &port->iflags);
e0495736 465 }
45242006 466
e9975fde 467 mutex_unlock(&buf->flush_mutex);
e0495736
AC
468
469 tty_ldisc_deref(disc);
470}
471
e043e42b
OH
472/**
473 * tty_flush_to_ldisc
474 * @tty: tty to push
475 *
476 * Push the terminal flip buffers to the line discipline.
477 *
478 * Must not be called from IRQ context.
479 */
480void tty_flush_to_ldisc(struct tty_struct *tty)
481{
d6c53c0e 482 if (!tty->port->low_latency)
ecbbfd44 483 flush_work(&tty->port->buf.work);
e043e42b
OH
484}
485
e0495736
AC
486/**
487 * tty_flip_buffer_push - terminal
2e124b4a 488 * @port: tty port to push
e0495736
AC
489 *
490 * Queue a push of the terminal flip buffers to the line discipline. This
d6c53c0e
JS
491 * function must not be called from IRQ context if port->low_latency is
492 * set.
e0495736
AC
493 *
494 * In the event of the queue being busy for flipping the work will be
495 * held off and retried later.
e0495736
AC
496 */
497
2e124b4a 498void tty_flip_buffer_push(struct tty_port *port)
e0495736 499{
2e124b4a 500 struct tty_bufhead *buf = &port->buf;
5cff39c6 501
7391ee16 502 buf->tail->commit = buf->tail->used;
e0495736 503
2e124b4a 504 if (port->low_latency)
5cff39c6 505 flush_to_ldisc(&buf->work);
e0495736 506 else
5cff39c6 507 schedule_work(&buf->work);
e0495736
AC
508}
509EXPORT_SYMBOL(tty_flip_buffer_push);
510
511/**
512 * tty_buffer_init - prepare a tty buffer structure
513 * @tty: tty to initialise
514 *
515 * Set up the initial state of the buffer management for a tty device.
516 * Must be called before the other tty buffer functions are used.
e0495736
AC
517 */
518
ecbbfd44 519void tty_buffer_init(struct tty_port *port)
e0495736 520{
ecbbfd44 521 struct tty_bufhead *buf = &port->buf;
5cff39c6 522
e9975fde 523 mutex_init(&buf->flush_mutex);
7391ee16
PH
524 tty_buffer_reset(&buf->sentinel, 0);
525 buf->head = &buf->sentinel;
526 buf->tail = &buf->sentinel;
809850b7 527 init_llist_head(&buf->free);
7bfe0b71 528 atomic_set(&buf->memory_used, 0);
5cff39c6 529 INIT_WORK(&buf->work, flush_to_ldisc);
e0495736
AC
530}
531