Provide variants of spinlocked kfifo_in() and kfifo_out() routines which don't disable interrupts.
Showing the changes to include/linux (1 of 1 file). Show all
Unified · Split
| @@ -517,6 +517,26 @@ __kfifo_uint_must_check_helper( \ · 516 unmodified lines | |||
| 517 | __ret; \ | 517 | __ret; \ |
| 518 | }) | 518 | }) |
| 519 | 519 | ||
| 520 | /** | ||
| 521 | * kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for | ||
| 522 | * locking, don't disable interrupts | ||
| 523 | * @fifo: address of the fifo to be used | ||
| 524 | * @buf: the data to be added | ||
| 525 | * @n: number of elements to be added | ||
| 526 | * @lock: pointer to the spinlock to use for locking | ||
| 527 | * | ||
| 528 | * This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock() | ||
| 529 | * for locking and doesn't disable interrupts. | ||
| 530 | */ | ||
| 531 | #define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \ | ||
| 532 | ({ \ | ||
| 533 | unsigned int __ret; \ | ||
| 534 | spin_lock(lock); \ | ||
| 535 | __ret = kfifo_in(fifo, buf, n); \ | ||
| 536 | spin_unlock(lock); \ | ||
| 537 | __ret; \ | ||
| 538 | }) | ||
| 539 | |||
| 520 | /* alias for kfifo_in_spinlocked, will be removed in a future release */ | 540 | /* alias for kfifo_in_spinlocked, will be removed in a future release */ |
| 521 | #define kfifo_in_locked(fifo, buf, n, lock) \ | 541 | #define kfifo_in_locked(fifo, buf, n, lock) \ |
| 522 | kfifo_in_spinlocked(fifo, buf, n, lock) | 542 | kfifo_in_spinlocked(fifo, buf, n, lock) |
| @@ -569,6 +589,28 @@ __kfifo_uint_must_check_helper( \ · 46 unmodified lines | |||
| 569 | }) \ | 589 | }) \ |
| 570 | ) | 590 | ) |
| 571 | 591 | ||
| 592 | /** | ||
| 593 | * kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock | ||
| 594 | * for locking, don't disable interrupts | ||
| 595 | * @fifo: address of the fifo to be used | ||
| 596 | * @buf: pointer to the storage buffer | ||
| 597 | * @n: max. number of elements to get | ||
| 598 | * @lock: pointer to the spinlock to use for locking | ||
| 599 | * | ||
| 600 | * This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock() | ||
| 601 | * for locking and doesn't disable interrupts. | ||
| 602 | */ | ||
| 603 | #define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \ | ||
| 604 | __kfifo_uint_must_check_helper( \ | ||
| 605 | ({ \ | ||
| 606 | unsigned int __ret; \ | ||
| 607 | spin_lock(lock); \ | ||
| 608 | __ret = kfifo_out(fifo, buf, n); \ | ||
| 609 | spin_unlock(lock); \ | ||
| 610 | __ret; \ | ||
| 611 | }) \ | ||
| 612 | ) | ||
| 613 | |||
| 572 | /* alias for kfifo_out_spinlocked, will be removed in a future release */ | 614 | /* alias for kfifo_out_spinlocked, will be removed in a future release */ |
| 573 | #define kfifo_out_locked(fifo, buf, n, lock) \ | 615 | #define kfifo_out_locked(fifo, buf, n, lock) \ |
| 574 | kfifo_out_spinlocked(fifo, buf, n, lock) | 616 | kfifo_out_spinlocked(fifo, buf, n, lock) |