diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-11-12 16:48:07 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-11-12 16:48:07 -0500 |
commit | 3347339bbd1e39fbb254d3d80f10b2e3b4d19e6e (patch) | |
tree | e10659d3772db2d238bcf0f814348e850107ea8b /include/linux/vmalloc.h | |
parent | e9afb70d261e420e540b0c79a718e76b03b1182b (diff) |
Simple stupid memory reclaim code
Diffstat (limited to 'include/linux/vmalloc.h')
-rw-r--r-- | include/linux/vmalloc.h | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index debdced..c91e3a8 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -4,6 +4,7 @@ #include <stdlib.h> #include <sys/mman.h> +#include "linux/slab.h" #include "tools-util.h" #define PAGE_KERNEL 0 @@ -13,16 +14,21 @@ static inline void *__vmalloc(unsigned long size, gfp_t gfp_mask, unsigned prot) { - void *p = aligned_alloc(PAGE_SIZE, size); + void *p; - if (p && prot == PAGE_KERNEL_EXEC) { - if (mprotect(p, size, PROT_READ|PROT_WRITE|PROT_EXEC)) { - vfree(p); - p = NULL; - } + run_shrinkers(); + + p = aligned_alloc(PAGE_SIZE, size); + if (!p) + return NULL; + + if (prot == PAGE_KERNEL_EXEC && + mprotect(p, size, PROT_READ|PROT_WRITE|PROT_EXEC)) { + vfree(p); + return NULL; } - if (p && (gfp_mask & __GFP_ZERO)) + if (gfp_mask & __GFP_ZERO) memset(p, 0, size); return p; |