diff options
Diffstat (limited to 'backport-include/linux/mm.h')
-rw-r--r-- | backport-include/linux/mm.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/backport-include/linux/mm.h b/backport-include/linux/mm.h new file mode 100644 index 0000000..8ff7d6a --- /dev/null +++ b/backport-include/linux/mm.h @@ -0,0 +1,61 @@ +#ifndef __BACKPORT_MM_H +#define __BACKPORT_MM_H +#include_next <linux/mm.h> +#include <linux/page_ref.h> +#include <linux/sched.h> +#include <linux/overflow.h> +#include <linux/vmalloc.h> +#include <linux/slab.h> + +#if LINUX_VERSION_IS_LESS(3,15,0) +#define kvfree LINUX_BACKPORT(kvfree) +void kvfree(const void *addr); +#endif /* < 3.15 */ + +#if LINUX_VERSION_IS_LESS(4,12,0) +#define kvmalloc LINUX_BACKPORT(kvmalloc) +static inline void *kvmalloc(size_t size, gfp_t flags) +{ + gfp_t kmalloc_flags = flags; + void *ret; + + if ((flags & GFP_KERNEL) != GFP_KERNEL) + return kmalloc(size, flags); + + if (size > PAGE_SIZE) + kmalloc_flags |= __GFP_NOWARN | __GFP_NORETRY; + + ret = kmalloc(size, flags); + if (ret || size < PAGE_SIZE) + return ret; + + return vmalloc(size); +} + +#define kvmalloc_array LINUX_BACKPORT(kvmalloc_array) +static inline void *kvmalloc_array(size_t n, size_t size, gfp_t flags) +{ + size_t bytes; + + if (unlikely(check_mul_overflow(n, size, &bytes))) + return NULL; + + return kvmalloc(bytes, flags); +} + +#define kvzalloc LINUX_BACKPORT(kvzalloc) +static inline void *kvzalloc(size_t size, gfp_t flags) +{ + return kvmalloc(size, flags | __GFP_ZERO); +} +#endif + +#if LINUX_VERSION_IS_LESS(4,18,0) +#define kvcalloc LINUX_BACKPORT(kvcalloc) +static inline void *kvcalloc(size_t n, size_t size, gfp_t flags) +{ + return kvmalloc_array(n, size, flags | __GFP_ZERO); +} +#endif /* < 4.18 */ + +#endif /* __BACKPORT_MM_H */ |