From owner-svn-src-user@FreeBSD.ORG Sat Apr 7 23:58:49 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CBAFB106566C; Sat, 7 Apr 2012 23:58:49 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B603B8FC0C; Sat, 7 Apr 2012 23:58:49 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q37NwnOx084083; Sat, 7 Apr 2012 23:58:49 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q37Nwn43084081; Sat, 7 Apr 2012 23:58:49 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201204072358.q37Nwn43084081@svn.freebsd.org> From: Attilio Rao Date: Sat, 7 Apr 2012 23:58:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234007 - user/attilio/vmcontention/sys/vm X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 07 Apr 2012 23:58:49 -0000 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 #include +#include + 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);