Messages in this thread | | | Date | Mon, 29 Apr 2013 01:57:18 -0700 | Subject | Re: 3.9-rc5: Encountedred INFO: rcu_sched self-detected stall on CPU due to 09a9f1d27 | From | Michel Lespinasse <> |
| |
On Mon, Apr 15, 2013 at 6:27 PM, Hugh Dickins <hughd@google.com> wrote: > On Mon, 15 Apr 2013, Michel Lespinasse wrote: >> sys_brk() passes the length as the difference of two page aligned addresses, so it's fine. But vm_brk() doesn't - it calls do_brk() which page aligns the length, but then vm_brk passes the unaligned length to mm_populate(). >> >> What do you think of the following ? len is already a PAGE_SIZE multiple when called from sys_brk()... > > Yes, that's good. >> >> diff --git a/mm/mmap.c b/mm/mmap.c >> index 0db0de1c2fbe..6af8b0d1c7db 100644 >> --- a/mm/mmap.c >> +++ b/mm/mmap.c >> @@ -2557,10 +2557,6 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) >> pgoff_t pgoff = addr >> PAGE_SHIFT; >> int error; >> >> - len = PAGE_ALIGN(len); >> - if (!len) >> - return addr; >> - >> flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags; >> >> error = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED); >> @@ -2643,6 +2639,10 @@ unsigned long vm_brk(unsigned long addr, unsigned long len) >> unsigned long ret; >> bool populate; >> >> + len = PAGE_ALIGN(len); >> + if (!len) >> + return addr; >> + >> down_write(&mm->mmap_sem); >> ret = do_brk(addr, len); >> populate = ((mm->def_flags & VM_LOCKED) != 0);
Vivek - what should I do with this change ? Do you want to take it as part of your series, or should I push to Linus/Andrew ?
All vm_brk calls are in elf and aout loaders, so I don' t think we can hit the issue without your changes. Still, it may be good to make vm_brk robust anyway.
-- Michel "Walken" Lespinasse A program is never fully debugged until the last user dies.
| |