/* * Find a stack vm_area (VM_GROWSDOWN) that includes . * A stack is LIFO so what is used is sp...vm->vm_end * The area vm->vm_start...sp is unused. Possibly free/unmap * part of the unused with respect to max_unused. * max_unused does not need to be page aligned: * suppose unused stack 5000 bytes, max_unused = 900 * we free a page and have 1004 bytes of unused stack. Ok * -- sxanth@ceid.upatras.gr */ asmlinkage int sys_adjstack (unsigned long sp, unsigned long max_unused) { struct vm_area_struct *vma; unsigned long d; if (!(vma = find_vma (current->mm, sp)) || !(vma->vm_flags & VM_GROWSDOWN)) return -EINVAL; d = sp - vma->vm_start; if (d <= max_unused) return 0; d -= max_unused; d &= PAGE_MASK; /* downwards alignment to page size */ if (d) { int ret; down(¤t->mm->mmap_sem); #if LINUX_VERSION_CODE < 0x020300 lock_kernel (); ret = do_munmap (vma->vm_start, d); unlock_kernel (); #else ret = madvise_vma (vma, vma->vm_start, vma->vm_start + d, MADV_DONTNEED); #endif up(¤t->mm->mmap_sem); return ret; } return 0; }