Date: Fri, 18 Oct 2002 11:46:39 -0400 (EDT) From: John Baldwin <jhb@FreeBSD.org> To: Kris Kennaway <kris@obsecurity.org> Cc: dillon@FreeBSD.org, current@FreeBSD.org Subject: RE: Page fault in swapout_procs Message-ID: <XFMail.20021018114639.jhb@FreeBSD.org> In-Reply-To: <20021017215252.GA50026@xor.obsecurity.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 17-Oct-2002 Kris Kennaway wrote: > I just got the following panic on one of the gohan machines, running a > somewhat recent -current: > > Fatal trap 12: page fault while in kernel mode > fault virtual address = 0xa0 > fault code = supervisor write, page not present > instruction pointer = 0x8:0xc035d0ab > stack pointer = 0x10:0xcd25ccc0 > frame pointer = 0x10:0xcd25cce0 > code segment = base 0x0, limit 0xfffff, type 0x1b > = DPL 0, pres 1, def32 1, gran 1 > processor eflags = interrupt enabled, resume, IOPL = 0 > current process = 3 (vmdaemon) > kernel: type 12 trap, code=0 > Stopped at swapout_procs+0x6b: incl 0xa0(%esi) > db> Context switches not allowed in the debugger. > db> trace > swapout_procs(1,0,68,c0411018,0) at swapout_procs+0x6b > vm_daemon(0,cd25cd48,c03f1300,34b,0) at vm_daemon+0x6e > fork_exit(c036b560,0,cd25cd48) at fork_exit+0xaf > fork_trampoline() at fork_trampoline+0x17 Null pointer dereference. (gdb) l *swapout_procs+0x6b 0xc036ad1b is in swapout_procs (../../../vm/vm_glue.c:683). 678 * An aio daemon switches its 679 * address space while running. 680 * Perform a quick check whether 681 * a process has P_SYSTEM. 682 */ 683 PROC_LOCK(p); 684 if ((p->p_flag & P_SYSTEM) != 0) { 685 PROC_UNLOCK(p); 686 continue; 687 } Hmm, if the process is very brand new, it might not have it's lock setup yet. Try the patch at http://www.freebsd.org/~jhb/patches/swapout.patch. Index: vm_glue.c =================================================================== RCS file: /usr/cvs/src/sys/vm/vm_glue.c,v retrieving revision 1.158 diff -u -r1.158 vm_glue.c --- vm_glue.c 14 Oct 2002 20:31:54 -0000 1.158 +++ vm_glue.c 18 Oct 2002 15:35:08 -0000 @@ -653,28 +653,25 @@ outp = outp2 = NULL; outpri = outpri2 = INT_MIN; retry: sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { struct vmspace *vm; int minslptime = 100000; /* - * Do not swapout a process that - * is waiting for VM data - * structures there is a possible - * deadlock. Test this first as - * this may block. - * - * Lock the map until swapout - * finishes, or a thread of this - * process may attempt to alter - * the map. - * * Watch out for a process in * creation. It may have no - * address space yet. - * + * address space or lock yet. + */ + mtx_lock_spin(&sched_lock); + if (p->p_state == PRS_NEW) { + mtx_unlock_spin(&sched_lock); + continue; + } + mtx_unlock_spin(&sched_lock); + + /* * An aio daemon switches its * address space while running. * Perform a quick check whether @@ -685,17 +682,23 @@ PROC_UNLOCK(p); continue; } - mtx_lock_spin(&sched_lock); - if (p->p_state == PRS_NEW) { - mtx_unlock_spin(&sched_lock); - PROC_UNLOCK(p); - continue; - } + + /* + * Do not swapout a process that + * is waiting for VM data + * structures as there is a possible + * deadlock. Test this first as + * this may block. + * + * Lock the map until swapout + * finishes, or a thread of this + * process may attempt to alter + * the map. + */ vm = p->p_vmspace; KASSERT(vm != NULL, ("swapout_procs: a process has no address space")); ++vm->vm_refcnt; - mtx_unlock_spin(&sched_lock); PROC_UNLOCK(p); if (!vm_map_trylock(&vm->vm_map)) goto nextproc1; -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve!" - http://www.FreeBSD.org/ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.20021018114639.jhb>