On Sun, 2 Jul 2023 at 15:45, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > Would you mind just verifying that yes, that commit on mainline is > broken for you, and the previous one works? Also, while I looked at it again, and still didn't understand why parisc would be different here, I *did* realize that because parisc has a stack that grows up, the debug warning I added for GUP won't trigger. So if I got that execve() logic wrong for STACK_GROWSUP (which I clearly must have), then exactly because it's grows-up, a GUP failure wouldn't warn about not expanding the stack. IOW, would you mind applying something like this on top of the current kernel, and let me know if it warns? .. and here I thought ia64 would be the pain-point. Silly me. Linus
mm/gup.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mm/gup.c b/mm/gup.c index ef29641671c7..66520194006b 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1168,11 +1168,15 @@ static long __get_user_pages(struct mm_struct *mm, /* first iteration or cross vma bound */ if (!vma || start >= vma->vm_end) { - vma = find_vma(mm, start); + struct vm_area_struct *prev = NULL; + vma = find_vma_prev(mm, start, &prev); if (vma && (start < vma->vm_start)) { WARN_ON_ONCE(vma->vm_flags & VM_GROWSDOWN); vma = NULL; } + if (!vma && prev && start >= prev->vm_end) + WARN_ON_ONCE(prev->vm_flags & VM_GROWSUP); + if (!vma && in_gate_area(mm, start)) { ret = get_gate_page(mm, start & PAGE_MASK, gup_flags, &vma,