mempool: malloc: handle empty range list
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Apr 2024 19:29:05 +0000 (15:29 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Apr 2024 19:29:05 +0000 (15:29 -0400)
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

src/rseq-mempool.c

index ee38e26d8e3dc6fd361d0e1e473473cf9a8e8e22..324957043b9c6c6bda5596b90c02fd3aca103d0a 100644 (file)
@@ -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);
This page took 0.032614 seconds and 4 git commands to generate.