blob: 069640e5b9c0eb95fca133525d9beaaf75391770 [file] [log] [blame]
Alan Coxe0495732008-10-13 10:36:58 +01001/*
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>
George Spelvin593fb1ae42013-02-12 02:00:43 -050019#include <linux/ratelimit.h>
Alan Coxe0495732008-10-13 10:36:58 +010020
Peter Hurley1cef50e2013-06-15 09:36:02 -040021
22#define MIN_TTYB_SIZE 256
23#define TTYB_ALIGN_MASK 255
24
Peter Hurley9dd51392013-06-15 09:36:03 -040025static void tty_buffer_reset(struct tty_buffer *p, size_t size)
26{
27 p->used = 0;
28 p->size = size;
29 p->next = NULL;
30 p->commit = 0;
31 p->read = 0;
32}
33
Alan Coxe0495732008-10-13 10:36:58 +010034/**
35 * tty_buffer_free_all - free buffers used by a tty
36 * @tty: tty to free from
37 *
38 * Remove all the buffers pending on a tty whether queued with data
39 * or in the free ring. Must be called when the tty is no longer in use
40 *
41 * Locking: none
42 */
43
Jiri Slabyecbbfd42012-10-18 22:26:47 +020044void tty_buffer_free_all(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +010045{
Jiri Slabyecbbfd42012-10-18 22:26:47 +020046 struct tty_bufhead *buf = &port->buf;
Peter Hurley809850b2013-06-15 09:36:06 -040047 struct tty_buffer *p, *next;
48 struct llist_node *llist;
Jiri Slaby5cff39c2012-10-18 22:26:45 +020049
Peter Hurley2cf7b672013-06-15 09:36:05 -040050 while ((p = buf->head) != NULL) {
51 buf->head = p->next;
52 kfree(p);
Alan Coxe0495732008-10-13 10:36:58 +010053 }
Peter Hurley809850b2013-06-15 09:36:06 -040054 llist = llist_del_all(&buf->free);
55 llist_for_each_entry_safe(p, next, llist, free)
Peter Hurley2cf7b672013-06-15 09:36:05 -040056 kfree(p);
Peter Hurley809850b2013-06-15 09:36:06 -040057
Jiri Slaby5cff39c2012-10-18 22:26:45 +020058 buf->tail = NULL;
59 buf->memory_used = 0;
Alan Coxe0495732008-10-13 10:36:58 +010060}
61
62/**
63 * tty_buffer_alloc - allocate a tty buffer
64 * @tty: tty device
65 * @size: desired size (characters)
66 *
67 * Allocate a new tty buffer to hold the desired number of characters.
Peter Hurley11b9faa2013-06-15 09:36:04 -040068 * We round our buffers off in 256 character chunks to get better
69 * allocation behaviour.
Alan Coxe0495732008-10-13 10:36:58 +010070 * Return NULL if out of memory or the allocation would exceed the
71 * per device queue
Alan Coxe0495732008-10-13 10:36:58 +010072 */
73
Jiri Slabyecbbfd42012-10-18 22:26:47 +020074static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +010075{
Peter Hurley809850b2013-06-15 09:36:06 -040076 struct llist_node *free;
Alan Coxe0495732008-10-13 10:36:58 +010077 struct tty_buffer *p;
78
Peter Hurley11b9faa2013-06-15 09:36:04 -040079 /* Round the buffer size out */
80 size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
81
82 if (size <= MIN_TTYB_SIZE) {
Peter Hurley809850b2013-06-15 09:36:06 -040083 free = llist_del_first(&port->buf.free);
84 if (free) {
85 p = llist_entry(free, struct tty_buffer, free);
Peter Hurley11b9faa2013-06-15 09:36:04 -040086 goto found;
87 }
88 }
89
90 /* Should possibly check if this fails for the largest buffer we
91 have queued and recycle that ? */
Jiri Slabyecbbfd42012-10-18 22:26:47 +020092 if (port->buf.memory_used + size > 65536)
Alan Coxe0495732008-10-13 10:36:58 +010093 return NULL;
94 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
95 if (p == NULL)
96 return NULL;
Peter Hurley9dd51392013-06-15 09:36:03 -040097
Peter Hurley11b9faa2013-06-15 09:36:04 -040098found:
Peter Hurley9dd51392013-06-15 09:36:03 -040099 tty_buffer_reset(p, size);
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200100 port->buf.memory_used += size;
Alan Coxe0495732008-10-13 10:36:58 +0100101 return p;
102}
103
104/**
105 * tty_buffer_free - free a tty buffer
106 * @tty: tty owning the buffer
107 * @b: the buffer to free
108 *
109 * Free a tty buffer, or add it to the free list according to our
110 * internal strategy
Alan Coxe0495732008-10-13 10:36:58 +0100111 */
112
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200113static void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)
Alan Coxe0495732008-10-13 10:36:58 +0100114{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200115 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200116
Alan Coxe0495732008-10-13 10:36:58 +0100117 /* Dumb strategy for now - should keep some stats */
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200118 buf->memory_used -= b->size;
119 WARN_ON(buf->memory_used < 0);
Alan Coxe0495732008-10-13 10:36:58 +0100120
Peter Hurley1cef50e2013-06-15 09:36:02 -0400121 if (b->size > MIN_TTYB_SIZE)
Alan Coxe0495732008-10-13 10:36:58 +0100122 kfree(b);
Peter Hurley809850b2013-06-15 09:36:06 -0400123 else
124 llist_add(&b->free, &buf->free);
Alan Coxe0495732008-10-13 10:36:58 +0100125}
126
127/**
128 * __tty_buffer_flush - flush full tty buffers
129 * @tty: tty to flush
130 *
131 * flush all the buffers containing receive data. Caller must
132 * hold the buffer lock and must have ensured no parallel flush to
133 * ldisc is running.
134 *
135 * Locking: Caller must hold tty->buf.lock
136 */
137
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200138static void __tty_buffer_flush(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100139{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200140 struct tty_bufhead *buf = &port->buf;
Peter Hurley2cf7b672013-06-15 09:36:05 -0400141 struct tty_buffer *next;
Alan Coxe0495732008-10-13 10:36:58 +0100142
Ilya Zykov64325a32013-01-19 18:16:20 +0400143 if (unlikely(buf->head == NULL))
144 return;
Peter Hurley2cf7b672013-06-15 09:36:05 -0400145 while ((next = buf->head->next) != NULL) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400146 tty_buffer_free(port, buf->head);
Peter Hurley2cf7b672013-06-15 09:36:05 -0400147 buf->head = next;
Alan Coxe0495732008-10-13 10:36:58 +0100148 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400149 WARN_ON(buf->head != buf->tail);
150 buf->head->read = buf->head->commit;
Alan Coxe0495732008-10-13 10:36:58 +0100151}
152
153/**
154 * tty_buffer_flush - flush full tty buffers
155 * @tty: tty to flush
156 *
157 * flush all the buffers containing receive data. If the buffer is
158 * being processed by flush_to_ldisc then we defer the processing
159 * to that function
160 *
161 * Locking: none
162 */
163
164void tty_buffer_flush(struct tty_struct *tty)
165{
Jiri Slaby2fc20662012-10-18 22:26:44 +0200166 struct tty_port *port = tty->port;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200167 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100168 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200169
170 spin_lock_irqsave(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100171
172 /* If the data is being pushed to the tty layer then we can't
173 process it here. Instead set a flag and the flush_to_ldisc
174 path will process the flush request before it exits */
Jiri Slaby2fc20662012-10-18 22:26:44 +0200175 if (test_bit(TTYP_FLUSHING, &port->iflags)) {
176 set_bit(TTYP_FLUSHPENDING, &port->iflags);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200177 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100178 wait_event(tty->read_wait,
Jiri Slaby2fc20662012-10-18 22:26:44 +0200179 test_bit(TTYP_FLUSHPENDING, &port->iflags) == 0);
Alan Coxe0495732008-10-13 10:36:58 +0100180 return;
181 } else
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200182 __tty_buffer_flush(port);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200183 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100184}
185
186/**
Ilya Zykov64325a32013-01-19 18:16:20 +0400187 * tty_buffer_request_room - grow tty buffer if needed
Alan Coxe0495732008-10-13 10:36:58 +0100188 * @tty: tty structure
189 * @size: size desired
190 *
191 * Make at least size bytes of linear space available for the tty
192 * buffer. If we fail return the size we managed to find.
Ilya Zykov64325a32013-01-19 18:16:20 +0400193 *
194 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100195 */
Ilya Zykov64325a32013-01-19 18:16:20 +0400196int tty_buffer_request_room(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100197{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200198 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100199 struct tty_buffer *b, *n;
200 int left;
Ilya Zykov64325a32013-01-19 18:16:20 +0400201 unsigned long flags;
202 spin_lock_irqsave(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100203 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to
204 remove this conditional if its worth it. This would be invisible
205 to the callers */
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200206 b = buf->tail;
207 if (b != NULL)
Alan Coxe0495732008-10-13 10:36:58 +0100208 left = b->size - b->used;
209 else
210 left = 0;
211
212 if (left < size) {
213 /* This is the slow path - looking for new buffers to use */
Peter Hurley11b9faa2013-06-15 09:36:04 -0400214 if ((n = tty_buffer_alloc(port, size)) != NULL) {
Alan Coxe0495732008-10-13 10:36:58 +0100215 if (b != NULL) {
216 b->next = n;
217 b->commit = b->used;
218 } else
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200219 buf->head = n;
220 buf->tail = n;
Alan Coxe0495732008-10-13 10:36:58 +0100221 } else
222 size = left;
223 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400224 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100225 return size;
226}
227EXPORT_SYMBOL_GPL(tty_buffer_request_room);
228
229/**
Alan Cox2832fc12010-02-18 16:43:54 +0000230 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100231 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100232 * @chars: characters
Alan Cox2832fc12010-02-18 16:43:54 +0000233 * @flag: flag value for each character
Alan Coxe0495732008-10-13 10:36:58 +0100234 * @size: size
235 *
236 * Queue a series of bytes to the tty buffering. All the characters
Johan Hovoldccc5ca82010-05-07 19:58:32 +0200237 * passed are marked with the supplied flag. Returns the number added.
Alan Coxe0495732008-10-13 10:36:58 +0100238 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200239 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100240 */
241
Jiri Slaby2f693352013-01-03 15:53:02 +0100242int tty_insert_flip_string_fixed_flag(struct tty_port *port,
Alan Cox2832fc12010-02-18 16:43:54 +0000243 const unsigned char *chars, char flag, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100244{
245 int copied = 0;
246 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800247 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400248 int space = tty_buffer_request_room(port, goal);
249 struct tty_buffer *tb = port->buf.tail;
Alan Coxe0495732008-10-13 10:36:58 +0100250 /* If there is no space then tb may be NULL */
Xiaobing Tuc56a00a2012-03-16 03:00:26 +0000251 if (unlikely(space == 0)) {
Alan Coxe0495732008-10-13 10:36:58 +0100252 break;
Xiaobing Tuc56a00a2012-03-16 03:00:26 +0000253 }
Peter Hurley1fc359f2013-06-15 09:36:01 -0400254 memcpy(char_buf_ptr(tb, tb->used), chars, space);
255 memset(flag_buf_ptr(tb, tb->used), flag, space);
Alan Coxe0495732008-10-13 10:36:58 +0100256 tb->used += space;
257 copied += space;
258 chars += space;
259 /* There is a small chance that we need to split the data over
260 several buffers. If this is the case we must loop */
261 } while (unlikely(size > copied));
262 return copied;
263}
Alan Cox2832fc12010-02-18 16:43:54 +0000264EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
Alan Coxe0495732008-10-13 10:36:58 +0100265
266/**
267 * tty_insert_flip_string_flags - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100268 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100269 * @chars: characters
270 * @flags: flag bytes
271 * @size: size
272 *
273 * Queue a series of bytes to the tty buffering. For each character
274 * the flags array indicates the status of the character. Returns the
275 * number added.
276 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200277 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100278 */
279
Jiri Slaby2f693352013-01-03 15:53:02 +0100280int tty_insert_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100281 const unsigned char *chars, const char *flags, size_t size)
282{
283 int copied = 0;
284 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800285 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400286 int space = tty_buffer_request_room(port, goal);
287 struct tty_buffer *tb = port->buf.tail;
Alan Coxe0495732008-10-13 10:36:58 +0100288 /* If there is no space then tb may be NULL */
Xiaobing Tuc56a00a2012-03-16 03:00:26 +0000289 if (unlikely(space == 0)) {
Alan Coxe0495732008-10-13 10:36:58 +0100290 break;
Xiaobing Tuc56a00a2012-03-16 03:00:26 +0000291 }
Peter Hurley1fc359f2013-06-15 09:36:01 -0400292 memcpy(char_buf_ptr(tb, tb->used), chars, space);
293 memcpy(flag_buf_ptr(tb, tb->used), flags, space);
Alan Coxe0495732008-10-13 10:36:58 +0100294 tb->used += space;
295 copied += space;
296 chars += space;
297 flags += space;
298 /* There is a small chance that we need to split the data over
299 several buffers. If this is the case we must loop */
300 } while (unlikely(size > copied));
301 return copied;
302}
303EXPORT_SYMBOL(tty_insert_flip_string_flags);
304
305/**
306 * tty_schedule_flip - push characters to ldisc
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100307 * @port: tty port to push from
Alan Coxe0495732008-10-13 10:36:58 +0100308 *
309 * Takes any pending buffers and transfers their ownership to the
310 * ldisc side of the queue. It then schedules those characters for
311 * processing by the line discipline.
Ivo Siebencee4ad12012-09-27 14:02:05 +0200312 * Note that this function can only be used when the low_latency flag
313 * is unset. Otherwise the workqueue won't be flushed.
Alan Coxe0495732008-10-13 10:36:58 +0100314 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200315 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100316 */
317
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100318void tty_schedule_flip(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100319{
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100320 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100321 unsigned long flags;
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100322 WARN_ON(port->low_latency);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200323
324 spin_lock_irqsave(&buf->lock, flags);
325 if (buf->tail != NULL)
326 buf->tail->commit = buf->tail->used;
327 spin_unlock_irqrestore(&buf->lock, flags);
328 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100329}
330EXPORT_SYMBOL(tty_schedule_flip);
331
332/**
333 * tty_prepare_flip_string - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100334 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100335 * @chars: return pointer for character write area
336 * @size: desired size
337 *
338 * Prepare a block of space in the buffer for data. Returns the length
339 * available and buffer pointer to the space which is now allocated and
340 * accounted for as ready for normal characters. This is used for drivers
341 * that need their own block copy routines into the buffer. There is no
342 * guarantee the buffer is a DMA target!
343 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200344 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100345 */
346
Jiri Slaby2f693352013-01-03 15:53:02 +0100347int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200348 size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100349{
Ilya Zykov64325a32013-01-19 18:16:20 +0400350 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100351 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400352 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400353 *chars = char_buf_ptr(tb, tb->used);
354 memset(flag_buf_ptr(tb, tb->used), TTY_NORMAL, space);
Alan Coxe0495732008-10-13 10:36:58 +0100355 tb->used += space;
356 }
357 return space;
358}
359EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
360
361/**
362 * tty_prepare_flip_string_flags - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100363 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100364 * @chars: return pointer for character write area
365 * @flags: return pointer for status flag write area
366 * @size: desired size
367 *
368 * Prepare a block of space in the buffer for data. Returns the length
369 * available and buffer pointer to the space which is now allocated and
370 * accounted for as ready for characters. This is used for drivers
371 * that need their own block copy routines into the buffer. There is no
372 * guarantee the buffer is a DMA target!
373 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200374 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100375 */
376
Jiri Slaby2f693352013-01-03 15:53:02 +0100377int tty_prepare_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100378 unsigned char **chars, char **flags, size_t size)
379{
Ilya Zykov64325a32013-01-19 18:16:20 +0400380 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100381 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400382 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400383 *chars = char_buf_ptr(tb, tb->used);
384 *flags = flag_buf_ptr(tb, tb->used);
Alan Coxe0495732008-10-13 10:36:58 +0100385 tb->used += space;
386 }
387 return space;
388}
389EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
390
391
Peter Hurleyda261e72013-06-15 09:14:14 -0400392static int
393receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
394{
395 struct tty_ldisc *disc = tty->ldisc;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400396 unsigned char *p = char_buf_ptr(head, head->read);
397 char *f = flag_buf_ptr(head, head->read);
Peter Hurleyda261e72013-06-15 09:14:14 -0400398
Peter Hurley24a89d12013-06-15 09:14:15 -0400399 if (disc->ops->receive_buf2)
400 count = disc->ops->receive_buf2(tty, p, f, count);
401 else {
402 count = min_t(int, count, tty->receive_room);
403 if (count)
404 disc->ops->receive_buf(tty, p, f, count);
405 }
Peter Hurleyda261e72013-06-15 09:14:14 -0400406 head->read += count;
407 return count;
408}
Alan Coxe0495732008-10-13 10:36:58 +0100409
410/**
411 * flush_to_ldisc
412 * @work: tty structure passed from work queue.
413 *
414 * This routine is called out of the software interrupt to flush data
415 * from the buffer chain to the line discipline.
416 *
417 * Locking: holds tty->buf.lock to guard buffer list. Drops the lock
418 * while invoking the line discipline receive_buf method. The
419 * receive_buf method is single threaded for each tty instance.
420 */
421
422static void flush_to_ldisc(struct work_struct *work)
423{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200424 struct tty_port *port = container_of(work, struct tty_port, buf.work);
425 struct tty_bufhead *buf = &port->buf;
426 struct tty_struct *tty;
Alan Coxe0495732008-10-13 10:36:58 +0100427 unsigned long flags;
428 struct tty_ldisc *disc;
Alan Coxe0495732008-10-13 10:36:58 +0100429
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200430 tty = port->itty;
Jiri Slaby34dcfb82013-02-27 22:30:24 +0100431 if (tty == NULL)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200432 return;
433
Alan Coxe0495732008-10-13 10:36:58 +0100434 disc = tty_ldisc_ref(tty);
Peter Hurley36697522013-06-15 07:04:48 -0400435 if (disc == NULL)
Alan Coxe0495732008-10-13 10:36:58 +0100436 return;
437
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200438 spin_lock_irqsave(&buf->lock, flags);
Linus Torvalds45242002009-10-14 08:59:49 -0700439
Jiri Slaby2fc20662012-10-18 22:26:44 +0200440 if (!test_and_set_bit(TTYP_FLUSHING, &port->iflags)) {
Linus Torvalds81de9162011-06-08 07:46:30 -0700441 struct tty_buffer *head;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200442 while ((head = buf->head) != NULL) {
Linus Torvalds45242002009-10-14 08:59:49 -0700443 int count;
Linus Torvalds45242002009-10-14 08:59:49 -0700444
445 count = head->commit - head->read;
Alan Coxe0495732008-10-13 10:36:58 +0100446 if (!count) {
447 if (head->next == NULL)
448 break;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200449 buf->head = head->next;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200450 tty_buffer_free(port, head);
Alan Coxe0495732008-10-13 10:36:58 +0100451 continue;
452 }
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200453 spin_unlock_irqrestore(&buf->lock, flags);
Peter Hurleyda261e72013-06-15 09:14:14 -0400454
455 count = receive_buf(tty, head, count);
456
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200457 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley39f610e2013-03-20 13:20:43 -0400458 /* Ldisc or user is trying to flush the buffers.
459 We may have a deferred request to flush the
460 input buffer, if so pull the chain under the lock
461 and empty the queue */
462 if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) {
463 __tty_buffer_flush(port);
464 clear_bit(TTYP_FLUSHPENDING, &port->iflags);
465 wake_up(&tty->read_wait);
466 break;
Peter Hurleyda261e72013-06-15 09:14:14 -0400467 } else if (!count)
468 break;
Alan Coxe0495732008-10-13 10:36:58 +0100469 }
Jiri Slaby2fc20662012-10-18 22:26:44 +0200470 clear_bit(TTYP_FLUSHING, &port->iflags);
Alan Coxe0495732008-10-13 10:36:58 +0100471 }
Linus Torvalds45242002009-10-14 08:59:49 -0700472
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200473 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100474
475 tty_ldisc_deref(disc);
476}
477
478/**
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700479 * tty_flush_to_ldisc
480 * @tty: tty to push
481 *
482 * Push the terminal flip buffers to the line discipline.
483 *
484 * Must not be called from IRQ context.
485 */
486void tty_flush_to_ldisc(struct tty_struct *tty)
487{
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100488 if (!tty->port->low_latency)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200489 flush_work(&tty->port->buf.work);
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700490}
491
492/**
Alan Coxe0495732008-10-13 10:36:58 +0100493 * tty_flip_buffer_push - terminal
Jiri Slaby2e124b42013-01-03 15:53:06 +0100494 * @port: tty port to push
Alan Coxe0495732008-10-13 10:36:58 +0100495 *
496 * Queue a push of the terminal flip buffers to the line discipline. This
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100497 * function must not be called from IRQ context if port->low_latency is
498 * set.
Alan Coxe0495732008-10-13 10:36:58 +0100499 *
500 * In the event of the queue being busy for flipping the work will be
501 * held off and retried later.
502 *
503 * Locking: tty buffer lock. Driver locks in low latency mode.
504 */
505
Jiri Slaby2e124b42013-01-03 15:53:06 +0100506void tty_flip_buffer_push(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100507{
Jiri Slaby2e124b42013-01-03 15:53:06 +0100508 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100509 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200510
511 spin_lock_irqsave(&buf->lock, flags);
512 if (buf->tail != NULL)
513 buf->tail->commit = buf->tail->used;
514 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100515
Jiri Slaby2e124b42013-01-03 15:53:06 +0100516 if (port->low_latency)
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200517 flush_to_ldisc(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100518 else
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200519 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100520}
521EXPORT_SYMBOL(tty_flip_buffer_push);
522
523/**
524 * tty_buffer_init - prepare a tty buffer structure
525 * @tty: tty to initialise
526 *
527 * Set up the initial state of the buffer management for a tty device.
528 * Must be called before the other tty buffer functions are used.
529 *
530 * Locking: none
531 */
532
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200533void tty_buffer_init(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100534{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200535 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200536
537 spin_lock_init(&buf->lock);
538 buf->head = NULL;
539 buf->tail = NULL;
Peter Hurley809850b2013-06-15 09:36:06 -0400540 init_llist_head(&buf->free);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200541 buf->memory_used = 0;
542 INIT_WORK(&buf->work, flush_to_ldisc);
Alan Coxe0495732008-10-13 10:36:58 +0100543}
544