Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Apr 2012 23:58:49 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r234007 - user/attilio/vmcontention/sys/vm
Message-ID:  <201204072358.q37Nwn43084081@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Sat Apr  7 23:58:49 2012
New Revision: 234007
URL: http://svn.freebsd.org/changeset/base/234007

Log:
  If we already had a page with pindex == 0 in the device pager object
  (if not already fictious) the code can panic when trying to first insert
  a fictious page because of the overridden pindex.
  
  Fix this by applying the same spinning pattern of vm_page_rename().
  
  Reported by:	pho

Modified:
  user/attilio/vmcontention/sys/vm/device_pager.c

Modified: user/attilio/vmcontention/sys/vm/device_pager.c
==============================================================================
--- user/attilio/vmcontention/sys/vm/device_pager.c	Sat Apr  7 23:51:16 2012	(r234006)
+++ user/attilio/vmcontention/sys/vm/device_pager.c	Sat Apr  7 23:58:49 2012	(r234007)
@@ -52,6 +52,8 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_pager.h>
 #include <vm/uma.h>
 
+#include <machine/cpu.h>
+
 static void dev_pager_init(void);
 static vm_object_t dev_pager_alloc(void *, vm_ooffset_t, vm_prot_t,
     vm_ooffset_t, struct ucred *);
@@ -259,7 +261,7 @@ old_dev_pager_fault(vm_object_t object, 
 	struct file *fpop;
 	struct thread *td;
 	vm_memattr_t memattr;
-	int ref, ret;
+	int i, ref, ret;
 
 	pidx = OFF_TO_IDX(offset);
 	memattr = object->memattr;
@@ -307,14 +309,14 @@ old_dev_pager_fault(vm_object_t object, 
 		 */
 		page = vm_page_getfake(paddr, memattr);
 		VM_OBJECT_LOCK(object);
-		if (vm_page_insert(page, object, offset) != 0) {
-			vm_page_putfake(page);
-			return (VM_PAGER_FAIL);
-		}
 		vm_page_lock(*mres);
 		vm_page_free(*mres);
 		vm_page_unlock(*mres);
 		*mres = page;
+		while (vm_page_insert(page, object, offset) != 0) {
+			for (i = 0; i < 10000000; i++)
+				cpu_spinwait();
+		}
 	}
 	page->valid = VM_PAGE_BITS_ALL;
 	return (VM_PAGER_OK);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204072358.q37Nwn43084081>