diff options
author | dyson <dyson@FreeBSD.org> | 1998-01-31 11:56:53 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1998-01-31 11:56:53 +0000 |
commit | 2aacd1ab4f077361f06a6cce5d526955a6743e48 (patch) | |
tree | b18bcbfaf5b7cd766657c55c1d3a3785eb442113 /sys/vm/vm_map.c | |
parent | 89164485a3d81c25a2b3f202e5dc2ee0aedddd3f (diff) | |
download | FreeBSD-src-2aacd1ab4f077361f06a6cce5d526955a6743e48.zip FreeBSD-src-2aacd1ab4f077361f06a6cce5d526955a6743e48.tar.gz |
Change the busy page mgmt, so that when pages are freed, they
MUST be PG_BUSY. It is bogus to free a page that isn't busy,
because it is in a state of being "unavailable" when being
freed. The additional advantage is that the page_remove code
has a better cross-check that the page should be busy and
unavailable for other use. There were some minor problems
with the collapse code, and this plugs those subtile "holes."
Also, the vfs_bio code wasn't checking correctly for PG_BUSY
pages. I am going to develop a more consistant scheme for
grabbing pages, busy or otherwise. For now, we are stuck
with the current morass.
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r-- | sys/vm/vm_map.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 7afc84c..5fd8d30 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.107 1998/01/21 12:18:00 dyson Exp $ + * $Id: vm_map.c,v 1.108 1998/01/22 17:30:37 dyson Exp $ */ /* @@ -2678,7 +2678,8 @@ m_outretry: while (m_out && (m_out->flags & PG_BUSY)) { m_out->flags |= PG_WANTED; tsleep(m_out, PVM, "pwtfrz", 0); - m_out = vm_page_lookup(robject, idx); + splx(s); + goto m_outretry; } splx(s); } @@ -2708,7 +2709,8 @@ m_inretry: while (m_in && (m_in->busy || (m_in->flags & PG_BUSY))) { m_in->flags |= PG_WANTED; tsleep(m_in, PVM, "pwtfrz", 0); - m_in = vm_page_lookup(object, bo_pindex + idx); + splx(s); + goto m_inretry; } splx(s); if (m_in == NULL) { |