aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-04-12 15:20:35 -0400
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-04-12 15:20:35 -0400
commit252f9411a72b3155518648535550646474a6aca5 (patch)
treed7b238ec21586842430a80388c42c5d2ee5efb84
parentffea0dea60059c855cb0b4e1f784352012ae0b37 (diff)
downloadlibrseq-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.am2
-rw-r--r--src/list.h (renamed from tests/list.h)0
-rw-r--r--src/rseq-mempool.c42
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/mempool_test.c2
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