mempool: Track allocated items per range
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Apr 2024 18:59:39 +0000 (14:59 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 12 Apr 2024 18:59:39 +0000 (14:59 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I48c05318c39b3f3bcf9c14a5aa3181e29754db97

src/rseq-mempool.c

index 730435d7805c601a999b74d7e32897dc72972747..83b317dd83ec1476335d1b27f5ef4675770b76e4 100644 (file)
@@ -137,6 +137,8 @@ struct rseq_mempool_range {
        void *mmap_addr;
        size_t mmap_len;
 
+       size_t allocated_items;
+
        /* Track alloc/free. */
        unsigned long *alloc_bitmap;
 };
@@ -1095,8 +1097,10 @@ void __rseq_percpu *__rseq_percpu_malloc(struct rseq_mempool *pool,
        addr = (void __rseq_percpu *) (range->base + item_offset);
        range->next_unused += pool->item_len;
 end:
-       if (addr)
+       if (addr) {
+               range->allocated_items++;
                set_alloc_slot(pool, range, item_offset);
+       }
        pthread_mutex_unlock(&pool->lock);
        if (addr) {
                if (zeroed)
@@ -1161,6 +1165,13 @@ void librseq_mempool_percpu_free(void __rseq_percpu *_ptr, size_t stride)
 
        pthread_mutex_lock(&pool->lock);
        clear_alloc_slot(pool, range, item_offset);
+       if (!range->allocated_items) {
+               fprintf(stderr, "%s: Trying to free an item from an empty pool range within pool \"%s\" (%p), item offset: %zu, caller: %p.\n",
+                       __func__, get_pool_name(pool), pool, item_offset,
+                       (void *) __builtin_return_address(0));
+               abort();
+       }
+       range->allocated_items--;
        /* Add ptr to head of free list */
        head = pool->free_list_head;
        if (pool->attr.poison_set)
This page took 0.032753 seconds and 4 git commands to generate.