The following reply was made to PR kern/39548; it has been noted by GNATS.
From: Antti Kantee <pooka@xxxxxxxxx>
Subject: Re: kern/39548: kernel debugging assertion "(vp->v_flag & VONWORKLST)"
Date: Wed, 17 Sep 2008 18:57:24 +0300
On Mon Sep 15 2008 at 01:30:00 +0000, Simon Burge wrote:
> System: NetBSD thoreau 4.0_STABLE NetBSD 4.0_STABLE (THOREAU) #6: Tue Jul 15
> 00:48:08 EST 2008 simonb@thoreau:/usr/obj/sys/arch/i386/compile/THOREAU i386
> panic: kernel debugging assertion "(vp->v_flag & VONWORKLST)" failed: file
> "./sys/miscfs/genfs/genfs_vnops.c", line 1283
> panic just after starting to move some large files from one
> filesystem to another. I was in X at the time, but do have a
> crash dump. The backtrace is:
> #17 0xc045978c in panic (
> fmt=0xc099211c "kernel %sassertion \"%s\" failed: file \"%s\", line %d")
> at ./sys/kern/subr_prf.c:235
> #18 0xc075a8a6 in __assert (t=0xc08f1884 "debugging ",
> f=0xc095eb88 "./sys/miscfs/genfs/genfs_vnops.c", l=1283,
> e=0xc09053c6 "(vp->v_flag & VONWORKLST)")
> at ../.././sys/lib/libkern/__assert.c:45
> #19 0xc0499f6f in genfs_do_putpages (vp=0xd4c3d938, startoff=259100672,
> endoff=259104768, flags=9, busypg=0x0)
> at ./sys/miscfs/genfs/genfs_vnops.c:1283
> #20 0xc0499fe9 in genfs_putpages (v=0xcfe81b60)
> at ./sys/miscfs/genfs/genfs_vnops.c:1055
> #21 0xc0496ccc in VOP_PUTPAGES (vp=0xd4c3d938, offlo=0, offhi=0, flags=9)
> at ./sys/kern/vnode_if.c:1592
> #22 0xc03f3cc5 in uvn_put (uobj=0xd4c3d938, offlo=259100672,
> flags=9) at ./sys/uvm/uvm_vnode.c:273
> #23 0xc03ef9b3 in uvm_pageout (arg=0xcf418c1c) at ./sys/uvm/uvm_pdaemon.c:732
> #24 0xc01002e1 in proc_trampoline ()
> The eariler frames are for a secondary "panic: wdc_exec_command:
> polled command not done" panic that happened after the dump (and
> then it proceeded to dump again!).
> This is with a UP kernel on a machine with 2GB of RAM, a mix of
> raidframe and standalone disks (swap is to a RF mirror). The
> kernel has DIAGNOSTIC, LOCKDEBUG, DEBUG.
Looks like a bad case of race condition between moving the vnode on
and off the worklist and a conflict between the syncer and pagedaemon.
I think you need to get memory exhausted and the pagedaemon interested
in the situation and a case of very bad luck.
Since this code has changed much for -current, I'd say a) sacrifice
more chicken (poulet de bresse preferred) b) run without DEBUG or c)
remove the KDASSERT and compile a new kernel.
But, you could still print the vnode and append to the PR. Also,
applying meditation and trying to figure out what exactly protects
VONWORKLST can't hurt.