Use __attribute__((malloc)) on memory allocation functions

This informs the C compiler that pointers returned from these functions
do not alias other functions, which allows it to do better code
optimization and should make the compiled code smaller.

References:
https://stackoverflow.com/a/53654773
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
https://clang.llvm.org/docs/AttributeReference.html#malloc

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #14827
This commit is contained in:
Richard Yao 2023-05-26 18:47:52 -04:00 committed by GitHub
parent 20494d47d2
commit 0f03a41161
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 14 deletions

View File

@ -75,7 +75,7 @@ typedef struct kmem_cache {
extern uint64_t spl_kmem_cache_inuse(kmem_cache_t *cache); extern uint64_t spl_kmem_cache_inuse(kmem_cache_t *cache);
extern uint64_t spl_kmem_cache_entry_size(kmem_cache_t *cache); extern uint64_t spl_kmem_cache_entry_size(kmem_cache_t *cache);
__attribute__((alloc_size(1))) __attribute__((malloc, alloc_size(1)))
void *zfs_kmem_alloc(size_t size, int kmflags); void *zfs_kmem_alloc(size_t size, int kmflags);
void zfs_kmem_free(void *buf, size_t size); void zfs_kmem_free(void *buf, size_t size);
uint64_t kmem_size(void); uint64_t kmem_size(void);
@ -83,6 +83,7 @@ kmem_cache_t *kmem_cache_create(const char *name, size_t bufsize, size_t align,
int (*constructor)(void *, void *, int), void (*destructor)(void *, void *), int (*constructor)(void *, void *, int), void (*destructor)(void *, void *),
void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags); void (*reclaim)(void *) __unused, void *private, vmem_t *vmp, int cflags);
void kmem_cache_destroy(kmem_cache_t *cache); void kmem_cache_destroy(kmem_cache_t *cache);
__attribute__((malloc))
void *kmem_cache_alloc(kmem_cache_t *cache, int flags); void *kmem_cache_alloc(kmem_cache_t *cache, int flags);
void kmem_cache_free(kmem_cache_t *cache, void *buf); void kmem_cache_free(kmem_cache_t *cache, void *buf);
boolean_t kmem_cache_reap_active(void); boolean_t kmem_cache_reap_active(void);

View File

@ -31,10 +31,10 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
extern int kmem_debugging(void); extern int kmem_debugging(void);
extern char *kmem_vasprintf(const char *fmt, va_list ap) __attribute__((format(printf, 1, 0)))
__attribute__((format(printf, 1, 0))); extern char *kmem_vasprintf(const char *fmt, va_list ap);
extern char *kmem_asprintf(const char *fmt, ...) __attribute__((format(printf, 1, 2)))
__attribute__((format(printf, 1, 2))); extern char *kmem_asprintf(const char *fmt, ...);
extern char *kmem_strdup(const char *str); extern char *kmem_strdup(const char *str);
extern void kmem_strfree(char *str); extern void kmem_strfree(char *str);
@ -186,10 +186,10 @@ extern unsigned int spl_kmem_alloc_max;
#define kmem_free(ptr, sz) spl_kmem_free((ptr), (sz)) #define kmem_free(ptr, sz) spl_kmem_free((ptr), (sz))
#define kmem_cache_reap_active spl_kmem_cache_reap_active #define kmem_cache_reap_active spl_kmem_cache_reap_active
extern void *spl_kmem_alloc(size_t sz, int fl, const char *func, int line) __attribute__((malloc, alloc_size(1)))
__attribute__((alloc_size(1))); extern void *spl_kmem_alloc(size_t sz, int fl, const char *func, int line);
extern void *spl_kmem_zalloc(size_t sz, int fl, const char *func, int line) __attribute__((malloc, alloc_size(1)))
__attribute__((alloc_size(1))); extern void *spl_kmem_zalloc(size_t sz, int fl, const char *func, int line);
extern void spl_kmem_free(const void *ptr, size_t sz); extern void spl_kmem_free(const void *ptr, size_t sz);
/* /*

View File

@ -91,8 +91,10 @@ typedef struct vmem { } vmem_t;
#define vmem_zalloc(sz, fl) spl_vmem_zalloc((sz), (fl), __func__, __LINE__) #define vmem_zalloc(sz, fl) spl_vmem_zalloc((sz), (fl), __func__, __LINE__)
#define vmem_free(ptr, sz) spl_vmem_free((ptr), (sz)) #define vmem_free(ptr, sz) spl_vmem_free((ptr), (sz))
extern void *spl_vmem_alloc(size_t sz, int fl, const char *func, int line); extern void *spl_vmem_alloc(size_t sz, int fl, const char *func, int line)
extern void *spl_vmem_zalloc(size_t sz, int fl, const char *func, int line); __attribute__((malloc, alloc_size(1)));
extern void *spl_vmem_zalloc(size_t sz, int fl, const char *func, int line)
__attribute__((malloc, alloc_size(1)));
extern void spl_vmem_free(const void *ptr, size_t sz); extern void spl_vmem_free(const void *ptr, size_t sz);
int spl_vmem_init(void); int spl_vmem_init(void);

View File

@ -86,10 +86,15 @@ extern int zfs_abd_scatter_enabled;
* Allocations and deallocations * Allocations and deallocations
*/ */
__attribute__((malloc))
abd_t *abd_alloc(size_t, boolean_t); abd_t *abd_alloc(size_t, boolean_t);
__attribute__((malloc))
abd_t *abd_alloc_linear(size_t, boolean_t); abd_t *abd_alloc_linear(size_t, boolean_t);
__attribute__((malloc))
abd_t *abd_alloc_gang(void); abd_t *abd_alloc_gang(void);
__attribute__((malloc))
abd_t *abd_alloc_for_io(size_t, boolean_t); abd_t *abd_alloc_for_io(size_t, boolean_t);
__attribute__((malloc))
abd_t *abd_alloc_sametype(abd_t *, size_t); abd_t *abd_alloc_sametype(abd_t *, size_t);
boolean_t abd_size_alloc_linear(size_t); boolean_t abd_size_alloc_linear(size_t);
void abd_gang_add(abd_t *, abd_t *, boolean_t); void abd_gang_add(abd_t *, abd_t *, boolean_t);

View File

@ -83,7 +83,7 @@ const char *_umem_debug_init(void);
const char *_umem_options_init(void); const char *_umem_options_init(void);
const char *_umem_logging_init(void); const char *_umem_logging_init(void);
__attribute__((alloc_size(1))) __attribute__((malloc, alloc_size(1)))
static inline void * static inline void *
umem_alloc(size_t size, int flags) umem_alloc(size_t size, int flags)
{ {
@ -96,7 +96,7 @@ umem_alloc(size_t size, int flags)
return (ptr); return (ptr);
} }
__attribute__((alloc_size(1))) __attribute__((malloc, alloc_size(1)))
static inline void * static inline void *
umem_alloc_aligned(size_t size, size_t align, int flags) umem_alloc_aligned(size_t size, size_t align, int flags)
{ {
@ -118,7 +118,7 @@ umem_alloc_aligned(size_t size, size_t align, int flags)
return (ptr); return (ptr);
} }
__attribute__((alloc_size(1))) __attribute__((malloc, alloc_size(1)))
static inline void * static inline void *
umem_zalloc(size_t size, int flags) umem_zalloc(size_t size, int flags)
{ {
@ -188,6 +188,7 @@ umem_cache_destroy(umem_cache_t *cp)
umem_free(cp, sizeof (umem_cache_t)); umem_free(cp, sizeof (umem_cache_t));
} }
__attribute__((malloc))
static inline void * static inline void *
umem_cache_alloc(umem_cache_t *cp, int flags) umem_cache_alloc(umem_cache_t *cp, int flags)
{ {