blob: 231b7a8710f18770b6e6a5d5e6bb7ee890b8d7ed [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;
Peter Hurley7391ee12013-06-15 09:36:07 -040052 if (p->size > 0)
53 kfree(p);
Alan Coxe0495732008-10-13 10:36:58 +010054 }
Peter Hurley809850b2013-06-15 09:36:06 -040055 llist = llist_del_all(&buf->free);
56 llist_for_each_entry_safe(p, next, llist, free)
Peter Hurley2cf7b672013-06-15 09:36:05 -040057 kfree(p);
Peter Hurley809850b2013-06-15 09:36:06 -040058
Peter Hurley7391ee12013-06-15 09:36:07 -040059 tty_buffer_reset(&buf->sentinel, 0);
60 buf->head = &buf->sentinel;
61 buf->tail = &buf->sentinel;
Jiri Slaby5cff39c2012-10-18 22:26:45 +020062 buf->memory_used = 0;
Alan Coxe0495732008-10-13 10:36:58 +010063}
64
65/**
66 * tty_buffer_alloc - allocate a tty buffer
67 * @tty: tty device
68 * @size: desired size (characters)
69 *
70 * Allocate a new tty buffer to hold the desired number of characters.
Peter Hurley11b9faa2013-06-15 09:36:04 -040071 * We round our buffers off in 256 character chunks to get better
72 * allocation behaviour.
Alan Coxe0495732008-10-13 10:36:58 +010073 * Return NULL if out of memory or the allocation would exceed the
74 * per device queue
Alan Coxe0495732008-10-13 10:36:58 +010075 */
76
Jiri Slabyecbbfd42012-10-18 22:26:47 +020077static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +010078{
Peter Hurley809850b2013-06-15 09:36:06 -040079 struct llist_node *free;
Alan Coxe0495732008-10-13 10:36:58 +010080 struct tty_buffer *p;
81
Peter Hurley11b9faa2013-06-15 09:36:04 -040082 /* Round the buffer size out */
83 size = __ALIGN_MASK(size, TTYB_ALIGN_MASK);
84
85 if (size <= MIN_TTYB_SIZE) {
Peter Hurley809850b2013-06-15 09:36:06 -040086 free = llist_del_first(&port->buf.free);
87 if (free) {
88 p = llist_entry(free, struct tty_buffer, free);
Peter Hurley11b9faa2013-06-15 09:36:04 -040089 goto found;
90 }
91 }
92
93 /* Should possibly check if this fails for the largest buffer we
94 have queued and recycle that ? */
Jiri Slabyecbbfd42012-10-18 22:26:47 +020095 if (port->buf.memory_used + size > 65536)
Alan Coxe0495732008-10-13 10:36:58 +010096 return NULL;
97 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
98 if (p == NULL)
99 return NULL;
Peter Hurley9dd51392013-06-15 09:36:03 -0400100
Peter Hurley11b9faa2013-06-15 09:36:04 -0400101found:
Peter Hurley9dd51392013-06-15 09:36:03 -0400102 tty_buffer_reset(p, size);
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200103 port->buf.memory_used += size;
Alan Coxe0495732008-10-13 10:36:58 +0100104 return p;
105}
106
107/**
108 * tty_buffer_free - free a tty buffer
109 * @tty: tty owning the buffer
110 * @b: the buffer to free
111 *
112 * Free a tty buffer, or add it to the free list according to our
113 * internal strategy
Alan Coxe0495732008-10-13 10:36:58 +0100114 */
115
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200116static void tty_buffer_free(struct tty_port *port, struct tty_buffer *b)
Alan Coxe0495732008-10-13 10:36:58 +0100117{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200118 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200119
Alan Coxe0495732008-10-13 10:36:58 +0100120 /* Dumb strategy for now - should keep some stats */
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200121 buf->memory_used -= b->size;
122 WARN_ON(buf->memory_used < 0);
Alan Coxe0495732008-10-13 10:36:58 +0100123
Peter Hurley1cef50e2013-06-15 09:36:02 -0400124 if (b->size > MIN_TTYB_SIZE)
Alan Coxe0495732008-10-13 10:36:58 +0100125 kfree(b);
Peter Hurley7391ee12013-06-15 09:36:07 -0400126 else if (b->size > 0)
Peter Hurley809850b2013-06-15 09:36:06 -0400127 llist_add(&b->free, &buf->free);
Alan Coxe0495732008-10-13 10:36:58 +0100128}
129
130/**
131 * __tty_buffer_flush - flush full tty buffers
132 * @tty: tty to flush
133 *
134 * flush all the buffers containing receive data. Caller must
135 * hold the buffer lock and must have ensured no parallel flush to
136 * ldisc is running.
137 *
138 * Locking: Caller must hold tty->buf.lock
139 */
140
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200141static void __tty_buffer_flush(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100142{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200143 struct tty_bufhead *buf = &port->buf;
Peter Hurley2cf7b672013-06-15 09:36:05 -0400144 struct tty_buffer *next;
Alan Coxe0495732008-10-13 10:36:58 +0100145
Peter Hurley2cf7b672013-06-15 09:36:05 -0400146 while ((next = buf->head->next) != NULL) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400147 tty_buffer_free(port, buf->head);
Peter Hurley2cf7b672013-06-15 09:36:05 -0400148 buf->head = next;
Alan Coxe0495732008-10-13 10:36:58 +0100149 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400150 WARN_ON(buf->head != buf->tail);
151 buf->head->read = buf->head->commit;
Alan Coxe0495732008-10-13 10:36:58 +0100152}
153
154/**
155 * tty_buffer_flush - flush full tty buffers
156 * @tty: tty to flush
157 *
158 * flush all the buffers containing receive data. If the buffer is
159 * being processed by flush_to_ldisc then we defer the processing
160 * to that function
161 *
162 * Locking: none
163 */
164
165void tty_buffer_flush(struct tty_struct *tty)
166{
Jiri Slaby2fc20662012-10-18 22:26:44 +0200167 struct tty_port *port = tty->port;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200168 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100169 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200170
171 spin_lock_irqsave(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100172
173 /* If the data is being pushed to the tty layer then we can't
174 process it here. Instead set a flag and the flush_to_ldisc
175 path will process the flush request before it exits */
Jiri Slaby2fc20662012-10-18 22:26:44 +0200176 if (test_bit(TTYP_FLUSHING, &port->iflags)) {
177 set_bit(TTYP_FLUSHPENDING, &port->iflags);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200178 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100179 wait_event(tty->read_wait,
Jiri Slaby2fc20662012-10-18 22:26:44 +0200180 test_bit(TTYP_FLUSHPENDING, &port->iflags) == 0);
Alan Coxe0495732008-10-13 10:36:58 +0100181 return;
182 } else
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200183 __tty_buffer_flush(port);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200184 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100185}
186
187/**
Ilya Zykov64325a32013-01-19 18:16:20 +0400188 * tty_buffer_request_room - grow tty buffer if needed
Alan Coxe0495732008-10-13 10:36:58 +0100189 * @tty: tty structure
190 * @size: size desired
191 *
192 * Make at least size bytes of linear space available for the tty
193 * buffer. If we fail return the size we managed to find.
Ilya Zykov64325a32013-01-19 18:16:20 +0400194 *
195 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100196 */
Ilya Zykov64325a32013-01-19 18:16:20 +0400197int tty_buffer_request_room(struct tty_port *port, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100198{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200199 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100200 struct tty_buffer *b, *n;
201 int left;
Ilya Zykov64325a32013-01-19 18:16:20 +0400202 unsigned long flags;
203 spin_lock_irqsave(&buf->lock, flags);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200204 b = buf->tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400205 left = b->size - b->used;
Alan Coxe0495732008-10-13 10:36:58 +0100206
207 if (left < size) {
208 /* This is the slow path - looking for new buffers to use */
Peter Hurley11b9faa2013-06-15 09:36:04 -0400209 if ((n = tty_buffer_alloc(port, size)) != NULL) {
Peter Hurley7391ee12013-06-15 09:36:07 -0400210 b->next = n;
211 b->commit = b->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200212 buf->tail = n;
Alan Coxe0495732008-10-13 10:36:58 +0100213 } else
214 size = left;
215 }
Ilya Zykov64325a32013-01-19 18:16:20 +0400216 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100217 return size;
218}
219EXPORT_SYMBOL_GPL(tty_buffer_request_room);
220
221/**
Alan Cox2832fc12010-02-18 16:43:54 +0000222 * tty_insert_flip_string_fixed_flag - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100223 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100224 * @chars: characters
Alan Cox2832fc12010-02-18 16:43:54 +0000225 * @flag: flag value for each character
Alan Coxe0495732008-10-13 10:36:58 +0100226 * @size: size
227 *
228 * Queue a series of bytes to the tty buffering. All the characters
Johan Hovoldccc5ca82010-05-07 19:58:32 +0200229 * passed are marked with the supplied flag. Returns the number added.
Alan Coxe0495732008-10-13 10:36:58 +0100230 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200231 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100232 */
233
Jiri Slaby2f693352013-01-03 15:53:02 +0100234int tty_insert_flip_string_fixed_flag(struct tty_port *port,
Alan Cox2832fc12010-02-18 16:43:54 +0000235 const unsigned char *chars, char flag, size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100236{
237 int copied = 0;
238 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800239 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400240 int space = tty_buffer_request_room(port, goal);
241 struct tty_buffer *tb = port->buf.tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400242 if (unlikely(space == 0))
Alan Coxe0495732008-10-13 10:36:58 +0100243 break;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400244 memcpy(char_buf_ptr(tb, tb->used), chars, space);
245 memset(flag_buf_ptr(tb, tb->used), flag, space);
Alan Coxe0495732008-10-13 10:36:58 +0100246 tb->used += space;
247 copied += space;
248 chars += space;
249 /* There is a small chance that we need to split the data over
250 several buffers. If this is the case we must loop */
251 } while (unlikely(size > copied));
252 return copied;
253}
Alan Cox2832fc12010-02-18 16:43:54 +0000254EXPORT_SYMBOL(tty_insert_flip_string_fixed_flag);
Alan Coxe0495732008-10-13 10:36:58 +0100255
256/**
257 * tty_insert_flip_string_flags - Add characters to the tty buffer
Jiri Slaby2f693352013-01-03 15:53:02 +0100258 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100259 * @chars: characters
260 * @flags: flag bytes
261 * @size: size
262 *
263 * Queue a series of bytes to the tty buffering. For each character
264 * the flags array indicates the status of the character. Returns the
265 * number added.
266 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200267 * Locking: Called functions may take port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100268 */
269
Jiri Slaby2f693352013-01-03 15:53:02 +0100270int tty_insert_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100271 const unsigned char *chars, const char *flags, size_t size)
272{
273 int copied = 0;
274 do {
Fang Wenqid4bee0a2010-03-09 18:54:28 +0800275 int goal = min_t(size_t, size - copied, TTY_BUFFER_PAGE);
Ilya Zykov64325a32013-01-19 18:16:20 +0400276 int space = tty_buffer_request_room(port, goal);
277 struct tty_buffer *tb = port->buf.tail;
Peter Hurley7391ee12013-06-15 09:36:07 -0400278 if (unlikely(space == 0))
Alan Coxe0495732008-10-13 10:36:58 +0100279 break;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400280 memcpy(char_buf_ptr(tb, tb->used), chars, space);
281 memcpy(flag_buf_ptr(tb, tb->used), flags, space);
Alan Coxe0495732008-10-13 10:36:58 +0100282 tb->used += space;
283 copied += space;
284 chars += space;
285 flags += space;
286 /* There is a small chance that we need to split the data over
287 several buffers. If this is the case we must loop */
288 } while (unlikely(size > copied));
289 return copied;
290}
291EXPORT_SYMBOL(tty_insert_flip_string_flags);
292
293/**
294 * tty_schedule_flip - push characters to ldisc
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100295 * @port: tty port to push from
Alan Coxe0495732008-10-13 10:36:58 +0100296 *
297 * Takes any pending buffers and transfers their ownership to the
298 * ldisc side of the queue. It then schedules those characters for
299 * processing by the line discipline.
Ivo Siebencee4ad12012-09-27 14:02:05 +0200300 * Note that this function can only be used when the low_latency flag
301 * is unset. Otherwise the workqueue won't be flushed.
Alan Coxe0495732008-10-13 10:36:58 +0100302 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200303 * Locking: Takes port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100304 */
305
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100306void tty_schedule_flip(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100307{
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100308 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100309 unsigned long flags;
Jiri Slaby6732c8b2013-01-03 15:53:07 +0100310 WARN_ON(port->low_latency);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200311
312 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley7391ee12013-06-15 09:36:07 -0400313 buf->tail->commit = buf->tail->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200314 spin_unlock_irqrestore(&buf->lock, flags);
315 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100316}
317EXPORT_SYMBOL(tty_schedule_flip);
318
319/**
320 * tty_prepare_flip_string - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100321 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100322 * @chars: return pointer for character write area
323 * @size: desired size
324 *
325 * Prepare a block of space in the buffer for data. Returns the length
326 * available and buffer pointer to the space which is now allocated and
327 * accounted for as ready for normal characters. This is used for drivers
328 * that need their own block copy routines into the buffer. There is no
329 * guarantee the buffer is a DMA target!
330 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200331 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100332 */
333
Jiri Slaby2f693352013-01-03 15:53:02 +0100334int tty_prepare_flip_string(struct tty_port *port, unsigned char **chars,
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200335 size_t size)
Alan Coxe0495732008-10-13 10:36:58 +0100336{
Ilya Zykov64325a32013-01-19 18:16:20 +0400337 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100338 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400339 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400340 *chars = char_buf_ptr(tb, tb->used);
341 memset(flag_buf_ptr(tb, tb->used), TTY_NORMAL, space);
Alan Coxe0495732008-10-13 10:36:58 +0100342 tb->used += space;
343 }
344 return space;
345}
346EXPORT_SYMBOL_GPL(tty_prepare_flip_string);
347
348/**
349 * tty_prepare_flip_string_flags - make room for characters
Jiri Slaby2f693352013-01-03 15:53:02 +0100350 * @port: tty port
Alan Coxe0495732008-10-13 10:36:58 +0100351 * @chars: return pointer for character write area
352 * @flags: return pointer for status flag write area
353 * @size: desired size
354 *
355 * Prepare a block of space in the buffer for data. Returns the length
356 * available and buffer pointer to the space which is now allocated and
357 * accounted for as ready for characters. This is used for drivers
358 * that need their own block copy routines into the buffer. There is no
359 * guarantee the buffer is a DMA target!
360 *
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200361 * Locking: May call functions taking port->buf.lock
Alan Coxe0495732008-10-13 10:36:58 +0100362 */
363
Jiri Slaby2f693352013-01-03 15:53:02 +0100364int tty_prepare_flip_string_flags(struct tty_port *port,
Alan Coxe0495732008-10-13 10:36:58 +0100365 unsigned char **chars, char **flags, size_t size)
366{
Ilya Zykov64325a32013-01-19 18:16:20 +0400367 int space = tty_buffer_request_room(port, size);
Alan Coxe0495732008-10-13 10:36:58 +0100368 if (likely(space)) {
Ilya Zykov64325a32013-01-19 18:16:20 +0400369 struct tty_buffer *tb = port->buf.tail;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400370 *chars = char_buf_ptr(tb, tb->used);
371 *flags = flag_buf_ptr(tb, tb->used);
Alan Coxe0495732008-10-13 10:36:58 +0100372 tb->used += space;
373 }
374 return space;
375}
376EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags);
377
378
Peter Hurleyda261e72013-06-15 09:14:14 -0400379static int
380receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
381{
382 struct tty_ldisc *disc = tty->ldisc;
Peter Hurley1fc359f2013-06-15 09:36:01 -0400383 unsigned char *p = char_buf_ptr(head, head->read);
384 char *f = flag_buf_ptr(head, head->read);
Peter Hurleyda261e72013-06-15 09:14:14 -0400385
Peter Hurley24a89d12013-06-15 09:14:15 -0400386 if (disc->ops->receive_buf2)
387 count = disc->ops->receive_buf2(tty, p, f, count);
388 else {
389 count = min_t(int, count, tty->receive_room);
390 if (count)
391 disc->ops->receive_buf(tty, p, f, count);
392 }
Peter Hurleyda261e72013-06-15 09:14:14 -0400393 head->read += count;
394 return count;
395}
Alan Coxe0495732008-10-13 10:36:58 +0100396
397/**
398 * flush_to_ldisc
399 * @work: tty structure passed from work queue.
400 *
401 * This routine is called out of the software interrupt to flush data
402 * from the buffer chain to the line discipline.
403 *
404 * Locking: holds tty->buf.lock to guard buffer list. Drops the lock
405 * while invoking the line discipline receive_buf method. The
406 * receive_buf method is single threaded for each tty instance.
407 */
408
409static void flush_to_ldisc(struct work_struct *work)
410{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200411 struct tty_port *port = container_of(work, struct tty_port, buf.work);
412 struct tty_bufhead *buf = &port->buf;
413 struct tty_struct *tty;
Alan Coxe0495732008-10-13 10:36:58 +0100414 unsigned long flags;
415 struct tty_ldisc *disc;
Alan Coxe0495732008-10-13 10:36:58 +0100416
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200417 tty = port->itty;
Jiri Slaby34dcfb82013-02-27 22:30:24 +0100418 if (tty == NULL)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200419 return;
420
Alan Coxe0495732008-10-13 10:36:58 +0100421 disc = tty_ldisc_ref(tty);
Peter Hurley36697522013-06-15 07:04:48 -0400422 if (disc == NULL)
Alan Coxe0495732008-10-13 10:36:58 +0100423 return;
424
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200425 spin_lock_irqsave(&buf->lock, flags);
Linus Torvalds45242002009-10-14 08:59:49 -0700426
Jiri Slaby2fc20662012-10-18 22:26:44 +0200427 if (!test_and_set_bit(TTYP_FLUSHING, &port->iflags)) {
Peter Hurley7391ee12013-06-15 09:36:07 -0400428 while (1) {
429 struct tty_buffer *head = buf->head;
Linus Torvalds45242002009-10-14 08:59:49 -0700430 int count;
Linus Torvalds45242002009-10-14 08:59:49 -0700431
432 count = head->commit - head->read;
Alan Coxe0495732008-10-13 10:36:58 +0100433 if (!count) {
434 if (head->next == NULL)
435 break;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200436 buf->head = head->next;
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200437 tty_buffer_free(port, head);
Alan Coxe0495732008-10-13 10:36:58 +0100438 continue;
439 }
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200440 spin_unlock_irqrestore(&buf->lock, flags);
Peter Hurleyda261e72013-06-15 09:14:14 -0400441
442 count = receive_buf(tty, head, count);
443
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200444 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley39f610e2013-03-20 13:20:43 -0400445 /* Ldisc or user is trying to flush the buffers.
446 We may have a deferred request to flush the
447 input buffer, if so pull the chain under the lock
448 and empty the queue */
449 if (test_bit(TTYP_FLUSHPENDING, &port->iflags)) {
450 __tty_buffer_flush(port);
451 clear_bit(TTYP_FLUSHPENDING, &port->iflags);
452 wake_up(&tty->read_wait);
453 break;
Peter Hurleyda261e72013-06-15 09:14:14 -0400454 } else if (!count)
455 break;
Alan Coxe0495732008-10-13 10:36:58 +0100456 }
Jiri Slaby2fc20662012-10-18 22:26:44 +0200457 clear_bit(TTYP_FLUSHING, &port->iflags);
Alan Coxe0495732008-10-13 10:36:58 +0100458 }
Linus Torvalds45242002009-10-14 08:59:49 -0700459
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200460 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100461
462 tty_ldisc_deref(disc);
463}
464
465/**
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700466 * tty_flush_to_ldisc
467 * @tty: tty to push
468 *
469 * Push the terminal flip buffers to the line discipline.
470 *
471 * Must not be called from IRQ context.
472 */
473void tty_flush_to_ldisc(struct tty_struct *tty)
474{
Jiri Slabyd6c53c0e2013-01-03 15:53:05 +0100475 if (!tty->port->low_latency)
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200476 flush_work(&tty->port->buf.work);
OGAWA Hirofumie043e422009-07-29 12:15:56 -0700477}
478
479/**
Alan Coxe0495732008-10-13 10:36:58 +0100480 * tty_flip_buffer_push - terminal
Jiri Slaby2e124b42013-01-03 15:53:06 +0100481 * @port: tty port to push
Alan Coxe0495732008-10-13 10:36:58 +0100482 *
483 * Queue a push of the terminal flip buffers to the line discipline. This
Jiri Slabyd6c53c0e2013-01-03 15:53:05 +0100484 * function must not be called from IRQ context if port->low_latency is
485 * set.
Alan Coxe0495732008-10-13 10:36:58 +0100486 *
487 * In the event of the queue being busy for flipping the work will be
488 * held off and retried later.
489 *
490 * Locking: tty buffer lock. Driver locks in low latency mode.
491 */
492
Jiri Slaby2e124b42013-01-03 15:53:06 +0100493void tty_flip_buffer_push(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100494{
Jiri Slaby2e124b42013-01-03 15:53:06 +0100495 struct tty_bufhead *buf = &port->buf;
Alan Coxe0495732008-10-13 10:36:58 +0100496 unsigned long flags;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200497
498 spin_lock_irqsave(&buf->lock, flags);
Peter Hurley7391ee12013-06-15 09:36:07 -0400499 buf->tail->commit = buf->tail->used;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200500 spin_unlock_irqrestore(&buf->lock, flags);
Alan Coxe0495732008-10-13 10:36:58 +0100501
Jiri Slaby2e124b42013-01-03 15:53:06 +0100502 if (port->low_latency)
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200503 flush_to_ldisc(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100504 else
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200505 schedule_work(&buf->work);
Alan Coxe0495732008-10-13 10:36:58 +0100506}
507EXPORT_SYMBOL(tty_flip_buffer_push);
508
509/**
510 * tty_buffer_init - prepare a tty buffer structure
511 * @tty: tty to initialise
512 *
513 * Set up the initial state of the buffer management for a tty device.
514 * Must be called before the other tty buffer functions are used.
515 *
516 * Locking: none
517 */
518
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200519void tty_buffer_init(struct tty_port *port)
Alan Coxe0495732008-10-13 10:36:58 +0100520{
Jiri Slabyecbbfd42012-10-18 22:26:47 +0200521 struct tty_bufhead *buf = &port->buf;
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200522
523 spin_lock_init(&buf->lock);
Peter Hurley7391ee12013-06-15 09:36:07 -0400524 tty_buffer_reset(&buf->sentinel, 0);
525 buf->head = &buf->sentinel;
526 buf->tail = &buf->sentinel;
Peter Hurley809850b2013-06-15 09:36:06 -0400527 init_llist_head(&buf->free);
Jiri Slaby5cff39c2012-10-18 22:26:45 +0200528 buf->memory_used = 0;
529 INIT_WORK(&buf->work, flush_to_ldisc);
Alan Coxe0495732008-10-13 10:36:58 +0100530}
531