Date: Tue, 22 Feb 2000 01:10:03 -0800 (PST) From: Bruce Evans <bde@zeta.org.au> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/16568: How to crash FreeBSD 4.4 Message-ID: <200002220910.BAA84075@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/16568; it has been noted by GNATS. From: Bruce Evans <bde@zeta.org.au> To: Bjoern Groenvall <bg@bg.sics.se> Cc: FreeBSD-gnats-submit@FreeBSD.ORG, bg@sics.se, alc@FreeBSD.ORG Subject: Re: kern/16568: How to crash FreeBSD 4.4 Date: Tue, 22 Feb 2000 20:01:30 +1100 (EST) On Mon, 7 Feb 2000, Bjoern Groenvall wrote: > >Number: 16568 > >Category: kern > >Synopsis: How to crash FreeBSD 4.4 ^^^ 3.4 (also affects 3.1) This seems to have been fixed as a side effect of a better optimisation in -current in rev.1.228 of pmap.c. Try the following patch (derived from there). diff -c2 pmap.c~ pmap.c *** pmap.c~ Fri Sep 3 22:20:49 1999 --- pmap.c Tue Feb 22 19:22:52 2000 *************** *** 1863,1872 **** pv_table_t *ppv; register unsigned *pte, tpte; - int nmodify; - int update_needed; int s; - nmodify = 0; - update_needed = 0; #if defined(PMAP_DIAGNOSTIC) /* --- 1863,1868 ---- *************** *** 1907,1919 **** ppv->pv_vm_page->dirty = VM_PAGE_BITS_ALL; } ! #ifdef SMP ! update_needed = 1; ! #else ! if (!update_needed && ! ((!curproc || (&curproc->p_vmspace->vm_pmap == pv->pv_pmap)) || ! (pv->pv_pmap == kernel_pmap))) { ! update_needed = 1; ! } ! #endif TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist); TAILQ_REMOVE(&ppv->pv_list, pv, pv_list); --- 1903,1908 ---- ppv->pv_vm_page->dirty = VM_PAGE_BITS_ALL; } ! invltlb_1pg(pv->pv_va); ! TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist); TAILQ_REMOVE(&ppv->pv_list, pv, pv_list); *************** *** 1925,1933 **** ppv->pv_vm_page->flags &= ~(PG_MAPPED | PG_WRITEABLE); - if (update_needed) - invltlb(); - splx(s); - return; } --- 1914,1918 ---- Hints on reproducing the bug: - Using the kernel config (PAO) in the PR is probably unnecessary. The bug probably occurs with any config provided the maximum files limit is large enough for the memory allocation for fd_ofiles to be several pages. I used a limit of 4136. - Limit the memory size. The bug is much easier to reproduce with a memory size of 64M than with 320M. Notes: - An unconditional invltlb() at the end of pmap_remove_all() doesn't fix the bug. I don't understand this, or why the old optimisation was wrong. A conditional invltlb() at the end would be optimal for i386's if it worked. - The alpha pmap.c probably doesn't have the bug, even in RELENG_3, since the old "optimisation" was changed to the new one long ago in rev.1.9, apparently independently. Bruce To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200002220910.BAA84075>