mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
swap_pager: Fix a race in swap_pager_swapoff_object()
When we disable swapping to a device, we scan the full VM object list looking for objects with swap trie nodes that reference the device in question. The pages corresponding to those nodes are paged in. While paging in, we drop the VM object lock. Moreover, we do not hold a reference for the object; swap_pager_swapoff_object() merely bumps the paging-in-progress counter. vm_object_terminate() waits for this counter to drain before proceeding and freeing pages. However, swap_pager_swapoff_object() decrements the counter before re-acquiring the VM object lock, which means that vm_object_terminate() can race to acquire the lock and free the pages. Then, swap_pager_swapoff_object() ends up unbusying a freed page. Fix the problem by acquiring the lock before waking up sleepers. PR: 273610 Reported by: Graham Perrin <grahamperrin@gmail.com> Reviewed by: kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D42029
This commit is contained in:
parent
4cf8075264
commit
e61568aeee
1 changed files with 1 additions and 1 deletions
|
|
@ -1890,8 +1890,8 @@ swap_pager_swapoff_object(struct swdevt *sp, vm_object_t object)
|
|||
if (rv != VM_PAGER_OK)
|
||||
panic("%s: read from swap failed: %d",
|
||||
__func__, rv);
|
||||
vm_object_pip_wakeupn(object, 1);
|
||||
VM_OBJECT_WLOCK(object);
|
||||
vm_object_pip_wakeupn(object, 1);
|
||||
vm_page_xunbusy(m);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue