mempool: Introduce init_func attribute
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 13:35:44 +0000 (08:35 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 13:35:44 +0000 (08:35 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I1e36bae465b0f459b4b6a4f8182cf524e0e6ade5

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

index 78ff06db62d41ce794b62fe8dae5b6251b5013c4..b1ec67586aa74e60e8dc7ff48515aa186c08dac3 100644 (file)
@@ -400,6 +400,21 @@ int rseq_mempool_attr_set_mmap(struct rseq_mempool_attr *attr,
                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.
  *
index eb2d0b1c75a86b83dc0556bf9693db113a46f84e..afde17a513d90480b2a8bf6bfccdc6c0960196de 100644 (file)
@@ -75,6 +75,10 @@ struct rseq_mempool_attr {
        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;
@@ -132,7 +136,6 @@ static
 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;
 }
 
@@ -476,6 +479,15 @@ struct rseq_mempool_range *rseq_mempool_range_create(struct rseq_mempool *pool)
                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:
@@ -826,6 +838,20 @@ int rseq_mempool_attr_set_mmap(struct rseq_mempool_attr *attr,
        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) {
This page took 0.025962 seconds and 4 git commands to generate.