diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-03-09 15:26:12 -0500 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-03-09 15:26:12 -0500 |
commit | e11a02d7003c256fa2f3be7df5142686cef19ef2 (patch) | |
tree | e3291376c1c723c5679dd89580328440f9d8106f | |
parent | 9d9863530f6fa059d405bc6d531890f8a47c72f7 (diff) | |
download | librseq-e11a02d7003c256fa2f3be7df5142686cef19ef2.tar.gz |
mempool: Introduce rseq_mempool_attr_set_max_nr_ranges
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I5417673d16ce7cfa5e8f2b9c120978f8633664bc
-rw-r--r-- | include/rseq/mempool.h | 11 | ||||
-rw-r--r-- | src/rseq-mempool.c | 19 | ||||
-rw-r--r-- | tests/mempool_test.c | 2 |
3 files changed, 28 insertions, 4 deletions
diff --git a/include/rseq/mempool.h b/include/rseq/mempool.h index 4555a01..0b552df 100644 --- a/include/rseq/mempool.h +++ b/include/rseq/mempool.h @@ -466,6 +466,17 @@ int rseq_mempool_attr_set_percpu(struct rseq_mempool_attr *attr, int rseq_mempool_attr_set_global(struct rseq_mempool_attr *attr, size_t stride); /* + * rseq_mempool_attr_set_max_nr_ranges: Set upper-limit to range allocation. + * + * Set an upper-limit to range allocation. A @max_nr_ranges value of + * 0 means no limit (default). + * + * Returns 0 on success, -1 with errno=EINVAL if arguments are invalid. + */ +int rseq_mempool_attr_set_max_nr_ranges(struct rseq_mempool_attr *attr, + unsigned long max_nr_ranges); + +/* * rseq_mempool_range_init_numa: NUMA initialization helper for memory range. * * Helper which can be used from mempool_attr @init_func to move a CPU diff --git a/src/rseq-mempool.c b/src/rseq-mempool.c index 1bcfc8c..bf569a6 100644 --- a/src/rseq-mempool.c +++ b/src/rseq-mempool.c @@ -52,9 +52,6 @@ #define RANGE_HEADER_OFFSET sizeof(struct rseq_mempool_range) -//TODO: make this configurable -#define MEMPOOL_MAX_NR_RANGES 1 - struct free_list_node; struct free_list_node { @@ -81,6 +78,8 @@ struct rseq_mempool_attr { enum mempool_type type; size_t stride; int max_nr_cpus; + + unsigned long max_nr_ranges; }; struct rseq_mempool_range; @@ -446,7 +445,8 @@ struct rseq_mempool_range *rseq_mempool_range_create(struct rseq_mempool *pool) void *header; void *base; - if (pool->nr_ranges >= MEMPOOL_MAX_NR_RANGES) { + if (pool->attr.max_nr_ranges && + pool->nr_ranges >= pool->attr.max_nr_ranges) { errno = ENOMEM; return NULL; } @@ -908,6 +908,17 @@ int rseq_mempool_attr_set_global(struct rseq_mempool_attr *attr, return 0; } +int rseq_mempool_attr_set_max_nr_ranges(struct rseq_mempool_attr *attr, + unsigned long max_nr_ranges) +{ + if (!attr) { + errno = EINVAL; + return -1; + } + attr->max_nr_ranges = max_nr_ranges; + return 0; +} + int rseq_mempool_get_max_nr_cpus(struct rseq_mempool *mempool) { if (!mempool || mempool->attr.type != MEMPOOL_TYPE_PERCPU) { diff --git a/tests/mempool_test.c b/tests/mempool_test.c index 6e19246..c55d3db 100644 --- a/tests/mempool_test.c +++ b/tests/mempool_test.c @@ -46,6 +46,8 @@ static void test_mempool_fill(size_t stride) ok(ret == 0, "Setting mempool robust attribute"); ret = rseq_mempool_attr_set_percpu(attr, stride, CPU_SETSIZE); ok(ret == 0, "Setting mempool percpu type"); + ret = rseq_mempool_attr_set_max_nr_ranges(attr, 1); + ok(ret == 0, "Setting mempool max_nr_ranges=1"); mempool = rseq_mempool_create("test_data", sizeof(struct test_data), attr); ok(mempool, "Create mempool of size %zu", stride); |