int (*munmap_func)(void *priv, void *ptr, size_t len),
void *mmap_priv);
+/*
+ * rseq_mempool_attr_set_init: Set pool attribute structure memory init functions.
+ *
+ * The @init_func callback used to initialized memory after allocation
+ * for the pool.
+ *
+ * The @init_priv argument is a private data pointer passed to the
+ * @init_func callback.
+ *
+ * Returns 0 on success, -1 with errno=EINVAL if arguments are invalid.
+ */
+int rseq_mempool_attr_set_init(struct rseq_mempool_attr *attr,
+ void (*init_func)(void *priv, void *addr, size_t len, int cpu),
+ void *init_priv);
+
/*
* rseq_mempool_attr_set_robust: Set pool robust attribute.
*
int (*munmap_func)(void *priv, void *ptr, size_t len);
void *mmap_priv;
+ bool init_set;
+ void (*init_func)(void *priv, void *addr, size_t len, int cpu);
+ void *init_priv;
+
bool robust_set;
enum mempool_type type;
void *__rseq_pool_range_percpu_ptr(struct rseq_mempool_range *range, int cpu,
uintptr_t item_offset, size_t stride)
{
- /* TODO: Implement multi-ranges support. */
return range->base + (stride * cpu) + item_offset;
}
if (create_alloc_bitmap(pool, range))
goto error_alloc;
}
+ if (pool->attr.init_set) {
+ int cpu;
+
+ for (cpu = 0; cpu < pool->attr.max_nr_cpus; cpu++) {
+ pool->attr.init_func(pool->attr.init_priv,
+ base + (pool->attr.stride * cpu),
+ pool->attr.stride, cpu);
+ }
+ }
return range;
error_alloc:
return 0;
}
+int rseq_mempool_attr_set_init(struct rseq_mempool_attr *attr,
+ void (*init_func)(void *priv, void *addr, size_t len, int cpu),
+ void *init_priv)
+{
+ if (!attr) {
+ errno = EINVAL;
+ return -1;
+ }
+ attr->init_set = true;
+ attr->init_func = init_func;
+ attr->init_priv = init_priv;
+ return 0;
+}
+
int rseq_mempool_attr_set_robust(struct rseq_mempool_attr *attr)
{
if (!attr) {