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> 19 20/** 21 * tty_buffer_free_all - free buffers used by a tty 22 * @tty: tty to free from 23 * 24 * Remove all the buffers pending on a tty whether queued with data 25 * or in the free ring. Must be called when the tty is no longer in use 26 * 27 * Locking: none 28 */ 29 30void tty_buffer_free_all(struct tty_struct *tty) 31{ 32 struct tty_buffer *thead; 33 while ((thead = tty->buf.head) != NULL) { 34 tty->buf.head = thead->next; 35 kfree(thead); 36 } 37 while ((thead = tty->buf.free) != NULL) { 38 tty->buf.free = thead->next; 39 kfree(thead); 40 } 41 tty->buf.tail = NULL; 42 tty->buf.memory_used = 0; 43} 44 45/** 46 * tty_buffer_alloc - allocate a tty buffer 47 * @tty: tty device 48 * @size: desired size (characters) 49 * 50 * Allocate a new tty buffer to hold the desired number of characters. 51 * Return NULL if out of memory or the allocation would exceed the 52 * per device queue 53 * 54 * Locking: Caller must hold tty->buf.lock 55 */ 56 57static struct tty_buffer *tty_buffer_alloc(struct tty_struct *tty, size_t size) 58{ 59 struct tty_buffer *p; 60 61 if (tty->buf.memory_used + size > 65536) 62 return NULL; 63 p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC); 64 if (p == NULL) 65 return NULL; 66 p->used = 0; 67 p->size = size; 68 p->next = NULL; 69 p->commit = 0; 70 p->read = 0; 71 p->char_buf_ptr = (char *)(p->data); 72 p->flag_buf_ptr = (unsigned char *)p->char_buf_ptr + size; 73 tty->buf.memory_used += size; 74 return p; 75} 76 77/** 78 * tty_buffer_free - free a tty buffer 79 * @tty: tty owning the buffer 80 * @b: the buffer to free 81 * 82 * Free a tty buffer, or add it to the free list according to our 83 * internal strategy 84 * 85 * Locking: Caller must hold tty->buf.lock 86 */ 87 88static void tty_buffer_free(struct tty_struct *tty, struct tty_buffer *b) 89{ 90 /* Dumb strategy for now - should keep some stats */ 91 tty->buf.memory_used -= b->size; 92 WARN_ON(tty->buf.memory_used < 0); 93 94 if (b->size >= 512) 95 kfree(b); 96 else { 97 b->next = tty->buf.free; 98 tty->buf.free = b; 99 } 100} 101 102/** 103 * __tty_buffer_flush - flush full tty buffers 104 * @tty: tty to flush 105 * 106 * flush all the buffers containing receive data. Caller must 107 * hold the buffer lock and must have ensured no parallel flush to 108 * ldisc is running. 109 * 110 * Locking: Caller must hold tty->buf.lock 111 */ 112 113static void __tty_buffer_flush(struct tty_struct *tty) 114{ 115 struct tty_buffer *thead; 116 117 while ((thead = tty->buf.head) != NULL) { 118 tty->buf.head = thead->next; 119 tty_buffer_free(tty, thead); 120 } 121 tty->buf.tail = NULL; 122} 123 124/** 125 * tty_buffer_flush - flush full tty buffers 126 * @tty: tty to flush 127 * 128 * flush all the buffers containing receive data. If the buffer is 129 * being processed by flush_to_ldisc then we defer the processing 130 * to that function 131 * 132 * Locking: none 133 */ 134 135void tty_buffer_flush(struct tty_struct *tty) 136{ 137 unsigned long flags; 138 spin_lock_irqsave(&tty->buf.lock, flags); 139 140 /* If the data is being pushed to the tty layer then we can't 141 process it here. Instead set a flag and the flush_to_ldisc 142 path will process the flush request before it exits */ 143 if (test_bit(TTY_FLUSHING, &tty->flags)) { 144 set_bit(TTY_FLUSHPENDING, &tty->flags); 145 spin_unlock_irqrestore(&tty->buf.lock, flags); 146 wait_event(tty->read_wait, 147 test_bit(TTY_FLUSHPENDING, &tty->flags) == 0); 148 return; 149 } else 150 __tty_buffer_flush(tty); 151 spin_unlock_irqrestore(&tty->buf.lock, flags); 152} 153 154/** 155 * tty_buffer_find - find a free tty buffer 156 * @tty: tty owning the buffer 157 * @size: characters wanted 158 * 159 * Locate an existing suitable tty buffer or if we are lacking one then 160 * allocate a new one. We round our buffers off in 256 character chunks 161 * to get better allocation behaviour. 162 * 163 * Locking: Caller must hold tty->buf.lock 164 */ 165 166static struct tty_buffer *tty_buffer_find(struct tty_struct *tty, size_t size) 167{ 168 struct tty_buffer **tbh = &tty->buf.free; 169 while ((*tbh) != NULL) { 170 struct tty_buffer *t = *tbh; 171 if (t->size >= size) { 172 *tbh = t->next; 173 t->next = NULL; 174 t->used = 0; 175 t->commit = 0; 176 t->read = 0; 177 tty->buf.memory_used += t->size; 178 return t; 179 } 180 tbh = &((*tbh)->next); 181 } 182 /* Round the buffer size out */ 183 size = (size + 0xFF) & ~0xFF; 184 return tty_buffer_alloc(tty, size); 185 /* Should possibly check if this fails for the largest buffer we 186 have queued and recycle that ? */ 187} 188 189/** 190 * tty_buffer_request_room - grow tty buffer if needed 191 * @tty: tty structure 192 * @size: size desired 193 * 194 * Make at least size bytes of linear space available for the tty 195 * buffer. If we fail return the size we managed to find. 196 * 197 * Locking: Takes tty->buf.lock 198 */ 199int tty_buffer_request_room(struct tty_struct *tty, size_t size) 200{ 201 struct tty_buffer *b, *n; 202 int left; 203 unsigned long flags; 204 205 spin_lock_irqsave(&tty->buf.lock, flags); 206 207 /* OPTIMISATION: We could keep a per tty "zero" sized buffer to 208 remove this conditional if its worth it. This would be invisible 209 to the callers */ 210 if ((b = tty->buf.tail) != NULL) 211 left = b->size - b->used; 212 else 213 left = 0; 214 215 if (left < size) { 216 /* This is the slow path - looking for new buffers to use */ 217 if ((n = tty_buffer_find(tty, size)) != NULL) { 218 if (b != NULL) { 219 b->next = n; 220 b->commit = b->used; 221 } else 222 tty->buf.head = n; 223 tty->buf.tail = n; 224 } else 225 size = left; 226 } 227 228 spin_unlock_irqrestore(&tty->buf.lock, flags); 229 return size; 230} 231EXPORT_SYMBOL_GPL(tty_buffer_request_room); 232 233/** 234 * tty_insert_flip_string - Add characters to the tty buffer 235 * @tty: tty structure 236 * @chars: characters 237 * @size: size 238 * 239 * Queue a series of bytes to the tty buffering. All the characters 240 * passed are marked as without error. Returns the number added. 241 * 242 * Locking: Called functions may take tty->buf.lock 243 */ 244 245int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars, 246 size_t size) 247{ 248 int copied = 0; 249 do { 250 int space = tty_buffer_request_room(tty, size - copied); 251 struct tty_buffer *tb = tty->buf.tail; 252 /* If there is no space then tb may be NULL */ 253 if (unlikely(space == 0)) 254 break; 255 memcpy(tb->char_buf_ptr + tb->used, chars, space); 256 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space); 257 tb->used += space; 258 copied += space; 259 chars += space; 260 /* There is a small chance that we need to split the data over 261 several buffers. If this is the case we must loop */ 262 } while (unlikely(size > copied)); 263 return copied; 264} 265EXPORT_SYMBOL(tty_insert_flip_string); 266 267/** 268 * tty_insert_flip_string_flags - Add characters to the tty buffer 269 * @tty: tty structure 270 * @chars: characters 271 * @flags: flag bytes 272 * @size: size 273 * 274 * Queue a series of bytes to the tty buffering. For each character 275 * the flags array indicates the status of the character. Returns the 276 * number added. 277 * 278 * Locking: Called functions may take tty->buf.lock 279 */ 280 281int tty_insert_flip_string_flags(struct tty_struct *tty, 282 const unsigned char *chars, const char *flags, size_t size) 283{ 284 int copied = 0; 285 do { 286 int space = tty_buffer_request_room(tty, size - copied); 287 struct tty_buffer *tb = tty->buf.tail; 288 /* If there is no space then tb may be NULL */ 289 if (unlikely(space == 0)) 290 break; 291 memcpy(tb->char_buf_ptr + tb->used, chars, space); 292 memcpy(tb->flag_buf_ptr + tb->used, flags, space); 293 tb->used += space; 294 copied += space; 295 chars += space; 296 flags += space; 297 /* There is a small chance that we need to split the data over 298 several buffers. If this is the case we must loop */ 299 } while (unlikely(size > copied)); 300 return copied; 301} 302EXPORT_SYMBOL(tty_insert_flip_string_flags); 303 304/** 305 * tty_schedule_flip - push characters to ldisc 306 * @tty: tty to push from 307 * 308 * Takes any pending buffers and transfers their ownership to the 309 * ldisc side of the queue. It then schedules those characters for 310 * processing by the line discipline. 311 * 312 * Locking: Takes tty->buf.lock 313 */ 314 315void tty_schedule_flip(struct tty_struct *tty) 316{ 317 unsigned long flags; 318 spin_lock_irqsave(&tty->buf.lock, flags); 319 if (tty->buf.tail != NULL) 320 tty->buf.tail->commit = tty->buf.tail->used; 321 spin_unlock_irqrestore(&tty->buf.lock, flags); 322 schedule_delayed_work(&tty->buf.work, 1); 323} 324EXPORT_SYMBOL(tty_schedule_flip); 325 326/** 327 * tty_prepare_flip_string - make room for characters 328 * @tty: tty 329 * @chars: return pointer for character write area 330 * @size: desired size 331 * 332 * Prepare a block of space in the buffer for data. Returns the length 333 * available and buffer pointer to the space which is now allocated and 334 * accounted for as ready for normal characters. This is used for drivers 335 * that need their own block copy routines into the buffer. There is no 336 * guarantee the buffer is a DMA target! 337 * 338 * Locking: May call functions taking tty->buf.lock 339 */ 340 341int tty_prepare_flip_string(struct tty_struct *tty, unsigned char **chars, 342 size_t size) 343{ 344 int space = tty_buffer_request_room(tty, size); 345 if (likely(space)) { 346 struct tty_buffer *tb = tty->buf.tail; 347 *chars = tb->char_buf_ptr + tb->used; 348 memset(tb->flag_buf_ptr + tb->used, TTY_NORMAL, space); 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 357 * @tty: tty 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! 367 * 368 * Locking: May call functions taking tty->buf.lock 369 */ 370 371int tty_prepare_flip_string_flags(struct tty_struct *tty, 372 unsigned char **chars, char **flags, size_t size) 373{ 374 int space = tty_buffer_request_room(tty, size); 375 if (likely(space)) { 376 struct tty_buffer *tb = tty->buf.tail; 377 *chars = tb->char_buf_ptr + tb->used; 378 *flags = tb->flag_buf_ptr + tb->used; 379 tb->used += space; 380 } 381 return space; 382} 383EXPORT_SYMBOL_GPL(tty_prepare_flip_string_flags); 384 385 386 387/** 388 * flush_to_ldisc 389 * @work: tty structure passed from work queue. 390 * 391 * This routine is called out of the software interrupt to flush data 392 * from the buffer chain to the line discipline. 393 * 394 * Locking: holds tty->buf.lock to guard buffer list. Drops the lock 395 * while invoking the line discipline receive_buf method. The 396 * receive_buf method is single threaded for each tty instance. 397 */ 398 399static void flush_to_ldisc(struct work_struct *work) 400{ 401 struct tty_struct *tty = 402 container_of(work, struct tty_struct, buf.work.work); 403 unsigned long flags; 404 struct tty_ldisc *disc; 405 406 disc = tty_ldisc_ref(tty); 407 if (disc == NULL) /* !TTY_LDISC */ 408 return; 409 410 spin_lock_irqsave(&tty->buf.lock, flags); 411 412 if (!test_and_set_bit(TTY_FLUSHING, &tty->flags)) { 413 struct tty_buffer *head; 414 while ((head = tty->buf.head) != NULL) { 415 int count; 416 char *char_buf; 417 unsigned char *flag_buf; 418 419 count = head->commit - head->read; 420 if (!count) { 421 if (head->next == NULL) 422 break; 423 tty->buf.head = head->next; 424 tty_buffer_free(tty, head); 425 continue; 426 } 427 /* Ldisc or user is trying to flush the buffers 428 we are feeding to the ldisc, stop feeding the 429 line discipline as we want to empty the queue */ 430 if (test_bit(TTY_FLUSHPENDING, &tty->flags)) 431 break; 432 if (!tty->receive_room) { 433 schedule_delayed_work(&tty->buf.work, 1); 434 break; 435 } 436 if (count > tty->receive_room) 437 count = tty->receive_room; 438 char_buf = head->char_buf_ptr + head->read; 439 flag_buf = head->flag_buf_ptr + head->read; 440 head->read += count; 441 spin_unlock_irqrestore(&tty->buf.lock, flags); 442 disc->ops->receive_buf(tty, char_buf, 443 flag_buf, count); 444 spin_lock_irqsave(&tty->buf.lock, flags); 445 } 446 clear_bit(TTY_FLUSHING, &tty->flags); 447 } 448 449 /* We may have a deferred request to flush the input buffer, 450 if so pull the chain under the lock and empty the queue */ 451 if (test_bit(TTY_FLUSHPENDING, &tty->flags)) { 452 __tty_buffer_flush(tty); 453 clear_bit(TTY_FLUSHPENDING, &tty->flags); 454 wake_up(&tty->read_wait); 455 } 456 spin_unlock_irqrestore(&tty->buf.lock, flags); 457 458 tty_ldisc_deref(disc); 459} 460 461/** 462 * tty_flush_to_ldisc 463 * @tty: tty to push 464 * 465 * Push the terminal flip buffers to the line discipline. 466 * 467 * Must not be called from IRQ context. 468 */ 469void tty_flush_to_ldisc(struct tty_struct *tty) 470{ 471 flush_delayed_work(&tty->buf.work); 472} 473 474/** 475 * tty_flip_buffer_push - terminal 476 * @tty: tty to push 477 * 478 * Queue a push of the terminal flip buffers to the line discipline. This 479 * function must not be called from IRQ context if tty->low_latency is set. 480 * 481 * In the event of the queue being busy for flipping the work will be 482 * held off and retried later. 483 * 484 * Locking: tty buffer lock. Driver locks in low latency mode. 485 */ 486 487void tty_flip_buffer_push(struct tty_struct *tty) 488{ 489 unsigned long flags; 490 spin_lock_irqsave(&tty->buf.lock, flags); 491 if (tty->buf.tail != NULL) 492 tty->buf.tail->commit = tty->buf.tail->used; 493 spin_unlock_irqrestore(&tty->buf.lock, flags); 494 495 if (tty->low_latency) 496 flush_to_ldisc(&tty->buf.work.work); 497 else 498 schedule_delayed_work(&tty->buf.work, 1); 499} 500EXPORT_SYMBOL(tty_flip_buffer_push); 501 502/** 503 * tty_buffer_init - prepare a tty buffer structure 504 * @tty: tty to initialise 505 * 506 * Set up the initial state of the buffer management for a tty device. 507 * Must be called before the other tty buffer functions are used. 508 * 509 * Locking: none 510 */ 511 512void tty_buffer_init(struct tty_struct *tty) 513{ 514 spin_lock_init(&tty->buf.lock); 515 tty->buf.head = NULL; 516 tty->buf.tail = NULL; 517 tty->buf.free = NULL; 518 tty->buf.memory_used = 0; 519 INIT_DELAYED_WORK(&tty->buf.work, flush_to_ldisc); 520} 521