summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authormycroft <mycroft@NetBSD.org>1994-04-29 08:21:49 +0000
committermycroft <mycroft@NetBSD.org>1994-04-29 08:21:49 +0000
commit06a4a02877df3db8a67d728efd6fc83c8e392764 (patch)
tree53aa575d01fd61dfa042cbc20b5691bf961e388c /sys
parentf50f03144840914a3a7baf2ebcaa8a2d0d7f607c (diff)
Add some DIAGNOSTIC code to detect trying to free a page that is being faulted
in.
Diffstat (limited to 'sys')
-rw-r--r--sys/vm/swap_pager.c15
-rw-r--r--sys/vm/vm_page.c9
-rw-r--r--sys/vm/vm_page.h3
3 files changed, 22 insertions, 5 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 2904fa2f125..b9d79d36a49 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -38,7 +38,7 @@
* from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
*
* from: @(#)swap_pager.c 8.1 (Berkeley) 6/11/93
- * $Id: swap_pager.c,v 1.19 1994/04/29 03:56:26 cgd Exp $
+ * $Id: swap_pager.c,v 1.20 1994/04/29 08:21:49 mycroft Exp $
*/
/*
@@ -393,11 +393,22 @@ swap_pager_getpage(pager, m, sync)
vm_page_t m;
boolean_t sync;
{
+ register int rv;
+
#ifdef DEBUG
if (swpagerdebug & SDB_FOLLOW)
printf("swpg_getpage(%x, %x, %d)\n", pager, m, sync);
#endif
- return(swap_pager_io((sw_pager_t)pager->pg_data, m, B_READ));
+#ifdef DIAGNOSTIC
+ if (m->flags & PG_FAULTING)
+ panic("swap_pager_getpage: page is already faulting");
+ m->flags |= PG_FAULTING;
+#endif
+ rv = swap_pager_io((sw_pager_t)pager->pg_data, m, B_READ);
+#ifdef DIAGNOSTIC
+ m->flags &= ~PG_FAULTING;
+#endif
+ return(rv);
}
static int
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 0e1e371cba5..c1a71e2d3a5 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)vm_page.c 7.4 (Berkeley) 5/7/91
- * $Id: vm_page.c,v 1.13 1994/04/15 07:04:57 cgd Exp $
+ * $Id: vm_page.c,v 1.14 1994/04/29 08:21:50 mycroft Exp $
*
*
* Copyright (c) 1987, 1990 Carnegie-Mellon University.
@@ -619,6 +619,11 @@ vm_page_remove(mem)
VM_PAGE_CHECK(mem);
+#ifdef DIAGNOSTIC
+ if (mem->flags & PG_FAULTING)
+ panic("vm_page_remove: page is faulting");
+#endif
+
if (!(mem->flags & PG_TABLED))
return;
@@ -776,12 +781,12 @@ vm_page_free(mem)
register vm_page_t mem;
{
vm_page_remove(mem);
+
if (mem->flags & PG_ACTIVE) {
TAILQ_REMOVE(&vm_page_queue_active, mem, pageq);
mem->flags &= ~PG_ACTIVE;
cnt.v_active_count--;
}
-
if (mem->flags & PG_INACTIVE) {
TAILQ_REMOVE(&vm_page_queue_inactive, mem, pageq);
mem->flags &= ~PG_INACTIVE;
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 8d8da185d1d..d4ab06b0dea 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)vm_page.h 7.3 (Berkeley) 4/21/91
- * $Id: vm_page.h,v 1.10 1994/04/15 07:04:58 cgd Exp $
+ * $Id: vm_page.h,v 1.11 1994/04/29 08:21:52 mycroft Exp $
*
*
* Copyright (c) 1987, 1990 Carnegie-Mellon University.
@@ -129,6 +129,7 @@ struct vm_page {
#define PG_FAKE 0x0200 /* page is placeholder for pagein (O) */
#define PG_FILLED 0x0400 /* client flag to set when filled */
#define PG_DIRTY 0x0800 /* client flag to set when dirty */
+#define PG_FAULTING 0x2000 /* page is being faulted in */
#define PG_PAGEROWNED 0x4000 /* DEBUG: async paging op in progress */
#define PG_PTPAGE 0x8000 /* DEBUG: is a user page table page */