lkml.org 
[lkml]   [2014]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: [PATCH] NoMoreModuleVmalloc - Try alloc_pages_exact before vmalloc, if fails do vmalloc
Date
Lucas Tanure <tanure@linux.com> writes:
> 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().

Hi Lucas,

This patch is wrong.

Firstly, you didn't list a motivation for getting rid of vmalloc. But
this patch doesn't make modules avoid vmalloc, it just makes the
temporary copy we create avoid vmalloc.

It also doesn't avoid the vfree() on the normal path; I'm pretty sure
this would crash if you tested it.

Thanks,
Rusty.

> 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


\
 
 \ /
  Last update: 2014-07-14 14:21    [W:0.057 / U:0.560 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site