Module Name:    src
Committed By:   yamt
Date:           Thu Aug 18 14:17:08 UTC 2011

Modified Files:
        src/sys/uvm: uvm_pager.c

Log Message:
uvm_aio_aiodone_pages: check disposed anon correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.101 -r1.102 src/sys/uvm/uvm_pager.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_pager.c
diff -u src/sys/uvm/uvm_pager.c:1.101 src/sys/uvm/uvm_pager.c:1.102
--- src/sys/uvm/uvm_pager.c:1.101	Sun Jun 12 03:36:03 2011
+++ src/sys/uvm/uvm_pager.c	Thu Aug 18 14:17:08 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pager.c,v 1.101 2011/06/12 03:36:03 rmind Exp $	*/
+/*	$NetBSD: uvm_pager.c,v 1.102 2011/08/18 14:17:08 yamt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.101 2011/06/12 03:36:03 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.102 2011/08/18 14:17:08 yamt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -300,6 +300,8 @@
 #endif /* defined(VMSWAP) */
 	}
 	for (i = 0; i < npages; i++) {
+		bool anon_disposed = false; /* XXX gcc */
+
 		pg = pgs[i];
 		KASSERT(swap || pg->uobject == uobj);
 		UVMHIST_LOG(ubchist, "pg %p", pg, 0,0,0);
@@ -318,6 +320,9 @@
 			}
 			mutex_enter(slock);
 			mutex_enter(&uvm_pageqlock);
+			anon_disposed = (pg->flags & PG_RELEASED) != 0;
+			KASSERT(!anon_disposed || pg->uobject != NULL ||
+			    pg->uanon->an_ref == 0);
 		}
 #endif /* defined(VMSWAP) */
 
@@ -399,8 +404,7 @@
 		 */
 
 		if (swap) {
-			if (pg->uobject == NULL && pg->uanon->an_ref == 0 &&
-			    (pg->flags & PG_RELEASED) != 0) {
+			if (pg->uobject == NULL && anon_disposed) {
 				mutex_exit(&uvm_pageqlock);
 				uvm_anon_release(pg->uanon);
 			} else {

Reply via email to