bostic@OKEEFFE.BERKELEY.EDU (Keith Bostic) (11/13/87)
Subject: fodkluster() and pagein() fixes Index: sys/sys/vm_page.c 4.3BSD Description: Fodkluster() can walk backwards past the 0 page, and pagein() doesn't correctly flush the buffer cache when it wants to page data in. Repeat-By: These aren't real repeatable. The first can happen, although very rarely; the second never fails on 4.3BSD due to the way the buffer cache works. Fix: Apply the following patch to vm_page.c. *** vm_page.c.orig Thu Nov 12 13:16:22 1987 --- vm_page.c Thu Nov 12 13:16:29 1987 *************** *** 3,9 **** * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)vm_page.c 7.1 (Berkeley) 6/5/86 */ #include "../machine/reg.h" --- 3,9 ---- * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * ! * @(#)vm_page.c 7.2 (Berkeley) 7/27/86 */ #include "../machine/reg.h" *************** *** 365,371 **** * cache, so we explicitly flush them out to disk * so that the proper data will be paged in. */ ! blkflush(dev, bn, (long)CLSIZE*NBPG); #ifdef TRACE if (type != CTEXT) trace(TR_XFODMISS, dev, bn); --- 365,371 ---- * cache, so we explicitly flush them out to disk * so that the proper data will be paged in. */ ! blkflush(dev, bn, (long)klsize*CLSIZE*NBPG); #ifdef TRACE if (type != CTEXT) trace(TR_XFODMISS, dev, bn); *************** *** 1263,1271 **** bn = *pbn; v = v0; for (klsize = 1; klsize < KLMAX; klsize++) { ! v -= CLSIZE; ! if (v < vmin) break; fpte -= CLSIZE; if (fpte->pg_fod == 0) break; --- 1263,1271 ---- bn = *pbn; v = v0; for (klsize = 1; klsize < KLMAX; klsize++) { ! if (v <= vmin) break; + v -= CLSIZE; fpte -= CLSIZE; if (fpte->pg_fod == 0) break;