aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-04-12 15:29:05 -0400
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-04-12 15:29:05 -0400
commitf06c65e79fc34c719568f577d638cc51716d8440 (patch)
tree05b55ff04fb9e700a98d524fb6b073115d62da85
parent252f9411a72b3155518648535550646474a6aca5 (diff)
downloadlibrseq-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.c30
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);