From 014146c040ed6640e606b46e58c066fc3a1c442c Mon Sep 17 00:00:00 2001 From: dyson Date: Wed, 25 Feb 1998 03:56:15 +0000 Subject: Fix page prezeroing for SMP, and fix some potential paging-in-progress hangs. The paging-in-progress diagnosis was a result of Tor Egge's excellent detective work. Submitted by: Partially from Tor Egge. --- sys/vm/swap_pager.c | 5 ++--- sys/vm/swap_pager.h | 3 ++- sys/vm/vm_map.c | 9 ++------- sys/vm/vm_object.c | 37 +++++++++++++++++-------------------- sys/vm/vm_object.h | 24 +++++++++++++++++++++++- sys/vm/vnode_pager.c | 11 ++--------- 6 files changed, 48 insertions(+), 41 deletions(-) (limited to 'sys/vm') diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index a4befb0..05d8a327 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -39,7 +39,7 @@ * from: Utah $Hdr: swap_pager.c 1.4 91/04/30$ * * @(#)swap_pager.c 8.9 (Berkeley) 3/21/94 - * $Id: swap_pager.c,v 1.88 1998/02/09 06:11:20 eivind Exp $ + * $Id: swap_pager.c,v 1.89 1998/02/23 08:22:24 dyson Exp $ */ /* @@ -144,7 +144,6 @@ static boolean_t int *before, int *after)); static int swap_pager_getpages __P((vm_object_t, vm_page_t *, int, int)); static void swap_pager_init __P((void)); -static void swap_pager_sync __P((void)); static void spc_free __P((swp_clean_t)); struct pagerops swappagerops = { @@ -1550,7 +1549,7 @@ swap_pager_putpages(object, m, count, sync, rtvals) return (rv); } -static void +void swap_pager_sync() { swp_clean_t spc; diff --git a/sys/vm/swap_pager.h b/sys/vm/swap_pager.h index 0fa5845..8755547 100644 --- a/sys/vm/swap_pager.h +++ b/sys/vm/swap_pager.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * from: @(#)swap_pager.h 7.1 (Berkeley) 12/5/90 - * $Id: swap_pager.h,v 1.18 1997/02/22 09:48:08 peter Exp $ + * $Id: swap_pager.h,v 1.19 1998/02/23 08:22:27 dyson Exp $ */ /* @@ -78,6 +78,7 @@ void swap_pager_copy __P((vm_object_t, vm_pindex_t, vm_object_t, void swap_pager_freespace __P((vm_object_t, vm_pindex_t, vm_size_t)); void swap_pager_dmzspace __P((vm_object_t, vm_pindex_t, vm_size_t)); void swap_pager_swap_init __P((void)); +void swap_pager_sync __P((void)); #endif #endif /* _SWAP_PAGER_ */ diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index cb4b22f..930d687 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_map.c,v 1.115 1998/02/20 13:11:54 bde Exp $ + * $Id: vm_map.c,v 1.116 1998/02/23 08:22:33 dyson Exp $ */ /* @@ -2632,12 +2632,7 @@ vm_freeze_copyopts(object, froma, toa) vm_object_reference(robject); - s = splvm(); - while (robject->paging_in_progress) { - robject->flags |= OBJ_PIPWNT; - tsleep(robject, PVM, "objfrz", 0); - } - splx(s); + vm_object_pip_wait(robject, "objfrz"); if (robject->ref_count == 1) { vm_object_deallocate(robject); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 22b3f7a..ad339d4 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_object.c,v 1.112 1998/02/06 12:14:26 eivind Exp $ + * $Id: vm_object.c,v 1.113 1998/02/09 06:11:30 eivind Exp $ */ /* @@ -334,21 +334,23 @@ vm_object_deallocate(object) robject->ref_count++; retry: - s = splvm(); - if (robject->paging_in_progress) { - robject->flags |= OBJ_PIPWNT; - tsleep(robject, PVM, "objde1", 0); - splx(s); - goto retry; - } - - if (object->paging_in_progress) { - object->flags |= OBJ_PIPWNT; - tsleep(object, PVM, "objde2", 0); - splx(s); + if (robject->paging_in_progress || object->paging_in_progress) { + vm_object_pip_sleep(robject, "objde1"); + if (robject->paging_in_progress) { + if (robject->type == OBJT_SWAP) { + swap_pager_sync(); + goto retry; + } + } + + vm_object_pip_sleep(object, "objde2"); + if (object->paging_in_progress) { + if (object->type == OBJT_SWAP) { + swap_pager_sync(); + } + } goto retry; } - splx(s); if( robject->ref_count == 1) { robject->ref_count--; @@ -408,12 +410,7 @@ vm_object_terminate(object) /* * wait for the pageout daemon to be done with the object */ - s = splvm(); - while (object->paging_in_progress) { - object->flags |= OBJ_PIPWNT; - tsleep(object, PVM, "objtrm", 0); - } - splx(s); + vm_object_pip_wait(object, "objtrm"); #if defined(DIAGNOSTIC) if (object->paging_in_progress != 0) diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index fe41881..76cb4d2 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_object.h,v 1.44 1998/01/31 11:56:43 dyson Exp $ + * $Id: vm_object.h,v 1.45 1998/02/05 03:32:45 dyson Exp $ */ /* @@ -164,6 +164,28 @@ vm_object_pip_wakeup(vm_object_t object) } } +static __inline void +vm_object_pip_sleep(vm_object_t object, char *waitid) +{ + int s; + + if (object->paging_in_progress) { + s = splvm(); + if (object->paging_in_progress) { + object->flags |= OBJ_PIPWNT; + tsleep(object, PVM, waitid, 0); + } + splx(s); + } +} + +static __inline void +vm_object_pip_wait(vm_object_t object, char *waitid) +{ + while (object->paging_in_progress) + vm_object_pip_sleep(object, waitid); +} + vm_object_t vm_object_allocate __P((objtype_t, vm_size_t)); void _vm_object_allocate __P((objtype_t, vm_size_t, vm_object_t)); boolean_t vm_object_coalesce __P((vm_object_t, vm_pindex_t, vm_size_t, vm_size_t)); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index e7a9efb..98b57b0 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 - * $Id: vnode_pager.c,v 1.84 1998/02/06 12:14:30 eivind Exp $ + * $Id: vnode_pager.c,v 1.85 1998/02/23 08:22:48 dyson Exp $ */ /* @@ -169,14 +169,7 @@ vnode_pager_dealloc(object) if (vp == NULL) panic("vnode_pager_dealloc: pager already dealloced"); - if (object->paging_in_progress) { - int s = splvm(); - while (object->paging_in_progress) { - object->flags |= OBJ_PIPWNT; - tsleep(object, PVM, "vnpdea", 0); - } - splx(s); - } + vm_object_pip_wait(object, "vnpdea"); object->handle = NULL; object->type = OBJT_DEAD; -- cgit v1.1