|
@@ -463,6 +463,7 @@ hugetlb_vmdelete_list(struct rb_root *root, pgoff_t start, pgoff_t end)
|
|
|
*/
|
|
|
vma_interval_tree_foreach(vma, root, start, end ? end : ULONG_MAX) {
|
|
|
unsigned long v_offset;
|
|
|
+ unsigned long v_end;
|
|
|
|
|
|
/*
|
|
|
* Can the expression below overflow on 32-bit arches?
|
|
@@ -475,15 +476,17 @@ hugetlb_vmdelete_list(struct rb_root *root, pgoff_t start, pgoff_t end)
|
|
|
else
|
|
|
v_offset = 0;
|
|
|
|
|
|
- if (end) {
|
|
|
- end = ((end - start) << PAGE_SHIFT) +
|
|
|
- vma->vm_start + v_offset;
|
|
|
- if (end > vma->vm_end)
|
|
|
- end = vma->vm_end;
|
|
|
- } else
|
|
|
- end = vma->vm_end;
|
|
|
+ if (!end)
|
|
|
+ v_end = vma->vm_end;
|
|
|
+ else {
|
|
|
+ v_end = ((end - vma->vm_pgoff) << PAGE_SHIFT)
|
|
|
+ + vma->vm_start;
|
|
|
+ if (v_end > vma->vm_end)
|
|
|
+ v_end = vma->vm_end;
|
|
|
+ }
|
|
|
|
|
|
- unmap_hugepage_range(vma, vma->vm_start + v_offset, end, NULL);
|
|
|
+ unmap_hugepage_range(vma, vma->vm_start + v_offset, v_end,
|
|
|
+ NULL);
|
|
|
}
|
|
|
}
|
|
|
|