diff options
| author | mycroft <mycroft@NetBSD.org> | 1994-04-29 08:21:49 +0000 |
|---|---|---|
| committer | mycroft <mycroft@NetBSD.org> | 1994-04-29 08:21:49 +0000 |
| commit | 06a4a02877df3db8a67d728efd6fc83c8e392764 (patch) | |
| tree | 53aa575d01fd61dfa042cbc20b5691bf961e388c /sys | |
| parent | f50f03144840914a3a7baf2ebcaa8a2d0d7f607c (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.c | 15 | ||||
| -rw-r--r-- | sys/vm/vm_page.c | 9 | ||||
| -rw-r--r-- | sys/vm/vm_page.h | 3 |
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 */ |
