From 782ebde52ef5e51fe8fb5161e65c18c351537a20 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Mon, 27 Jul 2020 14:25:10 +0000 Subject: [PATCH] vm_page_free_invalid(): Relax the xbusy assertion. vm_page_assert_xbusied() asserts that the busying thread is the current thread. For some uses of vm_page_free_invalid() (e.g., error handling in vnode_pager_generic_getpages_done()), this condition might not hold. Reported by: Jenkins via trasz Reviewed by: chs, kib Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D25828 --- sys/vm/vm_page.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index a7d6f3dd9d64..8c2df3e78e17 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -1371,10 +1371,15 @@ vm_page_free_invalid(vm_page_t m) KASSERT(vm_page_none_valid(m), ("page %p is valid", m)); KASSERT(!pmap_page_is_mapped(m), ("page %p is mapped", m)); - vm_page_assert_xbusied(m); KASSERT(m->object != NULL, ("page %p has no object", m)); VM_OBJECT_ASSERT_WLOCKED(m->object); + /* + * We may be attempting to free the page as part of the handling for an + * I/O error, in which case the page was xbusied by a different thread. + */ + vm_page_xbusy_claim(m); + /* * If someone has wired this page while the object lock * was not held, then the thread that unwires is responsible