*/
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.
*
#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 {
enum mempool_type type;
size_t stride;
int max_nr_cpus;
+
+ unsigned long max_nr_ranges;
};
struct rseq_mempool_range;
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;
}
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) {
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);