* prevent overflows and make comparisons vs. equal-width types.
*/
size = PAGE_ALIGN(size);
-
- mas_for_each(&mas, vma, size) {
+ while (vma && (loff_t)(vma->vm_end - addr) <= size) {
/* finding a matching vma now does not alter retval */
if ((vma->vm_ops == &shm_vm_ops) &&
((vma->vm_start - addr)/PAGE_SIZE == vma->vm_pgoff) &&
(vma->vm_file == file))
do_munmap(mm, vma->vm_start, vma->vm_end - vma->vm_start, NULL);
+
+ vma = mas_find(&mas, addr + size - 1);
}
#else /* CONFIG_MMU */
vma = mas_walk(&mas);
if (!vma) {
reset_ptenuma_scan(p);
- mas_reset(&mas);
start = 0;
mas_set(&mas, start);
}
mm_slot != &ksm_mm_head; mm_slot = ksm_scan.mm_slot) {
mm = mm_slot->mm;
mmap_read_lock(mm);
+ mas_set(&mas, 0);
mas_for_each(&mas, vma, ULONG_MAX) {
if (ksm_test_exit(mm))
break;
mm = slot->mm;
mmap_read_lock(mm);
if (ksm_test_exit(mm))
- vma = NULL;
- else {
- mas_set(&mas, ksm_scan.address);
- vma = mas_find(&mas, ULONG_MAX);
- }
+ goto no_vmas;
+ mas_set(&mas, ksm_scan.address);
mas_for_each(&mas, vma, ULONG_MAX) {
if (!(vma->vm_flags & VM_MERGEABLE))
continue;
}
if (ksm_test_exit(mm)) {
+no_vmas:
ksm_scan.address = 0;
ksm_scan.rmap_list = &slot->rmap_list;
}
if (start > vma->vm_start)
prev = vma;
- mas_for_each(&mas, vma, end) {
+ mas_for_each(&mas, vma, end - 1) {
next = vma_next(mm, vma);
vmstart = max(start, vma->vm_start);
vmend = min(end, vma->vm_end);
err = split_vma(vma->vm_mm, vma, vmend, 0);
if (err)
goto out;
+ mas_pause(&mas);
}
replace:
err = vma_replace_policy(vma, new_pol);
if ((pkey != -1) && !mm_pkey_is_allocated(current->mm, pkey))
goto out;
+ mas_set(&mas, start);
vma = mas_walk(&mas);
error = -ENOMEM;
if (!vma)
goto out;
- prev = vma_prev(vma->vm_mm, vma);
+ prev = mas_prev(&mas, 0);
if (unlikely(grows & PROT_GROWSDOWN)) {
if (vma->vm_start >= end)
goto out;