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
iob_add_queue.c
iob_alloc_qentry.c
iob_alloc.c
iob_clone.c
iob_concat.c
iob_contig.c
iob_copyin.c
iob_copyout.c
iob_count.c
iob_dump.c
iob_free_chain.c
iob_free_qentry.c
iob_free_queue_qentry.c
iob_free_queue.c
iob_free.c
iob_get_queue_info.c
iob_initialize.c
iob_navail.c
iob_notifier.c
iob_pack.c
iob_peek_queue.c
iob_remove_queue.c
iob_reserve.c
iob_statistics.c
iob_tailroom.c
iob_test.c
iob_trimhead_queue.c
iob_trimhead.c
iob_trimtail.c
iob_update_pktlen.c
iob.h
Kconfig
Make.defs