incubator-nuttx/mm/iob
Tiago Medicci Serrano 50aeea2dc0 mm/iob: Simplify IOB alloc/free logic
- `g_iob_sem.semcount` must be equal to the total number of free IOBs.
It can also be negative if there are no free IOBs and there are threads
waiting for an IOB.
- g_throttle_sem.semcount represents the number of IOBs available for
throttled IOB allocations. Like any other semaphore, it should only go
negative if there is a thread waiting for it.
- Both semaphores are related to the same resource (free IOBs), hence,
they must be incremented/decremented simultaneously:
  - Whenever a IOB buffer is freed, if a thread is waiting for a
non-throttled IOB or a thread is waiting for a throttled IOB and we
have at least `CONFIG_IOB_THROTTLE` buffers available, the IOB is put
in the committed list (`g_iob_committed`). Otherwise, it is put in the
common free list (`g_iob_freelist`).
  - `g_iob_sem` is always incremented when an IOB buffer is freed, but
`g_throttle_sem` is incremented only if we have at least CONFIG_IOB_THROTTLE
buffers free.
  - Both semaphores are posted with the schedule locked to avoid any
mismatches in the semaphores count.
  - If a task is waiting for an IOB semaphore (`iob_allocwait`) is
awakened and would check the `g_iob_committed`. The highest priority
task waiting for a semaphore will be awakened first.
2024-06-25 15:21:00 +08:00
..
CMakeLists.txt net/can: Add SO_RCVBUF option for can socket 2024-06-14 19:54:07 +08:00
Kconfig mm/iob: Support alloc IOB via malloc 2024-04-26 01:06:21 +08:00
Make.defs net/can: Add SO_RCVBUF option for can socket 2024-06-14 19:54:07 +08:00
iob.h mm/iob: Support alloc IOB via malloc 2024-04-26 01:06:21 +08:00
iob_add_queue.c mm/iob: Replace the critical section with spin lock 2023-10-30 11:18:34 +02:00
iob_alloc.c mm/iob: Simplify IOB alloc/free logic 2024-06-25 15:21:00 +08:00
iob_alloc_qentry.c mm/iob: Replace the critical section with spin lock 2023-10-30 11:18:34 +02:00
iob_clone.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_concat.c
iob_contig.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_copyin.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_copyout.c
iob_count.c
iob_dump.c
iob_free.c mm/iob: Simplify IOB alloc/free logic 2024-06-25 15:21:00 +08:00
iob_free_chain.c
iob_free_qentry.c mm/iob: Replace the critical section with spin lock 2023-10-30 11:18:34 +02:00
iob_free_queue.c
iob_free_queue_qentry.c mm/iob: Replace the critical section with spin lock 2023-10-30 11:18:34 +02:00
iob_get_queue_info.c net/can: Add SO_RCVBUF option for can socket 2024-06-14 19:54:07 +08:00
iob_initialize.c mm/iob: Support alloc IOB via malloc 2024-04-26 01:06:21 +08:00
iob_navail.c
iob_notifier.c
iob_pack.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_peek_queue.c
iob_remove_queue.c mm/iob: Replace the critical section with spin lock 2023-10-30 11:18:34 +02:00
iob_reserve.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_statistics.c
iob_tailroom.c mm/iob: replace CONFIG_IOB_BUFSIZE to IOB_BUFSIZE(iob) 2024-04-26 01:06:21 +08:00
iob_test.c mm/iob: Fix IOB length in `iob_reserve` 2023-08-22 09:09:21 +08:00
iob_trimhead.c
iob_trimhead_queue.c
iob_trimtail.c
iob_update_pktlen.c mm/iob: Support alloc IOB via malloc 2024-04-26 01:06:21 +08:00