{
struct mm_struct *mm = vma->vm_mm;
struct rlimit *rlim = current->signal->rlim;
- unsigned long new_start;
+ unsigned long new_start, actual_size;
/* address space limit tests */
if (!may_expand_vm(mm, grow))
return -ENOMEM;
/* Stack limit test */
- if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
+ actual_size = size;
+ if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN)))
+ actual_size -= PAGE_SIZE;
+ if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
return -ENOMEM;
/* mlock limit tests */
detach_vmas_to_be_unmapped(mm, vma, prev, end);
unmap_region(mm, vma, prev, start, end);
+#ifdef CONFIG_ARCH_ROCKCHIP
+ {
+ extern int ion_munmap(void *dmabuf, struct vm_area_struct *vma);
+ extern int dma_buf_is_dma_buf(struct file *file);
+ if (vma->vm_file && dma_buf_is_dma_buf(vma->vm_file)) {
+ ion_munmap(vma->vm_file->private_data, vma);
+ }
+ }
+#endif
+
/* Fix up all other VM information */
remove_vma_list(mm, vma);