diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-03-01 13:36:26 -0500 |
---|---|---|
committer | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2024-03-01 20:32:11 -0500 |
commit | d24ee051c5391c3ae1a8eb76238653f2346e70c2 (patch) | |
tree | 7ac8e45557bb5860ef3e23af17f2ef0620f2ea3f | |
parent | 324633afa28b61038edd907bf222e7314f4ca522 (diff) | |
download | librseq-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.h | 23 | ||||
-rw-r--r-- | src/rseq-percpu-alloc.c | 23 |
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); } |