svn commit: r248618 - user/attilio/vmobj-readlock/sys/vm
Attilio Rao
attilio at FreeBSD.org
Fri Mar 22 16:44:16 UTC 2013
Author: attilio
Date: Fri Mar 22 16:44:15 2013
New Revision: 248618
URL: http://svnweb.freebsd.org/changeset/base/248618
Log:
Fix a problem when the page identity was changing after sleeping
in vm_page_sleep* primitives.
The lock can change as the page's object lock is not held, relocking
then the wrong object in the end.
Sponsored by: EMC / Isilon storage division
Reported and tested by: pho
Modified:
user/attilio/vmobj-readlock/sys/vm/vm_page.c
Modified: user/attilio/vmobj-readlock/sys/vm/vm_page.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/vm_page.c Fri Mar 22 14:10:15 2013 (r248617)
+++ user/attilio/vmobj-readlock/sys/vm/vm_page.c Fri Mar 22 16:44:15 2013 (r248618)
@@ -757,12 +757,21 @@ vm_page_readahead_finish(vm_page_t m)
int
vm_page_sleep_if_busy(vm_page_t m, int also_m_busy, const char *msg)
{
+ vm_object_t obj;
VM_OBJECT_ASSERT_WLOCKED(m->object);
if ((m->oflags & VPO_BUSY) || (also_m_busy && m->busy)) {
- VM_OBJECT_WUNLOCK(m->object);
+ /*
+ * The page-specific object must be cached because page
+ * identity can change during the sleep, causing the
+ * re-lock of a different object.
+ * It is assumed that a reference to the object is already
+ * held by the callers.
+ */
+ obj = m->object;
+ VM_OBJECT_WUNLOCK(obj);
vm_page_sleep(m, msg);
- VM_OBJECT_WLOCK(m->object);
+ VM_OBJECT_WLOCK(obj);
return (TRUE);
}
return (FALSE);
More information about the svn-src-user
mailing list