|
@@ -1011,11 +1011,33 @@ int set_page_dirty_lock(struct page *page);
|
|
int clear_page_dirty_for_io(struct page *page);
|
|
int clear_page_dirty_for_io(struct page *page);
|
|
|
|
|
|
/* Is the vma a continuation of the stack vma above it? */
|
|
/* Is the vma a continuation of the stack vma above it? */
|
|
-static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr)
|
|
|
|
|
|
+static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr)
|
|
{
|
|
{
|
|
return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN);
|
|
return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline int stack_guard_page_start(struct vm_area_struct *vma,
|
|
|
|
+ unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return (vma->vm_flags & VM_GROWSDOWN) &&
|
|
|
|
+ (vma->vm_start == addr) &&
|
|
|
|
+ !vma_growsdown(vma->vm_prev, addr);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Is the vma a continuation of the stack vma below it? */
|
|
|
|
+static inline int vma_growsup(struct vm_area_struct *vma, unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return vma && (vma->vm_start == addr) && (vma->vm_flags & VM_GROWSUP);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline int stack_guard_page_end(struct vm_area_struct *vma,
|
|
|
|
+ unsigned long addr)
|
|
|
|
+{
|
|
|
|
+ return (vma->vm_flags & VM_GROWSUP) &&
|
|
|
|
+ (vma->vm_end == addr) &&
|
|
|
|
+ !vma_growsup(vma->vm_next, addr);
|
|
|
|
+}
|
|
|
|
+
|
|
extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
|
extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
|
unsigned long old_addr, struct vm_area_struct *new_vma,
|
|
unsigned long old_addr, struct vm_area_struct *new_vma,
|
|
unsigned long new_addr, unsigned long len);
|
|
unsigned long new_addr, unsigned long len);
|