From f06c65e79fc34c719568f577d638cc51716d8440 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 12 Apr 2024 15:29:05 -0400 Subject: [PATCH] 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 Change-Id: Ie646b16114eb1812916dad2b08f9d87884925748 --- src/rseq-mempool.c | 30 ++++++++++++++++++------------ 1 file 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); -- 2.34.1