blob: 5d5a56407aa8bbd9100b16b1b6ace757acdf1a66 [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 Hurley7bfe0b72013-06-15 09:36:08 -040025/*
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
Peter Hurley9dd51392013-06-15 09:36:03 -040050static 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
Alan Coxe0495732008-10-13 10:36:58 +010059/**
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
65 *
66 * Locking: none
67 */
68
Jiri Slabyecbbfd42012-10-18 22:26:47 +020069void tty_buffer_free_all(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +010070{
Jiri Slabyecbbfd42012-10-18 22:26:47 +020071 struct tty_bufhead *buf = &port->buf;
Peter Hurley809850b2013-06-15 09:36:06 -040072 struct tty_buffer *p, *next;
73 struct llist_node *llist;
Jiri Slaby5cff39c2012-10-18 22:26:45 +020074
Peter Hurley2cf7b672013-06-15 09:36:05 -040075 while ((p = buf->head) != NULL) {
76 buf->head = p->next;
Peter Hurley7391ee12013-06-15 09:36:07 -040077 if (p->size > 0)
78 kfree(p);
Alan Coxe0495732008-10-13 10:36:58 +010079 }
Peter Hurley809850b2013-06-15 09:36:06 -040080 llist = llist_del_all(&buf->free);
81 llist_for_each_entry_safe(p, next, llist, free)
Peter Hurley2cf7b672013-06-15 09:36:05 -040082 kfree(p);
Peter Hurley809850b2013-06-15 09:36:06 -040083
Peter Hurley7391ee12013-06-15 09:36:07 -040084 tty_buffer_reset(&buf->sentinel, 0);
85 buf->head = &buf->sentinel;
86 buf->tail = &buf->sentinel;
Peter Hurley7bfe0b72013-06-15 09:36:08 -040087
88 atomic_set(&buf->memory_used, 0);
Alan Coxe0495732008-10-13 10:36:58 +010089}
90
91/**
92 * tty_buffer_alloc - allocate a tty buffer
93 * @tty: tty device
94 * @size: desired size (characters)
95 *
96 * Allocate a new tty buffer to hold the desired number of characters.
Peter Hurley11b9faa2013-06-15 09:36:04 -040097 * We round our buffers off in 256 character chunks to get better
98 * allocation behaviour.
Alan Coxe0495732008-10-13 10:36:58 +010099 * Return NULL if out of memory or the allocation would exceed the
100 * per device queue
Alan Coxe0495732008-10-13 10:36:58 +0100101 */
102
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200103static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100104{
Peter Hurley809850b2013-06-15 09:36:06 -0400105 struct llist_node *free;
Alan Coxe0495732008-10-13 10:36:58 +0100106 struct tty_buffer *p;
107
Peter Hurley11b9faa2013-06-15 09:36:04 -0400108 /* Round the buffer size out */
109 size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
110
111 if (size <= MIN_TTYB_SIZE) {
Peter Hurley809850b2013-06-15 09:36:06 -0400112 free = llist_del_first(&port->buf.free);
113 if (free) {
114 p = llist_entry(free, struct tty_buffer, free);
Peter Hurley11b9faa2013-06-15 09:36:04 -0400115 goto found;
116 }
117 }
118
119 /* Should possibly check if this fails for the largest buffer we
120 have queued and recycle that ? */
Peter Hurley7bfe0b72013-06-15 09:36:08 -0400121 if (atomic_read(&port->buf.memory_used) > TTYB_MEM_LIMIT)
Alan Coxe0495732008-10-13 10:36:58 +0100122 return NULL;
123 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
124 if (p == NULL)
125 return NULL;
Peter Hurley9dd51392013-06-15 09:36:03 -0400126
Peter Hurley11b9faa2013-06-15 09:36:04 -0400127found:
Peter Hurley9dd51392013-06-15 09:36:03 -0400128 tty_buffer_reset(p, size);
Peter Hurley7bfe0b72013-06-15 09:36:08 -0400129 atomic_add(size, &port->buf.memory_used);
Alan Coxe0495732008-10-13 10:36:58 +0100130 return p;
131}
132
133/**
134 * tty_buffer_free - free a tty buffer
135 * @tty: tty owning the buffer
136 * @b: the buffer to free
137 *
138 * Free a tty buffer, or add it to the free list according to our
139 * internal strategy
Alan Coxe0495732008-10-13 10:36:58 +0100140 */
141
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200142static void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)
Alan Coxe0495732008-10-13 10:36:58 +0100143{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200144 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200145
Alan Coxe0495732008-10-13 10:36:58 +0100146 /* Dumb strategy for now - should keep some stats */
Peter Hurley7bfe0b72013-06-15 09:36:08 -0400147 WARN_ON(atomic_sub_return(b->size, &buf->memory_used) < 0);
Alan Coxe0495732008-10-13 10:36:58 +0100148
Peter Hurley1cef50e2013-06-15 09:36:02 -0400149 if (b->size > MIN_TTYB_SIZE)
Alan Coxe0495732008-10-13 10:36:58 +0100150 kfree(b);
Peter Hurley7391ee12013-06-15 09:36:07 -0400151 else if (b->size > 0)
Peter Hurley809850b2013-06-15 09:36:06 -0400152 llist_add(&b->free, &buf->free);
Alan Coxe0495732008-10-13 10:36:58 +0100153}
154
155/**
156 * __tty_buffer_flush - flush full tty buffers
157 * @tty: tty to flush
158 *
159 * flush all the buffers containing receive data. Caller must
160 * hold the buffer lock and must have ensured no parallel flush to
161 * ldisc is running.
162 *
163 * Locking: Caller must hold tty->buf.lock
164 */
165
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200166static void __tty_buffer_flush(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100167{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200168 struct tty_bufhead *buf = &port->buf;
Peter Hurley2cf7b672013-06-15 09:36:05 -0400169 struct tty_buffer *next;
Alan Coxe0495732008-10-13 10:36:58 +0100170
Peter Hurley2cf7b672013-06-15 09:36:05 -0400171 while ((next = buf->head->next) != NULL) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400172 tty_buffer_free(port, buf->head);
Peter Hurley2cf7b672013-06-15 09:36:05 -0400173 buf->head = next;
Alan Coxe0495732008-10-13 10:36:58 +0100174 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400175 WARN_ON(buf->head != buf->tail);
176 buf->head->read = buf->head->commit;
Alan Coxe0495732008-10-13 10:36:58 +0100177}
178
179/**
180 * tty_buffer_flush - flush full tty buffers
181 * @tty: tty to flush
182 *
183 * flush all the buffers containing receive data. If the buffer is
184 * being processed by flush_to_ldisc then we defer the processing
185 * to that function
186 *
187 * Locking: none
188 */
189
190void tty_buffer_flush(struct tty_struct *tty)
191{
Jiri Slaby2fc20662012-10-18 22:26:44 +0200192 struct tty_port *port = tty->port;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200193 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100194 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200195
196 spin_lock_irqsave(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100197
198 /* If the data is being pushed to the tty layer then we can't
199 process it here. Instead set a flag and the flush_to_ldisc
200 path will process the flush request before it exits */
Jiri Slaby2fc20662012-10-18 22:26:44 +0200201 if (test_bit(TTYP_FLUSHING, &port->iflags)) {
202 set_bit(TTYP_FLUSHPENDING, &port->iflags);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200203 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100204 wait_event(tty->read_wait,
Jiri Slaby2fc20662012-10-18 22:26:44 +0200205 test_bit(TTYP_FLUSHPENDING, &port->iflags) == 0);
Alan Coxe0495732008-10-13 10:36:58 +0100206 return;
207 } else
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200208 __tty_buffer_flush(port);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200209 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100210}
211
212/**
Ilya Zykov64325a32013-01-19 18:16:20 +0400213 * tty_buffer_request_room - grow tty buffer if needed
Alan Coxe0495732008-10-13 10:36:58 +0100214 * @tty: tty structure
215 * @size: size desired
216 *
217 * Make at least size bytes of linear space available for the tty
218 * buffer. If we fail return the size we managed to find.
Ilya Zykov64325a32013-01-19 18:16:20 +0400219 *
220 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100221 */
Ilya Zykov64325a32013-01-19 18:16:20 +0400222int tty_buffer_request_room(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100223{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200224 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100225 struct tty_buffer *b, *n;
226 int left;
Ilya Zykov64325a32013-01-19 18:16:20 +0400227 unsigned long flags;
228 spin_lock_irqsave(&buf->lock, flags);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200229 b = buf->tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400230 left = b->size - b->used;
Alan Coxe0495732008-10-13 10:36:58 +0100231
232 if (left < size) {
233 /* This is the slow path - looking for new buffers to use */
Peter Hurley11b9faa2013-06-15 09:36:04 -0400234 if ((n = tty_buffer_alloc(port, size)) != NULL) {
Peter Hurley7391ee12013-06-15 09:36:07 -0400235 b->next = n;
236 b->commit = b->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200237 buf->tail = n;
Alan Coxe0495732008-10-13 10:36:58 +0100238 } else
239 size = left;
240 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400241 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100242 return size;
243}
244EXPORT_SYMBOL_GPL(tty_buffer_request_room);
245
246/**
Alan Cox2832fc12010-02-18 16:43:54 +0000247 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100248 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100249 * @chars: characters
Alan Cox2832fc12010-02-18 16:43:54 +0000250 * @flag: flag value for each character
Alan Coxe0495732008-10-13 10:36:58 +0100251 * @size: size
252 *
253 * Queue a series of bytes to the tty buffering. All the characters
Johan Hovoldccc5ca82010-05-07 19:58:32 +0200254 * passed are marked with the supplied flag. Returns the number added.
Alan Coxe0495732008-10-13 10:36:58 +0100255 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200256 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100257 */
258
Jiri Slaby2f693352013-01-03 15:53:02 +0100259int tty_insert_flip_string_fixed_flag(struct tty_port *port,
Alan Cox2832fc12010-02-18 16:43:54 +0000260 const unsigned char *chars, char flag, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100261{
262 int copied = 0;
263 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800264 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400265 int space = tty_buffer_request_room(port, goal);
266 struct tty_buffer *tb = port->buf.tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400267 if (unlikely(space == 0))
Alan Coxe0495732008-10-13 10:36:58 +0100268 break;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400269 memcpy(char_buf_ptr(tb, tb->used), chars, space);
270 memset(flag_buf_ptr(tb, tb->used), flag, space);
Alan Coxe0495732008-10-13 10:36:58 +0100271 tb->used += space;
272 copied += space;
273 chars += space;
274 /* There is a small chance that we need to split the data over
275 several buffers. If this is the case we must loop */
276 } while (unlikely(size > copied));
277 return copied;
278}
Alan Cox2832fc12010-02-18 16:43:54 +0000279EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
Alan Coxe0495732008-10-13 10:36:58 +0100280
281/**
282 * tty_insert_flip_string_flags - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100283 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100284 * @chars: characters
285 * @flags: flag bytes
286 * @size: size
287 *
288 * Queue a series of bytes to the tty buffering. For each character
289 * the flags array indicates the status of the character. Returns the
290 * number added.
291 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200292 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100293 */
294
Jiri Slaby2f693352013-01-03 15:53:02 +0100295int tty_insert_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100296 const unsigned char *chars, const char *flags, size_t size)
297{
298 int copied = 0;
299 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800300 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400301 int space = tty_buffer_request_room(port, goal);
302 struct tty_buffer *tb = port->buf.tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400303 if (unlikely(space == 0))
Alan Coxe0495732008-10-13 10:36:58 +0100304 break;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400305 memcpy(char_buf_ptr(tb, tb->used), chars, space);
306 memcpy(flag_buf_ptr(tb, tb->used), flags, space);
Alan Coxe0495732008-10-13 10:36:58 +0100307 tb->used += space;
308 copied += space;
309 chars += space;
310 flags += space;
311 /* There is a small chance that we need to split the data over
312 several buffers. If this is the case we must loop */
313 } while (unlikely(size > copied));
314 return copied;
315}
316EXPORT_SYMBOL(tty_insert_flip_string_flags);
317
318/**
319 * tty_schedule_flip - push characters to ldisc
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100320 * @port: tty port to push from
Alan Coxe0495732008-10-13 10:36:58 +0100321 *
322 * Takes any pending buffers and transfers their ownership to the
323 * ldisc side of the queue. It then schedules those characters for
324 * processing by the line discipline.
Ivo Siebencee4ad12012-09-27 14:02:05 +0200325 * Note that this function can only be used when the low_latency flag
326 * is unset. Otherwise the workqueue won't be flushed.
Alan Coxe0495732008-10-13 10:36:58 +0100327 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200328 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100329 */
330
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100331void tty_schedule_flip(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100332{
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100333 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100334 unsigned long flags;
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100335 WARN_ON(port->low_latency);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200336
337 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley7391ee12013-06-15 09:36:07 -0400338 buf->tail->commit = buf->tail->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200339 spin_unlock_irqrestore(&buf->lock, flags);
340 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100341}
342EXPORT_SYMBOL(tty_schedule_flip);
343
344/**
345 * tty_prepare_flip_string - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100346 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100347 * @chars: return pointer for character write area
348 * @size: desired size
349 *
350 * Prepare a block of space in the buffer for data. Returns the length
351 * available and buffer pointer to the space which is now allocated and
352 * accounted for as ready for normal characters. This is used for drivers
353 * that need their own block copy routines into the buffer. There is no
354 * guarantee the buffer is a DMA target!
355 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200356 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100357 */
358
Jiri Slaby2f693352013-01-03 15:53:02 +0100359int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200360 size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100361{
Ilya Zykov64325a32013-01-19 18:16:20 +0400362 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100363 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400364 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400365 *chars = char_buf_ptr(tb, tb->used);
366 memset(flag_buf_ptr(tb, tb->used), TTY_NORMAL, space);
Alan Coxe0495732008-10-13 10:36:58 +0100367 tb->used += space;
368 }
369 return space;
370}
371EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
372
373/**
374 * tty_prepare_flip_string_flags - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100375 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100376 * @chars: return pointer for character write area
377 * @flags: return pointer for status flag write area
378 * @size: desired size
379 *
380 * Prepare a block of space in the buffer for data. Returns the length
381 * available and buffer pointer to the space which is now allocated and
382 * accounted for as ready for characters. This is used for drivers
383 * that need their own block copy routines into the buffer. There is no
384 * guarantee the buffer is a DMA target!
385 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200386 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100387 */
388
Jiri Slaby2f693352013-01-03 15:53:02 +0100389int tty_prepare_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100390 unsigned char **chars, char **flags, size_t size)
391{
Ilya Zykov64325a32013-01-19 18:16:20 +0400392 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100393 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400394 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400395 *chars = char_buf_ptr(tb, tb->used);
396 *flags = flag_buf_ptr(tb, tb->used);
Alan Coxe0495732008-10-13 10:36:58 +0100397 tb->used += space;
398 }
399 return space;
400}
401EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
402
403
Peter Hurleyda261e72013-06-15 09:14:14 -0400404static int
405receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
406{
407 struct tty_ldisc *disc = tty->ldisc;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400408 unsigned char *p = char_buf_ptr(head, head->read);
409 char *f = flag_buf_ptr(head, head->read);
Peter Hurleyda261e72013-06-15 09:14:14 -0400410
Peter Hurley24a89d12013-06-15 09:14:15 -0400411 if (disc->ops->receive_buf2)
412 count = disc->ops->receive_buf2(tty, p, f, count);
413 else {
414 count = min_t(int, count, tty->receive_room);
415 if (count)
416 disc->ops->receive_buf(tty, p, f, count);
417 }
Peter Hurleyda261e72013-06-15 09:14:14 -0400418 head->read += count;
419 return count;
420}
Alan Coxe0495732008-10-13 10:36:58 +0100421
422/**
423 * flush_to_ldisc
424 * @work: tty structure passed from work queue.
425 *
426 * This routine is called out of the software interrupt to flush data
427 * from the buffer chain to the line discipline.
428 *
429 * Locking: holds tty->buf.lock to guard buffer list. Drops the lock
430 * while invoking the line discipline receive_buf method. The
431 * receive_buf method is single threaded for each tty instance.
432 */
433
434static void flush_to_ldisc(struct work_struct *work)
435{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200436 struct tty_port *port = container_of(work, struct tty_port, buf.work);
437 struct tty_bufhead *buf = &port->buf;
438 struct tty_struct *tty;
Alan Coxe0495732008-10-13 10:36:58 +0100439 unsigned long flags;
440 struct tty_ldisc *disc;
Alan Coxe0495732008-10-13 10:36:58 +0100441
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200442 tty = port->itty;
Jiri Slaby34dcfb82013-02-27 22:30:24 +0100443 if (tty == NULL)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200444 return;
445
Alan Coxe0495732008-10-13 10:36:58 +0100446 disc = tty_ldisc_ref(tty);
Peter Hurley36697522013-06-15 07:04:48 -0400447 if (disc == NULL)
Alan Coxe0495732008-10-13 10:36:58 +0100448 return;
449
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200450 spin_lock_irqsave(&buf->lock, flags);
Linus Torvalds45242002009-10-14 08:59:49 -0700451
Jiri Slaby2fc20662012-10-18 22:26:44 +0200452 if (!test_and_set_bit(TTYP_FLUSHING, &port->iflags)) {
Peter Hurley7391ee12013-06-15 09:36:07 -0400453 while (1) {
454 struct tty_buffer *head = buf->head;
Linus Torvalds45242002009-10-14 08:59:49 -0700455 int count;
Linus Torvalds45242002009-10-14 08:59:49 -0700456
457 count = head->commit - head->read;
Alan Coxe0495732008-10-13 10:36:58 +0100458 if (!count) {
459 if (head->next == NULL)
460 break;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200461 buf->head = head->next;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200462 tty_buffer_free(port, head);
Alan Coxe0495732008-10-13 10:36:58 +0100463 continue;
464 }
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200465 spin_unlock_irqrestore(&buf->lock, flags);
Peter Hurleyda261e72013-06-15 09:14:14 -0400466
467 count = receive_buf(tty, head, count);
468
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200469 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley39f610e2013-03-20 13:20:43 -0400470 /* Ldisc or user is trying to flush the buffers.
471 We may have a deferred request to flush the
472 input buffer, if so pull the chain under the lock
473 and empty the queue */
474 if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) {
475 __tty_buffer_flush(port);
476 clear_bit(TTYP_FLUSHPENDING, &port->iflags);
477 wake_up(&tty->read_wait);
478 break;
Peter Hurleyda261e72013-06-15 09:14:14 -0400479 } else if (!count)
480 break;
Alan Coxe0495732008-10-13 10:36:58 +0100481 }
Jiri Slaby2fc20662012-10-18 22:26:44 +0200482 clear_bit(TTYP_FLUSHING, &port->iflags);
Alan Coxe0495732008-10-13 10:36:58 +0100483 }
Linus Torvalds45242002009-10-14 08:59:49 -0700484
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200485 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100486
487 tty_ldisc_deref(disc);
488}
489
490/**
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700491 * tty_flush_to_ldisc
492 * @tty: tty to push
493 *
494 * Push the terminal flip buffers to the line discipline.
495 *
496 * Must not be called from IRQ context.
497 */
498void tty_flush_to_ldisc(struct tty_struct *tty)
499{
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100500 if (!tty->port->low_latency)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200501 flush_work(&tty->port->buf.work);
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700502}
503
504/**
Alan Coxe0495732008-10-13 10:36:58 +0100505 * tty_flip_buffer_push - terminal
Jiri Slaby2e124b42013-01-03 15:53:06 +0100506 * @port: tty port to push
Alan Coxe0495732008-10-13 10:36:58 +0100507 *
508 * Queue a push of the terminal flip buffers to the line discipline. This
Jiri Slabyd6c53c02013-01-03 15:53:05 +0100509 * function must not be called from IRQ context if port->low_latency is
510 * set.
Alan Coxe0495732008-10-13 10:36:58 +0100511 *
512 * In the event of the queue being busy for flipping the work will be
513 * held off and retried later.
514 *
515 * Locking: tty buffer lock. Driver locks in low latency mode.
516 */
517
Jiri Slaby2e124b42013-01-03 15:53:06 +0100518void tty_flip_buffer_push(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100519{
Jiri Slaby2e124b42013-01-03 15:53:06 +0100520 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100521 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200522
523 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley7391ee12013-06-15 09:36:07 -0400524 buf->tail->commit = buf->tail->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200525 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100526
Jiri Slaby2e124b42013-01-03 15:53:06 +0100527 if (port->low_latency)
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200528 flush_to_ldisc(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100529 else
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200530 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100531}
532EXPORT_SYMBOL(tty_flip_buffer_push);
533
534/**
535 * tty_buffer_init - prepare a tty buffer structure
536 * @tty: tty to initialise
537 *
538 * Set up the initial state of the buffer management for a tty device.
539 * Must be called before the other tty buffer functions are used.
540 *
541 * Locking: none
542 */
543
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200544void tty_buffer_init(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100545{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200546 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200547
548 spin_lock_init(&buf->lock);
Peter Hurley7391ee12013-06-15 09:36:07 -0400549 tty_buffer_reset(&buf->sentinel, 0);
550 buf->head = &buf->sentinel;
551 buf->tail = &buf->sentinel;
Peter Hurley809850b2013-06-15 09:36:06 -0400552 init_llist_head(&buf->free);
Peter Hurley7bfe0b72013-06-15 09:36:08 -0400553 atomic_set(&buf->memory_used, 0);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200554 INIT_WORK(&buf->work, flush_to_ldisc);
Alan Coxe0495732008-10-13 10:36:58 +0100555}
556