summaryrefslogtreecommitdiff
path: root/include/linux/vmalloc.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-11-12 16:48:07 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2017-11-12 16:48:07 -0500
commit3347339bbd1e39fbb254d3d80f10b2e3b4d19e6e (patch)
treee10659d3772db2d238bcf0f814348e850107ea8b /include/linux/vmalloc.h
parente9afb70d261e420e540b0c79a718e76b03b1182b (diff)
Simple stupid memory reclaim code
Diffstat (limited to 'include/linux/vmalloc.h')
-rw-r--r--include/linux/vmalloc.h20
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;