svn commit: r291907 - head/sys/vm

Conrad E. Meyer cem at FreeBSD.org
Sun Dec 6 17:46:13 UTC 2015


Author: cem
Date: Sun Dec  6 17:46:12 2015
New Revision: 291907
URL: https://svnweb.freebsd.org/changeset/base/291907

Log:
  vm_fault_hold: handle vm_page_rename failure
  
  On vm_page_rename failure, fix a missing object unlock and a double free of
  a page.
  
  First remove the old page, then rename into other page into first_object,
  then free the old page.  This avoids the problem on rename failure.  This is
  a little ugly but seems to be the most straightforward solution.
  
  Tested with:
    $ sysctl debug.fail_point.uma_zalloc_arg="1%return"
    $ kyua test -k /usr/tests/sys/Kyuafile
  
  Submitted by:	Ryan Libby <rlibby at gmail.com>
  Reviewed by:	kib
  Seen by:	alc
  Sponsored by:	EMC / Isilon Storage Division
  Differential Revision:	https://reviews.freebsd.org/D4326

Modified:
  head/sys/vm/vm_fault.c

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c	Sun Dec  6 17:39:13 2015	(r291906)
+++ head/sys/vm/vm_fault.c	Sun Dec  6 17:46:12 2015	(r291907)
@@ -839,7 +839,7 @@ vnode_locked:
 				 * get rid of the unnecessary page
 				 */
 				vm_page_lock(fs.first_m);
-				vm_page_free(fs.first_m);
+				vm_page_remove(fs.first_m);
 				vm_page_unlock(fs.first_m);
 				/*
 				 * grab the page and put it into the 
@@ -848,9 +848,13 @@ vnode_locked:
 				 */
 				if (vm_page_rename(fs.m, fs.first_object,
 				    fs.first_pindex)) {
+					VM_OBJECT_WUNLOCK(fs.first_object);
 					unlock_and_deallocate(&fs);
 					goto RetryFault;
 				}
+				vm_page_lock(fs.first_m);
+				vm_page_free(fs.first_m);
+				vm_page_unlock(fs.first_m);
 #if VM_NRESERVLEVEL > 0
 				/*
 				 * Rename the reservation.


More information about the svn-src-all mailing list