Messages in this thread Patch in this message | | | Date | Sun, 13 Jul 2014 10:04:08 -0300 | From | Lucas Tanure <> | Subject | [PATCH] NoMoreModuleVmalloc - Try alloc_pages_exact before vmalloc, if fails do vmalloc |
| |
Convert vmalloc() call to alloc_pages_exact(). If alloc_pages_exact() fails, then fall back to vmalloc(). If the address is a vmalloc address, then call vfree(), otherwise call free_pages_exact().
Signed-off-by: Lucas Tanure <tanure@linux.com> --- kernel/module.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/kernel/module.c b/kernel/module.c index ae79ce6..50c1e77 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2484,6 +2484,7 @@ static int copy_module_from_user(const void __user *umod, unsigned long len, struct load_info *info) { int err; + bool alloc_from_vmalloc = false; info->len = len; if (info->len < sizeof(*(info->hdr))) @@ -2494,12 +2495,19 @@ static int copy_module_from_user(const void __user *umod, unsigned long len, return err; /* Suck in entire file: we'll want most of it. */ - info->hdr = vmalloc(info->len); - if (!info->hdr) - return -ENOMEM; + info->hdr = alloc_pages_exact(info->len, GFP_KERNEL); + if (!info->hdr) { + info->hdr = vmalloc(info->len); + if (!info->hdr) + return -ENOMEM; + alloc_from_vmalloc = true; + } if (copy_from_user(info->hdr, umod, info->len) != 0) { - vfree(info->hdr); + if(alloc_from_vmalloc) + vfree(info->hdr); + else + free_pages_exact(info->hdr,info->len); return -EFAULT; } -- 2.0.1
| |