Don't use a static entry, so as to prevent races during concurrent use of this function.
Unified · Split
| @@ -476,10 +476,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, · 475 unmodified lines | |||
| 476 | return -ESRCH; | 476 | return -ESRCH; |
| 477 | mm = get_task_mm(task); | 477 | mm = get_task_mm(task); |
| 478 | if (mm) { | 478 | if (mm) { |
| 479 | static struct mm_walk clear_refs_walk; | 479 | struct mm_walk clear_refs_walk = { |
| 480 | memset(&clear_refs_walk, 0, sizeof(clear_refs_walk)); | 480 | .pmd_entry = clear_refs_pte_range, |
| 481 | clear_refs_walk.pmd_entry = clear_refs_pte_range; | 481 | .mm = mm, |
| 482 | clear_refs_walk.mm = mm; | 482 | }; |
| 483 | down_read(&mm->mmap_sem); | 483 | down_read(&mm->mmap_sem); |
| 484 | for (vma = mm->mmap; vma; vma = vma->vm_next) { | 484 | for (vma = mm->mmap; vma; vma = vma->vm_next) { |
| 485 | clear_refs_walk.private = vma; | 485 | clear_refs_walk.private = vma; |