From 5b1f2dff5ff6f63be1c8442decbb85bd087fd401 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 19 Jul 2021 19:45:30 +0900 Subject: [PATCH] iob_tryalloc: Fix throttled allocation If threads are blocking for throttled allocation, g_throttle_sem.semcount doesn't represent the number of usable IOBs well. Note: For non-throttled allocations, the g_iob_committed mechanism is a rescue. But there is no equivalent for throttled allocations. --- mm/iob/iob_alloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm/iob/iob_alloc.c b/mm/iob/iob_alloc.c index d4c9e91004..c26269f3c0 100644 --- a/mm/iob/iob_alloc.c +++ b/mm/iob/iob_alloc.c @@ -237,7 +237,8 @@ FAR struct iob_s *iob_tryalloc(bool throttled, enum iob_user_e consumerid) #if CONFIG_IOB_THROTTLE > 0 /* If there are free I/O buffers for this allocation */ - if (sem->semcount > 0) + if (sem->semcount > 0 || + (throttled && g_iob_sem.semcount - CONFIG_IOB_THROTTLE > 0)) #endif { /* Take the I/O buffer from the head of the free list */