mm: make stack guard page logic use vm_prev pointer

Like the mlock() change previously, this makes the stack guard check
code use vma->vm_prev to see what the mapping below the current stack
is, rather than have to look it up with find_vma().

Also, accept an abutting stack segment, since that happens naturally if
you split the stack with mlock or mprotect.

Tested-by: Ian Campbell <ijc@hellion.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+11 -4
+11 -4
mm/memory.c
··· 2770 2770 { 2771 2771 address &= PAGE_MASK; 2772 2772 if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) { 2773 - address -= PAGE_SIZE; 2774 - if (find_vma(vma->vm_mm, address) != vma) 2775 - return -ENOMEM; 2773 + struct vm_area_struct *prev = vma->vm_prev; 2776 2774 2777 - expand_stack(vma, address); 2775 + /* 2776 + * Is there a mapping abutting this one below? 2777 + * 2778 + * That's only ok if it's the same stack mapping 2779 + * that has gotten split.. 2780 + */ 2781 + if (prev && prev->vm_end == address) 2782 + return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM; 2783 + 2784 + expand_stack(vma, address - PAGE_SIZE); 2778 2785 } 2779 2786 return 0; 2780 2787 }