diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 15:20:35 -0400 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-04-12 15:20:35 -0400 |
commit | 252f9411a72b3155518648535550646474a6aca5 (patch) | |
tree | d7b238ec21586842430a80388c42c5d2ee5efb84 | |
parent | ffea0dea60059c855cb0b4e1f784352012ae0b37 (diff) | |
download | librseq-252f9411a72b3155518648535550646474a6aca5.tar.gz |
mempool: use list.h API
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I2cabb4b8b6ff70cd111961335c0306b0ec76e827
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/list.h (renamed from tests/list.h) | 0 | ||||
-rw-r--r-- | src/rseq-mempool.c | 42 | ||||
-rw-r--r-- | tests/Makefile.am | 4 | ||||
-rw-r--r-- | tests/mempool_test.c | 2 |
5 files changed, 27 insertions, 23 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index e313f27..424192a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,7 +4,7 @@ lib_LTLIBRARIES = librseq.la librseq_la_SOURCES = \ - rseq.c rseq-mempool.c rseq-utils.h smp.c smp.h + rseq.c rseq-mempool.c rseq-utils.h smp.c smp.h list.h librseq_la_LDFLAGS = -no-undefined -version-info $(RSEQ_LIBRARY_VERSION) librseq_la_LIBADD = $(DL_LIBS) diff --git a/tests/list.h b/src/list.h index 39a456b..39a456b 100644 --- a/tests/list.h +++ b/src/list.h diff --git a/src/rseq-mempool.c b/src/rseq-mempool.c index 83b317d..ee38e26 100644 --- a/src/rseq-mempool.c +++ b/src/rseq-mempool.c @@ -22,6 +22,7 @@ #endif #include "rseq-utils.h" +#include "list.h" #include <rseq/rseq.h> /* @@ -101,7 +102,7 @@ struct rseq_mempool_attr { struct rseq_mempool_range; struct rseq_mempool_range { - struct rseq_mempool_range *next; /* Linked list of ranges. */ + struct list_head node; /* Linked list of ranges. */ struct rseq_mempool *pool; /* Backward reference to container pool. */ /* @@ -144,8 +145,7 @@ struct rseq_mempool_range { }; struct rseq_mempool { - /* Head of ranges linked-list. */ - struct rseq_mempool_range *range_list; + struct list_head range_list; /* Head of ranges linked-list. */ unsigned long nr_ranges; size_t item_len; @@ -493,7 +493,7 @@ bool percpu_addr_in_pool(const struct rseq_mempool *pool, void __rseq_percpu *_a struct rseq_mempool_range *range; void *addr = (void *) _addr; - for (range = pool->range_list; range; range = range->next) { + list_for_each_entry(range, &pool->range_list, node) { if (addr >= range->base && addr < range->base + range->next_unused) return true; } @@ -511,7 +511,7 @@ void check_free_list(const struct rseq_mempool *pool, bool mapping_accessible) if (!pool->attr.robust_set || !mapping_accessible) return; - for (range = pool->range_list; range; range = range->next) { + list_for_each_entry(range, &pool->range_list, node) { total_item += pool->attr.stride >> pool->item_order; total_never_allocated += (pool->attr.stride - range->next_unused) >> pool->item_order; } @@ -570,7 +570,7 @@ void check_pool_poison(const struct rseq_mempool *pool, bool mapping_accessible) if (!pool->attr.robust_set || !mapping_accessible) return; - for (range = pool->range_list; range; range = range->next) + list_for_each_entry(range, &pool->range_list, node) check_range_poison(pool, range); } @@ -872,9 +872,9 @@ bool pool_mappings_accessible(struct rseq_mempool *pool) if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_COW_INIT) return true; - range = pool->range_list; - if (!range) + if (list_empty(&pool->range_list)) return true; + range = list_first_entry(&pool->range_list, struct rseq_mempool_range, node); page_size = rseq_get_page_len(); /* * Header first page is one page before the page containing the @@ -891,7 +891,7 @@ bool pool_mappings_accessible(struct rseq_mempool *pool) int rseq_mempool_destroy(struct rseq_mempool *pool) { - struct rseq_mempool_range *range, *next_range; + struct rseq_mempool_range *range, *tmp_range; bool mapping_accessible; int ret = 0; @@ -910,11 +910,13 @@ int rseq_mempool_destroy(struct rseq_mempool *pool) check_pool_poison(pool, mapping_accessible); /* Iteration safe against removal. */ - for (range = pool->range_list; range && (next_range = range->next, 1); range = next_range) { - if (rseq_mempool_range_destroy(pool, range, mapping_accessible)) + list_for_each_entry_safe(range, tmp_range, &pool->range_list, node) { + list_del(&range->node); + if (rseq_mempool_range_destroy(pool, range, mapping_accessible)) { + /* Keep list coherent in case of partial failure. */ + list_add(&range->node, &pool->range_list); goto end; - /* Update list head to keep list coherent in case of partial failure. */ - pool->range_list = next_range; + } } pthread_mutex_destroy(&pool->lock); free(pool->name); @@ -926,8 +928,9 @@ end: struct rseq_mempool *rseq_mempool_create(const char *pool_name, size_t item_len, const struct rseq_mempool_attr *_attr) { - struct rseq_mempool *pool; struct rseq_mempool_attr attr = {}; + struct rseq_mempool_range *range; + struct rseq_mempool *pool; int order; /* Make sure each item is large enough to contain free list pointers. */ @@ -1004,10 +1007,12 @@ struct rseq_mempool *rseq_mempool_create(const char *pool_name, pthread_mutex_init(&pool->lock, NULL); pool->item_len = item_len; pool->item_order = order; + INIT_LIST_HEAD(&pool->range_list); - pool->range_list = rseq_mempool_range_create(pool); - if (!pool->range_list) + range = rseq_mempool_range_create(pool); + if (!range) goto error_alloc; + list_add(&range->node, &pool->range_list); if (pool_name) { pool->name = strdup(pool_name); @@ -1080,7 +1085,7 @@ void __rseq_percpu *__rseq_percpu_malloc(struct rseq_mempool *pool, * room left, create a new range and prepend it to the list * head. */ - range = pool->range_list; + 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) { @@ -1089,8 +1094,7 @@ void __rseq_percpu *__rseq_percpu_malloc(struct rseq_mempool *pool, goto end; } /* Add range to head of list. */ - range->next = pool->range_list; - pool->range_list = range; + list_add(&range->node, &pool->range_list); } /* First range in list has room left. */ item_offset = range->next_unused; diff --git a/tests/Makefile.am b/tests/Makefile.am index 1a50a72..2cc71e8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -90,10 +90,10 @@ basic_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/util basic_test_cxx_tap_SOURCES = basic_test_cxx.cpp basic_test_cxx_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS) -mempool_test_tap_SOURCES = mempool_test.c list.h +mempool_test_tap_SOURCES = mempool_test.c mempool_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS) -mempool_test_cxx_tap_SOURCES = mempool_test_cxx.cpp list.h +mempool_test_cxx_tap_SOURCES = mempool_test_cxx.cpp mempool_test_cxx_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS) mempool_cow_race_test_tap_SOURCES = mempool_cow_race_test.c diff --git a/tests/mempool_test.c b/tests/mempool_test.c index 42654dd..3fe1029 100644 --- a/tests/mempool_test.c +++ b/tests/mempool_test.c @@ -21,7 +21,7 @@ #include <rseq/mempool.h> #include "../src/rseq-utils.h" -#include "list.h" +#include "../src/list.h" #include "tap.h" #if RSEQ_BITS_PER_LONG == 64 |