NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/60820: LFS in-kernel cleaner can enter deadlock with build.sh



>Number:         60820
>Category:       kern
>Synopsis:       LFS in-kernel cleaner can enter deadlock with build.sh
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Sep 28 21:40:00 +0000 2026
>Originator:     Shinichi Doyashiki
>Release:        11.99.8 around 2026-09-28 04:00 JST
>Organization:
at home
>Environment:
NetBSD kanade2.hq.csel.org 11.99.8 NetBSD 11.99.8 (KANADE2_12) #27: Mon Sep 28 04:34:19 JST 2026  clare%kanade2.hq.csel.org@localhost:/export/netbsd/debuglfs/src/sys/arch/amd64/compile/KANADE2_12 amd64
>Description:
LFS in-kernel cleaner can enter deadlock with build.sh
reproducibility is currently unknown

db{0}> ps
PID     LID S CPU     FLAGS       STRUCT LWP *               NAME WAIT
3229   3229 3   0         0   ffff89ac014a4800               find prelockcv
10122 10122 3   1         0   ffff89ac5c118400                 rm prelockcv
0     21402 3   2       200   ffff89a80059f400        lfs_cleaner vnode
0      8556 3   3       200   ffff89abe64d2000         lfs_writer lfswrite
0       169 3   3       240   ffff89a7f8561c00            ioflush prelockcv
0        12 3   0       200   ffff89af30ab7800             lfsswq lfsswq
0        11 3   2       200   ffff89af30ab7400             lfscwq lfscwq

find process

db{0}> bt /a ffff89ac014a4800
trace: pid 3229 lid 3229 at 0xffff9c894c8ccd20
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
lfs_prelock() at netbsd:lfs_prelock+0x59
lfs_itimes() at netbsd:lfs_itimes+0x3c6
lfs_close() at netbsd:lfs_close+0x81
VOP_CLOSE() at netbsd:VOP_CLOSE+0xa0
vn_close() at netbsd:vn_close+0x34
closef() at netbsd:closef+0xa1
fd_close() at netbsd:fd_close+0xf3
sys_close() at netbsd:sys_close+0x22
syscall() at netbsd:syscall+0x9d
--- syscall (number 6) ---
netbsd:syscall+0x9d:

rm process

db{0}> bt /a ffff89ac5c118400
trace: pid 10122 lid 10122 at 0xffff9c895e5fbc00
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
lfs_prelock() at netbsd:lfs_prelock+0x59
lfs_vfree() at netbsd:lfs_vfree+0xc2
lfs_reclaim() at netbsd:lfs_reclaim+0x275
VOP_RECLAIM() at netbsd:VOP_RECLAIM+0x60
vcache_reclaim() at netbsd:vcache_reclaim+0x19e
vrelel() at netbsd:vrelel+0x24d
lfs_remove() at netbsd:lfs_remove+0xca
VOP_REMOVE() at netbsd:VOP_REMOVE+0xe7
do_sys_unlinkat() at netbsd:do_sys_unlinkat+0x2bc
syscall() at netbsd:syscall+0x9d
--- syscall (number 10) ---
netbsd:syscall+0x9d:

lfs_cleaner thread

db{0}> bt /a ffff89a80059f400
trace: pid 0 lid 21402 at 0xffff9c8949164a80
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
vstate_assert_wait_stable() at netbsd:vstate_assert_wait_stable+0x4b
vcache_vget() at netbsd:vcache_vget+0x34
vcache_get() at netbsd:vcache_get+0x31b
lfs_vget() at netbsd:lfs_vget+0x23
finfo_func_checkempty() at netbsd:finfo_func_checkempty+0xe2
lfs_parse_pseg() at netbsd:lfs_parse_pseg+0x39f
lfs_checkempty() at netbsd:lfs_checkempty+0xee
lfs_markclean() at netbsd:lfs_markclean+0x3e
lfs_auto_segclean() at netbsd:lfs_auto_segclean+0x24b
lfs_segunlock() at netbsd:lfs_segunlock+0x781
lfs_segwrite() at netbsd:lfs_segwrite+0x531
lfs_cleanerd() at netbsd:lfs_cleanerd+0x89e

db{0}> bt /a ffff89abe64d2000
trace: pid 0 lid 8556 at 0xffff9c895448bf50
sleepq_block() at netbsd:sleepq_block+0x233
cv_timedwait() at netbsd:cv_timedwait+0xd4
lfs_writerd() at netbsd:lfs_writerd+0x3ad

ioflush

db{0}> bt /a ffff89a7f8561c00
trace: pid 0 lid 169 at 0xffff9c8946d5ce20
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
lfs_prelock() at netbsd:lfs_prelock+0x59
lfs_seglock() at netbsd:lfs_seglock+0x16
lfs_segwrite() at netbsd:lfs_segwrite+0x71
lfs_sync() at netbsd:lfs_sync+0xc6
VFS_SYNC() at netbsd:VFS_SYNC+0x22
sched_sync() at netbsd:sched_sync+0xd6

db{0}> bt /a ffff89af30ab7800
trace: pid 0 lid 12 at 0xffff9c8936382f60
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
workqueue_worker() at netbsd:workqueue_worker+0x90

db{0}> bt /a ffff89af30ab7400
trace: pid 0 lid 11 at 0xffff9c893637bf60
sleepq_block() at netbsd:sleepq_block+0xea
cv_wait() at netbsd:cv_wait+0xca
workqueue_worker() at netbsd:workqueue_worker+0x90

db{0}> call fstrans_dump(0)
Fstrans locks by lwp:
[ 88245.5130885] 3229.322 (/lfs) shared 1 cow 0 alias 0
[ 88245.5130885] 10122.10 (/lfs) shared 2 cow 0 alias 0
[ 88245.5130885] 0.21402  (/lfs) shared 1 cow 0 alias 0
[ 88245.5130885] 0.169    (/lfs) shared 1 cow 0 alias 0
[ 88245.5130885] Fstrans state by mount:
0

db{0}> show all locks
PID     LID CPU       STRUCT LWP *              OWNER BITS LOCK


>How-To-Repeat:
$ cat /run-build.sh 
#!/bin/sh
TMPDIR=/tmp
export TMPDIR

OBJMACHINE=yes
export OBJMACHINE

testdir=/lfs/netbsd/current

while true; do
  if fsck_lfs -nf /lfs; then
    echo "===> FSCK OK";
  else
    echo "===> FSCK ERROR";
    exit 1
  fi
  if mount /lfs; then
    echo "===> MOUNT OK";
  else
    echo "===> MOUNT ERROR";
    exit 1
  fi
  rm ${testdir}/build.log
  for machine in amd64; do
    (
    cd ${testdir}/src || exit
    tooldir=${testdir}/tools.${machine}
    destdir=${testdir}/destdir.${machine}
    objdir=${testdir}/objdir.${machine}
    releasedir=${testdir}/release.test
    rm -rf ${tooldir}
    rm -rf ${destdir}
    rm -rf ${objdir}
    rm -rf ${releasedir}
    mkdir -p ${objdir}
    ./build.sh -m ${machine} \
        -j 5 \
        -U \
        -O ${objdir} \
        -D ${destdir} \
        -R ${releasedir} \
        -T ${tooldir} \
        release
    ) 2>&1 | tee ${testdir}/build.log
  done
  sync
  if umount /lfs; then
    echo "===> UMOUNT OK";
  else
    echo "===> UMOUNT ERROR";
    exit 1
  fi
done

>Fix:
unknown




Home | Main Index | Thread Index | Old Index