Hi Russell, I found that project http://kernelnewbies.org/KernelProjects/NoMoreModuleVmalloc. So I thought that doing first a alloc_pages_exact would be the goal. The kernel/module.c doesn't need this task any more, or I just did in the wrong way ?
Thanks -- Lucas Tanure +55 (19) 988176559 On Mon, Jul 14, 2014 at 7:18 AM, Rusty Russell <[email protected]> wrote: > Lucas Tanure <[email protected]> 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 <[email protected]> >> --- >> 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

