diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 15:29:05 -0400 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 15:29:05 -0400 |
commit | f06c65e79fc34c719568f577d638cc51716d8440 (patch) | |
tree | 05b55ff04fb9e700a98d524fb6b073115d62da85 | |
parent | 252f9411a72b3155518648535550646474a6aca5 (diff) | |
download | librseq-f06c65e79fc34c719568f577d638cc51716d8440.tar.gz |
mempool: malloc: handle empty range list
Although it is not currently possible to have an empty range list
because there is a range created on pool creation, handle empty range
list in __rseq_percpu_malloc for future-proofing.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ie646b16114eb1812916dad2b08f9d87884925748
-rw-r--r-- | src/rseq-mempool.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/rseq-mempool.c b/src/rseq-mempool.c index ee38e26..3249570 100644 --- a/src/rseq-mempool.c +++ b/src/rseq-mempool.c @@ -1081,21 +1081,27 @@ void __rseq_percpu *__rseq_percpu_malloc(struct rseq_mempool *pool, goto end; } /* - * If the most recent range (first in list) does not have any - * room left, create a new range and prepend it to the list - * head. + * If there are no ranges, or if the most recent range (first in + * list) does not have any room left, create a new range and + * prepend it to the list head. */ + if (list_empty(&pool->range_list)) + goto create_range; range = list_first_entry(&pool->range_list, struct rseq_mempool_range, node); - if (range->next_unused + pool->item_len > pool->attr.stride) { - range = rseq_mempool_range_create(pool); - if (!range) { - errno = ENOMEM; - addr = NULL; - goto end; - } - /* Add range to head of list. */ - list_add(&range->node, &pool->range_list); + if (range->next_unused + pool->item_len > pool->attr.stride) + goto create_range; + else + goto room_left; +create_range: + range = rseq_mempool_range_create(pool); + if (!range) { + errno = ENOMEM; + addr = NULL; + goto end; } + /* Add range to head of list. */ + list_add(&range->node, &pool->range_list); +room_left: /* First range in list has room left. */ item_offset = range->next_unused; addr = (void __rseq_percpu *) (range->base + item_offset); |