aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAndrea Arcangeli <aarcange@redhat.com>2021-05-19 18:55:21 -0400
committerAndrea Arcangeli <aarcange@redhat.com>2023-11-11 22:03:37 -0500
commitd8f1dc1351e3bb960a61375e7c908a8f558672ae (patch)
tree88f59151acc7417ea9a3fe053f2a8ba3f4470b7c
parentb6ec57e1e972c2824a4a83d690ad6d15c204c26c (diff)
downloadaa-d8f1dc1351e3bb960a61375e7c908a8f558672ae.tar.gz
mm: mm_take_all_locks: add cond_resched()
Add cond_resched() to potentially long tight loops. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
-rw-r--r--mm/mmap.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/mmap.c b/mm/mmap.c
index a0a4eadc8779d5..31fdd05adaa163 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -3604,6 +3604,7 @@ int mm_take_all_locks(struct mm_struct *mm)
mutex_lock(&mm_all_locks_mutex);
for (vma = mm->mmap; vma; vma = vma->vm_next) {
+ cond_resched();
if (signal_pending(current))
goto out_unlock;
if (vma->vm_file && vma->vm_file->f_mapping &&
@@ -3612,6 +3613,7 @@ int mm_take_all_locks(struct mm_struct *mm)
}
for (vma = mm->mmap; vma; vma = vma->vm_next) {
+ cond_resched();
if (signal_pending(current))
goto out_unlock;
if (vma->vm_file && vma->vm_file->f_mapping &&
@@ -3620,11 +3622,14 @@ int mm_take_all_locks(struct mm_struct *mm)
}
for (vma = mm->mmap; vma; vma = vma->vm_next) {
+ cond_resched();
if (signal_pending(current))
goto out_unlock;
if (vma->anon_vma)
- list_for_each_entry(avc, &vma->anon_vma_chain, same_vma)
+ list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) {
+ cond_resched();
vm_lock_anon_vma(mm, avc->anon_vma);
+ }
}
return 0;
@@ -3683,9 +3688,12 @@ void mm_drop_all_locks(struct mm_struct *mm)
BUG_ON(!mutex_is_locked(&mm_all_locks_mutex));
for (vma = mm->mmap; vma; vma = vma->vm_next) {
+ cond_resched();
if (vma->anon_vma)
- list_for_each_entry(avc, &vma->anon_vma_chain, same_vma)
+ list_for_each_entry(avc, &vma->anon_vma_chain, same_vma) {
+ cond_resched();
vm_unlock_anon_vma(avc->anon_vma);
+ }
if (vma->vm_file && vma->vm_file->f_mapping)
vm_unlock_mapping(vma->vm_file->f_mapping);
}