aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-03-09 15:26:12 -0500
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-03-09 15:26:12 -0500
commite11a02d7003c256fa2f3be7df5142686cef19ef2 (patch)
treee3291376c1c723c5679dd89580328440f9d8106f
parent9d9863530f6fa059d405bc6d531890f8a47c72f7 (diff)
downloadlibrseq-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.h11
-rw-r--r--src/rseq-mempool.c19
-rw-r--r--tests/mempool_test.c2
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);