50aeea2dc0
- `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. |
||
---|---|---|
.. | ||
CMakeLists.txt | ||
Kconfig | ||
Make.defs | ||
iob.h | ||
iob_add_queue.c | ||
iob_alloc.c | ||
iob_alloc_qentry.c | ||
iob_clone.c | ||
iob_concat.c | ||
iob_contig.c | ||
iob_copyin.c | ||
iob_copyout.c | ||
iob_count.c | ||
iob_dump.c | ||
iob_free.c | ||
iob_free_chain.c | ||
iob_free_qentry.c | ||
iob_free_queue.c | ||
iob_free_queue_qentry.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.c | ||
iob_trimhead_queue.c | ||
iob_trimtail.c | ||
iob_update_pktlen.c |