aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-03-01 13:36:26 -0500
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>2024-03-01 20:32:11 -0500
commitd24ee051c5391c3ae1a8eb76238653f2346e70c2 (patch)
tree7ac8e45557bb5860ef3e23af17f2ef0620f2ea3f
parent324633afa28b61038edd907bf222e7314f4ca522 (diff)
downloadlibrseq-d24ee051c5391c3ae1a8eb76238653f2346e70c2.tar.gz
Add __rseq_percpu pointer tagging
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Change-Id: I7a10ac1ad1e97aaaad947e29f377a103e380286d
-rw-r--r--include/rseq/percpu-alloc.h23
-rw-r--r--src/rseq-percpu-alloc.c23
2 files changed, 28 insertions, 18 deletions
diff --git a/include/rseq/percpu-alloc.h b/include/rseq/percpu-alloc.h
index 1084c75..e29fa00 100644
--- a/include/rseq/percpu-alloc.h
+++ b/include/rseq/percpu-alloc.h
@@ -16,6 +16,17 @@
extern "C" {
#endif
+/*
+ * Tag pointers returned by:
+ * - rseq_percpu_malloc(),
+ * - rseq_percpu_zmalloc(),
+ * - rseq_percpu_pool_set_malloc(),
+ * - rseq_percpu_pool_set_zmalloc().
+ *
+ * with __rseq_percpu for use by static analyzers.
+ */
+#define __rseq_percpu
+
struct rseq_percpu_pool;
struct rseq_percpu_pool *rseq_percpu_pool_create(size_t item_len,
@@ -24,11 +35,11 @@ struct rseq_percpu_pool *rseq_percpu_pool_create(size_t item_len,
int numa_flags);
int rseq_percpu_pool_destroy(struct rseq_percpu_pool *pool);
-void *rseq_percpu_malloc(struct rseq_percpu_pool *pool);
-void *rseq_percpu_zmalloc(struct rseq_percpu_pool *pool);
-void rseq_percpu_free(void *ptr);
+void __rseq_percpu *rseq_percpu_malloc(struct rseq_percpu_pool *pool);
+void __rseq_percpu *rseq_percpu_zmalloc(struct rseq_percpu_pool *pool);
+void rseq_percpu_free(void __rseq_percpu *ptr);
-void *__rseq_percpu_ptr(void *ptr, int cpu);
+void *__rseq_percpu_ptr(void __rseq_percpu *ptr, int cpu);
#define rseq_percpu_ptr(ptr, cpu) ((__typeof__(ptr)) __rseq_percpu_ptr(ptr, cpu))
@@ -37,8 +48,8 @@ int rseq_percpu_pool_set_destroy(struct rseq_percpu_pool_set *pool_set);
int rseq_percpu_pool_set_add_pool(struct rseq_percpu_pool_set *pool_set,
struct rseq_percpu_pool *pool);
-void *rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len);
-void *rseq_percpu_pool_set_zmalloc(struct rseq_percpu_pool_set *pool_set, size_t len);
+void __rseq_percpu *rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len);
+void __rseq_percpu *rseq_percpu_pool_set_zmalloc(struct rseq_percpu_pool_set *pool_set, size_t len);
#ifdef __cplusplus
}
diff --git a/src/rseq-percpu-alloc.c b/src/rseq-percpu-alloc.c
index 539c14b..1c6cfc7 100644
--- a/src/rseq-percpu-alloc.c
+++ b/src/rseq-percpu-alloc.c
@@ -116,7 +116,7 @@ void *__rseq_pool_percpu_ptr(struct rseq_percpu_pool *pool, int cpu, uintptr_t i
return pool->base + (pool->percpu_len * cpu) + item_offset;
}
-void *__rseq_percpu_ptr(void *_ptr, int cpu)
+void *__rseq_percpu_ptr(void __rseq_percpu *_ptr, int cpu)
{
uintptr_t ptr = (uintptr_t) _ptr;
uintptr_t item_offset = ptr & MAX_POOL_LEN_MASK;
@@ -140,8 +140,7 @@ void rseq_percpu_zero_item(struct rseq_percpu_pool *pool, uintptr_t item_offset)
#ifdef HAVE_LIBNUMA
static
-void rseq_percpu_pool_init_numa(struct rseq_percpu_pool *pool,
- int numa_flags)
+void rseq_percpu_pool_init_numa(struct rseq_percpu_pool *pool, int numa_flags)
{
unsigned long nr_pages, page;
long ret, page_len;
@@ -264,11 +263,11 @@ end:
}
static
-void *__rseq_percpu_malloc(struct rseq_percpu_pool *pool, bool zeroed)
+void __rseq_percpu *__rseq_percpu_malloc(struct rseq_percpu_pool *pool, bool zeroed)
{
struct free_list_node *node;
uintptr_t item_offset;
- void *addr;
+ void __rseq_percpu *addr;
pthread_mutex_lock(&pool->lock);
/* Get first entry from free list. */
@@ -295,17 +294,17 @@ end:
return addr;
}
-void *rseq_percpu_malloc(struct rseq_percpu_pool *pool)
+void __rseq_percpu *rseq_percpu_malloc(struct rseq_percpu_pool *pool)
{
return __rseq_percpu_malloc(pool, false);
}
-void *rseq_percpu_zmalloc(struct rseq_percpu_pool *pool)
+void __rseq_percpu *rseq_percpu_zmalloc(struct rseq_percpu_pool *pool)
{
return __rseq_percpu_malloc(pool, true);
}
-void rseq_percpu_free(void *_ptr)
+void rseq_percpu_free(void __rseq_percpu *_ptr)
{
uintptr_t ptr = (uintptr_t) _ptr;
uintptr_t item_offset = ptr & MAX_POOL_LEN_MASK;
@@ -372,11 +371,11 @@ end:
}
static
-void *__rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len, bool zeroed)
+void __rseq_percpu *__rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len, bool zeroed)
{
int order, min_order = POOL_SET_MIN_ENTRY;
struct rseq_percpu_pool *pool;
- void *addr;
+ void __rseq_percpu *addr;
order = rseq_get_count_order_ulong(len);
if (order > POOL_SET_MIN_ENTRY)
@@ -413,12 +412,12 @@ found:
return addr;
}
-void *rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len)
+void __rseq_percpu *rseq_percpu_pool_set_malloc(struct rseq_percpu_pool_set *pool_set, size_t len)
{
return __rseq_percpu_pool_set_malloc(pool_set, len, false);
}
-void *rseq_percpu_pool_set_zmalloc(struct rseq_percpu_pool_set *pool_set, size_t len)
+void __rseq_percpu *rseq_percpu_pool_set_zmalloc(struct rseq_percpu_pool_set *pool_set, size_t len)
{
return __rseq_percpu_pool_set_malloc(pool_set, len, true);
}