enum rseq_mempool_populate_policy {
/*
- * RSEQ_MEMPOOL_POPULATE_NONE (default):
+ * RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE (default):
* Do not populate pages for any of the CPUs when creating the
* mempool. Rely on copy-on-write (COW) of per-cpu pages to
* populate per-cpu pages from the initial values pages on
- * first write.
+ * first write. This mempool is only meant for single-process
+ * use (private mapping).
*/
- RSEQ_MEMPOOL_POPULATE_NONE = 0,
+ RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE = 0,
/*
- * RSEQ_MEMPOOL_POPULATE_ALL:
+ * RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL:
* Populate pages for all CPUs from 0 to (max_nr_cpus - 1)
- * when creating the mempool.
+ * when creating the mempool. This mempool is only meant for
+ * single-process use (private mapping).
*/
- RSEQ_MEMPOOL_POPULATE_ALL = 1,
+ RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL = 1,
};
/*
* - CPU 1,
* ...
* - CPU max_nr_cpus - 1
- * - init values (unpopulated for RSEQ_MEMPOOL_POPULATE_ALL).
+ * - init values (unpopulated for RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL).
* Aliases with free-list for non-robust populate none pool.
* - free list (for robust pool).
*
void *base;
/*
* The init values contains malloc_init/zmalloc values.
- * Pointer is NULL for RSEQ_MEMPOOL_POPULATE_ALL.
+ * Pointer is NULL for RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL.
*/
void *init;
size_t next_unused;
/* Skip cpus. */
p -= pool->attr.max_nr_cpus * pool->attr.stride;
/* Skip init values */
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
p -= pool->attr.stride;
} else {
/* Populate none free list is in init values */
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
p -= pool->attr.max_nr_cpus * pool->attr.stride;
}
return p;
/* Skip cpus. */
p += pool->attr.max_nr_cpus * pool->attr.stride;
/* Skip init values */
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
p += pool->attr.stride;
} else {
/* Populate none free list is in init values */
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
p += pool->attr.max_nr_cpus * pool->attr.stride;
}
return (struct free_list_node *) p;
page_size = rseq_get_page_len();
range_len = pool->attr.stride * pool->attr.max_nr_cpus;
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
range_len += pool->attr.stride; /* init values */
if (pool->attr.robust_set)
range_len += pool->attr.stride; /* free list */
range->mmap_addr = header;
range->mmap_len = page_size + range_len;
- if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_ALL) {
+ if (pool->attr.populate_policy != RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL) {
range->init = base + (pool->attr.stride * pool->attr.max_nr_cpus);
/* Populate init values pages from memfd */
if (rseq_memfd_reserve_init(range->init, pool->attr.stride))
{
int ret = 0;
- if (pool->attr.populate_policy == RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
return 0;
pthread_mutex_lock(&memfd.lock);
static
void rseq_mempool_memfd_unref(struct rseq_mempool *pool)
{
- if (pool->attr.populate_policy == RSEQ_MEMPOOL_POPULATE_ALL)
+ if (pool->attr.populate_policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
return;
pthread_mutex_lock(&memfd.lock);
break;
case MEMPOOL_TYPE_GLOBAL:
/* Override populate policy for global type. */
- attr.populate_policy = RSEQ_MEMPOOL_POPULATE_ALL;
+ if (attr.populate_policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE)
+ attr.populate_policy = RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL;
/* Use a 1-cpu pool for global mempool type. */
attr.max_nr_cpus = 1;
break;
ret = rseq_mempool_attr_set_max_nr_ranges(attr, 1);
if (ret)
abort();
- ret = rseq_mempool_attr_set_populate_policy(attr, RSEQ_MEMPOOL_POPULATE_NONE);
+ ret = rseq_mempool_attr_set_populate_policy(attr, RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE);
if (ret)
abort();
mempool = rseq_mempool_create("test_data", sizeof(struct test_data), attr);
ok(ret == 0, "Setting mempool poison");
ret = rseq_mempool_attr_set_populate_policy(attr, policy);
ok(ret == 0, "Setting mempool populate policy to %s",
- policy == RSEQ_MEMPOOL_POPULATE_NONE ? "NONE" : "ALL");
+ policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE ? "NONE" : "ALL");
mempool = rseq_mempool_create("test_data",
sizeof(struct test_data), attr);
ok(mempool, "Create mempool of size %zu", stride);
* after the last cpu memory range for populate all, and after
* the init values memory range for populate none.
*/
- if (policy == RSEQ_MEMPOOL_POPULATE_ALL)
+ if (policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
cpuptr = (struct test_data *) rseq_percpu_ptr(ptr, rseq_mempool_get_max_nr_cpus(pool));
else
cpuptr = (struct test_data *) rseq_percpu_ptr(ptr, rseq_mempool_get_max_nr_cpus(pool) + 1);
* after the last cpu memory range for populate all, and after
* the init values memory range for populate none.
*/
- if (policy == RSEQ_MEMPOOL_POPULATE_ALL)
+ if (policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL)
cpuptr = (struct test_data *) rseq_percpu_ptr(ptr, rseq_mempool_get_max_nr_cpus(pool));
else
cpuptr = (struct test_data *) rseq_percpu_ptr(ptr, rseq_mempool_get_max_nr_cpus(pool) + 1);
ret = rseq_mempool_attr_set_populate_policy(attr, policy);
ok(ret == 0, "Setting mempool populate policy to %s",
- policy == RSEQ_MEMPOOL_POPULATE_NONE ? "NONE" : "ALL");
+ policy == RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE ? "PRIVATE_NONE" : "PRIVATE_ALL");
pool = rseq_mempool_create("mempool-robust",
sizeof(struct test_data), attr);
for (nr_ranges = 1; nr_ranges < 32; nr_ranges <<= 1) {
/* From page size to 64kB */
for (len = rseq_get_page_len(); len < 65536; len <<= 1) {
- test_mempool_fill(RSEQ_MEMPOOL_POPULATE_ALL, nr_ranges, len);
- test_mempool_fill(RSEQ_MEMPOOL_POPULATE_NONE, nr_ranges, len);
+ test_mempool_fill(RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL, nr_ranges, len);
+ test_mempool_fill(RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE, nr_ranges, len);
}
}
len = 65536;
/* From min(page size, 64kB) to 4MB */
for (; len < 4096 * 1024; len <<= 1) {
- test_mempool_fill(RSEQ_MEMPOOL_POPULATE_ALL, 1, len);
- test_mempool_fill(RSEQ_MEMPOOL_POPULATE_NONE, 1, len);
+ test_mempool_fill(RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL, 1, len);
+ test_mempool_fill(RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE, 1, len);
}
- run_robust_tests(RSEQ_MEMPOOL_POPULATE_ALL);
- run_robust_tests(RSEQ_MEMPOOL_POPULATE_NONE);
+ run_robust_tests(RSEQ_MEMPOOL_POPULATE_PRIVATE_ALL);
+ run_robust_tests(RSEQ_MEMPOOL_POPULATE_PRIVATE_NONE);
exit(exit_status());
}