mempool: Introduce rseq_mempool_attr_set_max_nr_ranges
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 20:26:12 +0000 (15:26 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 20:26:12 +0000 (15:26 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I5417673d16ce7cfa5e8f2b9c120978f8633664bc

include/rseq/mempool.h
src/rseq-mempool.c
tests/mempool_test.c

index 4555a017e2e48df284a86d66387d40936d618703..0b552dfdf272de0b3dbfd10bad4f834072302915 100644 (file)
@@ -465,6 +465,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.
  *
index 1bcfc8cc302b33bb05162fd4cf571f3468733136..bf569a603a2c653c8cb835138ab0d89854374000 100644 (file)
@@ -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) {
index 6e19246a10756d80286acb1b58fb5c2016cf6cc0..c55d3db9d8965135dcf2d4a10c9174ccc9afea42 100644 (file)
@@ -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);
This page took 0.030192 seconds and 4 git commands to generate.