svn commit: r351472 - head/sys/fs/nullfs
Cy Schubert
Cy.Schubert at cschubert.com
Tue Aug 27 03:41:27 UTC 2019
Making progress:
Unread portion of the kernel message buffer:
panic: null_unlock: LK_INTERLOCK passed
cpuid = 2
time = 1566868081
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
0xfffffe0054a954e0
vpanic() at vpanic+0x19d/frame 0xfffffe0054a95530
panic() at panic+0x43/frame 0xfffffe0054a95590
null_unlock() at null_unlock+0x8a/frame 0xfffffe0054a955d0
VOP_UNLOCK_APV() at VOP_UNLOCK_APV+0x56/frame 0xfffffe0054a955f0
unionfs_unlock() at unionfs_unlock+0x124/frame 0xfffffe0054a95650
VOP_UNLOCK_APV() at VOP_UNLOCK_APV+0x56/frame 0xfffffe0054a95670
vfs_domount() at vfs_domount+0xc3f/frame 0xfffffe0054a958a0
vfs_donmount() at vfs_donmount+0x934/frame 0xfffffe0054a95940
sys_nmount() at sys_nmount+0x69/frame 0xfffffe0054a95980
amd64_syscall() at amd64_syscall+0x3ae/frame 0xfffffe0054a95ab0
fast_syscall_common() at fast_syscall_common+0x101/frame 0xfffffe0054a95ab0
--- syscall (378, FreeBSD ELF64, sys_nmount), rip = 0x2bed6a4a, rsp =
0x7fffffffe2e8, rbp = 0x7fffffffec70 ---
Uptime: 1m35s
--
Cheers,
Cy Schubert <Cy.Schubert at cschubert.com>
FreeBSD UNIX: <cy at FreeBSD.org> Web: http://www.FreeBSD.org
The need of the many outweighs the greed of the few.
In message <CAGudoHHucKGxYKz9L46w-KAhbAKQTXZD6syBPer2aHwh37vx0Q at mail.gmail.c
om>
, Mateusz Guzik writes:
> Sorry for the half-assed patch. I have a patch to remove the flags
> argument and the change above was port of it.
>
> Try this please:
> https://people.freebsd.org/~mjg/patches/vop_unlock-interlock2.diff
>
> On 8/27/19, Cy Schubert <cy.schubert at gmail.com> wrote:
> > It won't build. Did you intend VOP_UNLOCK(vp,LK_INTERLOCK)?
> >
> > --- vfs_subr.o ---
> > /opt/src/svn-current/sys/kern/vfs_subr.c:1037:17: error: too few arguments
> > to function call, expected 2, have 1
> > VOP_UNLOCK(vp);
> > ~~~~~~~~~~ ^
> > ./vnode_if.h:873:1: note: 'VOP_UNLOCK' declared here
> > static __inline int VOP_UNLOCK(
> > ^
> > /opt/src/svn-current/sys/kern/vfs_subr.c:1401:16: error: too few arguments
> > to function call, expected 2, have 1
> > VOP_UNLOCK(vp);
> > ~~~~~~~~~~ ^
> > ./vnode_if.h:873:1: note: 'VOP_UNLOCK' declared here
> > static __inline int VOP_UNLOCK(
> > ^
> > /opt/src/svn-current/sys/kern/vfs_subr.c:1413:15: error: too few arguments
> > to function call, expected 2, have 1
> > VOP_UNLOCK(vp);
> > ~~~~~~~~~~ ^
> > ./vnode_if.h:873:1: note: 'VOP_UNLOCK' declared here
> > static __inline int VOP_UNLOCK(
> > ^
> > 3 errors generated.
> > *** [vfs_subr.o] Error code 1
> >
> > make[2]: stopped in /export/obj/opt/src/svn-current/amd64.amd64/sys/BREAK
> >
> >
> > --
> > Cheers,
> > Cy Schubert <Cy.Schubert at cschubert.com>
> > FreeBSD UNIX: <cy at FreeBSD.org> Web: http://www.FreeBSD.org
> >
> > The need of the many outweighs the greed of the few.
> >
> >
> > In message
> > <CAGudoHHGLguWZZMh+TOCBwANKKp7-6z5JvP1NgRo3jAr4vZ+Pw at mail.gmail.c
> > om>
> > , Mateusz Guzik writes:
> >> Does this do the trick for you?
> >>
> >> https://people.freebsd.org/~mjg/vop_unlock-interlock.diff
> >>
> >> On 8/26/19, Cy Schubert <Cy.Schubert at cschubert.com> wrote:
> >> > On August 26, 2019 8:40:50 AM PDT, Cy Schubert
> >> > <Cy.Schubert at cschubert.com>
> >> > wrote:
> >> >>On August 26, 2019 7:11:22 AM PDT, Cy Schubert
> >> >><Cy.Schubert at cschubert.com> wrote:
> >> >>>In message <6C6BF3A4-DC07-4D9A-9A5F-FA075BF535A8 at cschubert.com>, Cy
> >> >>>Schubert wr
> >> >>>ites:
> >> >>>> On August 24, 2019 10:13:15 PM PDT, Mateusz Guzik <mjg at FreeBSD.org>
> >> >>>wrote:
> >> >>>> >Author: mjg
> >> >>>> >Date: Sun Aug 25 05:13:15 2019
> >> >>>> >New Revision: 351472
> >> >>>> >URL: https://svnweb.freebsd.org/changeset/base/351472
> >> >>>> >
> >> >>>> >Log:
> >> >>>> > nullfs: reduce areas protected by vnode interlock
> >> >>>> >
> >> >>>> >Some places only take the interlock to hold the vnode, which was a
> >> >>>> >requiremnt
> >> >>>> >before they started being manipulated with atomics. Use the newly
> >> >>>> >introduced
> >> >>>> > vholdnz to bump the count.
> >> >>>> >
> >> >>>> > Reviewed by: kib
> >> >>>> > Tested by: pho
> >> >>>> > Sponsored by: The FreeBSD Foundation
> >> >>>> > Differential Revision: https://reviews.freebsd.org/D21358
> >> >>>> >
> >> >>>> >Modified:
> >> >>>> > head/sys/fs/nullfs/null_vnops.c
> >> >>>> >
> >> >>>> >Modified: head/sys/fs/nullfs/null_vnops.c
> >> >>>>
> >> >>>>======================================================================
> ===
> >> ===
> >> >>>> ==
> >> >>>> >--- head/sys/fs/nullfs/null_vnops.c Sun Aug 25 05:11:43
> >> >>2019 (r35147
> >> >>>> 1)
> >> >>>> >+++ head/sys/fs/nullfs/null_vnops.c Sun Aug 25 05:13:15
> >> >>2019 (r35147
> >> >>>> 2)
> >> >>>> >@@ -668,7 +668,7 @@ null_lock(struct vop_lock1_args *ap)
> >> >>>> > * We prevent it from being recycled by holding the vno
> >> de
> >> >>>> > * here.
> >> >>>> > */
> >> >>>> >- vholdl(lvp);
> >> >>>> >+ vholdnz(lvp);
> >> >>>> > error = VOP_LOCK(lvp, flags);
> >> >>>> >
> >> >>>> > /*
> >> >>>> >@@ -710,31 +710,16 @@ static int
> >> >>>> > null_unlock(struct vop_unlock_args *ap)
> >> >>>> > {
> >> >>>> > struct vnode *vp = ap->a_vp;
> >> >>>> >- int flags = ap->a_flags;
> >> >>>> >- int mtxlkflag = 0;
> >> >>>> > struct null_node *nn;
> >> >>>> > struct vnode *lvp;
> >> >>>> > int error;
> >> >>>> >
> >> >>>> >- if ((flags & LK_INTERLOCK) != 0)
> >> >>>> >- mtxlkflag = 1;
> >> >>>> >- else if (mtx_owned(VI_MTX(vp)) == 0) {
> >> >>>> >- VI_LOCK(vp);
> >> >>>> >- mtxlkflag = 2;
> >> >>>> >- }
> >> >>>> > nn = VTONULL(vp);
> >> >>>> > if (nn != NULL && (lvp = NULLVPTOLOWERVP(vp)) != NULL) {
> >> >>>> >- VI_LOCK_FLAGS(lvp, MTX_DUPOK);
> >> >>>> >- flags |= LK_INTERLOCK;
> >> >>>> >- vholdl(lvp);
> >> >>>> >- VI_UNLOCK(vp);
> >> >>>> >- error = VOP_UNLOCK(lvp, flags);
> >> >>>> >+ vholdnz(lvp);
> >> >>>> >+ error = VOP_UNLOCK(lvp, 0);
> >> >>>> > vdrop(lvp);
> >> >>>> >- if (mtxlkflag == 0)
> >> >>>> >- VI_LOCK(vp);
> >> >>>> > } else {
> >> >>>> >- if (mtxlkflag == 2)
> >> >>>> >- VI_UNLOCK(vp);
> >> >>>> > error = vop_stdunlock(ap);
> >> >>>> > }
> >> >>>> >
> >> >>>> >@@ -845,10 +830,8 @@ null_getwritemount(struct
> >> >>>vop_getwritemount_args
> >> >>>> >*ap)
> >> >>>> > VI_LOCK(vp);
> >> >>>> > xp = VTONULL(vp);
> >> >>>> > if (xp && (lowervp = xp->null_lowervp)) {
> >> >>>> >- VI_LOCK_FLAGS(lowervp, MTX_DUPOK);
> >> >>>> >+ vholdnz(lowervp);
> >> >>>> > VI_UNLOCK(vp);
> >> >>>> >- vholdl(lowervp);
> >> >>>> >- VI_UNLOCK(lowervp);
> >> >>>> > VOP_GETWRITEMOUNT(lowervp, ap->a_mpp);
> >> >>>> > vdrop(lowervp);
> >> >>>> > } else {
> >> >>>>
> >> >>>> Hi mjg@,
> >> >>>>
> >> >>>> This causes trap 12 a few seconds after mountlate during boot.
> >> >>>Reverting this
> >> >>>> commit allowed it to boot.
> >> >>>>
> >> >>>> Sorry for no backtrace. I managed to
> >> >>>> revert and test just prior to rushing out to catch the bus, with no
> >> >>>time to
> >> >>>> craft a proper email. I'll post the backtrace when I arrive at work.
> >> >>>
> >> >>>Hi mjg@,
> >> >>>
> >> >>>The gory details below. Don't be fooled by the panic when yppasswd is
> >> >>>started. I was able to reproduce this panic in single user by simply
> >> >>>mounting and using a nullfs.
> >> >>>
> >> >>>kernel trap 12 with interrupts disabled
> >> >>>
> >> >>>
> >> >>>Fatal trap 12: page fault while in kernel mode
> >> >>>cpuid = 0; apic id = 00
> >> >>>fault virtual address = 0xc
> >> >>>fault code = supervisor read data, page not present
> >> >>>instruction pointer = 0x20:0xffffffff806f0633
> >> >>>stack pointer = 0x28:0xfffffe004b3fa7c0
> >> >>>frame pointer = 0x28:0xfffffe004b3fa7e0
> >> >>>code segment = base 0x0, limit 0xfffff, type 0x1b
> >> >>> = DPL 0, pres 1, long 1, def32 0, gran 1
> >> >>>processor eflags = resume, IOPL = 0
> >> >>>current process = 26 (syncer)
> >> >>>trap number = 12
> >> >>>panic: page fault
> >> >>>cpuid = 0
> >> >>>time = 1566821203
> >> >>>KDB: stack backtrace:
> >> >>>db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
> >> >>>0xfffffe004b3fa470
> >> >>>vpanic() at vpanic+0x19d/frame 0xfffffe004b3fa4c0
> >> >>>panic() at panic+0x43/frame 0xfffffe004b3fa520
> >> >>>trap_fatal() at trap_fatal+0x39c/frame 0xfffffe004b3fa580
> >> >>>trap_pfault() at trap_pfault+0x49/frame 0xfffffe004b3fa5e0
> >> >>>trap() at trap+0x29d/frame 0xfffffe004b3fa6f0
> >> >>>calltrap() at calltrap+0x8/frame 0xfffffe004b3fa6f0
> >> >>>--- trap 0xc, rip = 0xffffffff806f0633, rsp = 0xfffffe004b3fa7c0, rbp
> >> >>=
> >> >>>0xfffffe004b3fa7e0 ---
> >> >>>propagate_priority() at propagate_priority+0x153/frame
> >> >>>0xfffffe004b3fa7e0
> >> >>>turnstile_wait() at turnstile_wait+0x32b/frame 0xfffffe004b3fa830
> >> >>>__mtx_lock_sleep() at __mtx_lock_sleep+0x191/frame 0xfffffe004b3fa8c0
> >> >>>mnt_vnode_next_active() at mnt_vnode_next_active+0x2cb/frame
> >> >>>0xfffffe004b3fa920
> >> >>>vfs_msync() at vfs_msync+0x266/frame 0xfffffe004b3fa980
> >> >>>sync_fsync() at sync_fsync+0xe6/frame 0xfffffe004b3fa9c0
> >> >>>VOP_FSYNC_APV() at VOP_FSYNC_APV+0x56/frame 0xfffffe004b3fa9e0
> >> >>>sched_sync() at sched_sync+0x379/frame 0xfffffe004b3faa70
> >> >>>fork_exit() at fork_exit+0x83/frame 0xfffffe004b3faab0
> >> >>>fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe004b3faab0
> >> >>>--- trap 0, rip = 0, rsp = 0, rbp = 0 ---
> >> >>>Uptime: 3m25s
> >> >>>Dumping 921 out of 7974
> >> >>>MB:..2%..11%..21%..32%..42%..51%..61%..72%..82%..91%
> >> >>>
> >> >>>__curthread () at /opt/src/svn-current/sys/amd64/include/pcpu.h:246
> >> >>>246 __asm("movq %%gs:%P1,%0" : "=r" (td) : "n"
> >> >>>(OFFSETOF_CURTHREAD));
> >> >>>(kgdb) #0 __curthread () at
> >> >>>/opt/src/svn-current/sys/amd64/include/pcpu.h:246
> >> >>>#1 doadump (textdump=1) at
> >> >>>/opt/src/svn-current/sys/kern/kern_shutdown.c:392
> >> >>>#2 0xffffffff8068aead in kern_reboot (howto=260)
> >> >>> at /opt/src/svn-current/sys/kern/kern_shutdown.c:479
> >> >>>#3 0xffffffff8068b369 in vpanic (fmt=<optimized out>, ap=<optimized
> >> >>>out>)
> >> >>> at /opt/src/svn-current/sys/kern/kern_shutdown.c:905
> >> >>>#4 0xffffffff8068b163 in panic (fmt=<unavailable>)
> >> >>> at /opt/src/svn-current/sys/kern/kern_shutdown.c:832
> >> >>>#5 0xffffffff80a11c2c in trap_fatal (frame=0xfffffe004b3fa700,
> >> >>eva=12)
> >> >>> at /opt/src/svn-current/sys/amd64/amd64/trap.c:943
> >> >>>#6 0xffffffff80a11c79 in trap_pfault (frame=0xfffffe004b3fa700,
> >> >>>usermode=0)
> >> >>> at /opt/src/svn-current/sys/amd64/amd64/trap.c:767
> >> >>>#7 0xffffffff80a1126d in trap (frame=0xfffffe004b3fa700)
> >> >>> at /opt/src/svn-current/sys/amd64/amd64/trap.c:443
> >> >>>#8 <signal handler called>
> >> >>>#9 propagate_priority (td=0xfffff8003e43b000)
> >> >>> at /opt/src/svn-current/sys/kern/subr_turnstile.c:279
> >> >>>#10 0xffffffff806f13db in turnstile_wait (ts=0xfffff8000258a780,
> >> >>> owner=<optimized out>, queue=-512)
> >> >>> at /opt/src/svn-current/sys/kern/subr_turnstile.c:785
> >> >>>#11 0xffffffff80669271 in __mtx_lock_sleep (c=0xfffff80132e4ebf0,
> >> >>> v=<optimized out>) at
> >> >>/opt/src/svn-current/sys/kern/kern_mutex.c:654
> >> >>>#12 0xffffffff80767b1b in mnt_vnode_next_active_relock (
> >> >>> mvp=0xfffff80002449800, mp=0xfffff80132d1e000,
> >> >>vp=0xfffff80132e4eb40)
> >> >>> at /opt/src/svn-current/sys/kern/vfs_subr.c:5590
> >> >>>#13 mnt_vnode_next_active (mvp=<optimized out>, mp=0xfffff80132d1e000)
> >> >>> at /opt/src/svn-current/sys/kern/vfs_subr.c:5649
> >> >>>#14 0xffffffff80766206 in __mnt_vnode_next_active
> >> >>>(mvp=0xfffff80002449800,
> >> >>> mp=<optimized out>) at
> >> >>/opt/src/svn-current/sys/kern/vfs_subr.c:5682
> >> >>>#15 vfs_msync (mp=0xfffff80132d1e000, flags=2)
> >> >>> at /opt/src/svn-current/sys/kern/vfs_subr.c:4238
> >> >>>#16 0xffffffff8076b4a6 in sync_fsync (ap=<optimized out>)
> >> >>> at /opt/src/svn-current/sys/kern/vfs_subr.c:4468
> >> >>>#17 0xffffffff80a7be46 in VOP_FSYNC_APV (
> >> >>> vop=0xffffffff80cb4120 <sync_vnodeops>, a=0xfffffe004b3faa08)
> >> >>> at vnode_if.c:1312
> >> >>>#18 0xffffffff80769319 in VOP_FSYNC (vp=<optimized out>, waitfor=3,
> >> >>> td=0xfffff800061dc5a0) at ./vnode_if.h:549
> >> >>>#19 sync_vnode (bo=<optimized out>, td=0xfffff800061dc5a0,
> >> >>> slp=<optimized out>) at
> >> >>/opt/src/svn-current/sys/kern/vfs_subr.c:2316
> >> >>>#20 sched_sync () at /opt/src/svn-current/sys/kern/vfs_subr.c:2418
> >> >>>#21 0xffffffff80647e33 in fork_exit (callout=0xffffffff80768fa0
> >> >>><sched_sync>,
> >> >>> arg=0x0, frame=0xfffffe004b3faac0)
> >> >>> at /opt/src/svn-current/sys/kern/kern_fork.c:1045
> >> >>>#22 <signal handler called>
> >> >>>
> >> >>>
> >> >>>dmesg output:
> >> >>>
> >> >>>Updating motd:.
> >> >>>Mounting late filesystems:.
> >> >>>Starting nscd.
> >> >>>Security policy loaded: MAC/ntpd (mac_ntpd)
> >> >>>Starting ntpd.
> >> >>>Starting yppasswdd.
> >> >>>kernel trap 12 with interrupts disabled
> >> >>>
> >> >>>
> >> >>>Fatal trap 12: page fault while in kernel mode
> >> >>>cpuid = 0; apic id = 00
> >> >>>fault virtual address = 0xc
> >> >>>fault code = supervisor read data, page not present
> >> >>>instruction pointer = 0x20:0xffffffff806f0633
> >> >>>stack pointer = 0x28:0xfffffe004b7fa7c0
> >> >>>frame pointer = 0x28:0xfffffe004b7fa7e0
> >> >>>code segment = base 0x0, limit 0xfffff, type 0x1b
> >> >>> = DPL 0, pres 1, long 1, def32 0, gran 1
> >> >>>processor eflags = resume, IOPL = 0
> >> >>>current process = 26 (syncer)
> >> >>>trap number = 12
> >> >>>panic: page fault
> >> >>>cpuid = 0
> >> >>>time = 1566820700
> >> >>>KDB: stack backtrace:
> >> >>>db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
> >> >>>0xfffffe004b7fa470
> >> >>>vpanic() at vpanic+0x19d/frame 0xfffffe004b7fa4c0
> >> >>>panic() at panic+0x43/frame 0xfffffe004b7fa520
> >> >>>trap_fatal() at trap_fatal+0x39c/frame 0xfffffe004b7fa580
> >> >>>trap_pfault() at trap_pfault+0x49/frame 0xfffffe004b7fa5e0
> >> >>>trap() at trap+0x29d/frame 0xfffffe004b7fa6f0
> >> >>>calltrap() at calltrap+0x8/frame 0xfffffe004b7fa6f0
> >> >>>--- trap 0xc, rip = 0xffffffff806f0633, rsp = 0xfffffe004b7fa7c0, rbp
> >> >>=
> >> >>>0xfffffe004b7fa7e0 ---
> >> >>>propagate_priority() at propagate_priority+0x153/frame
> >> >>>0xfffffe004b7fa7e0
> >> >>>turnstile_wait() at turnstile_wait+0x32b/frame 0xfffffe004b7fa830
> >> >>>__mtx_lock_sleep() at __mtx_lock_sleep+0x191/frame 0xfffffe004b7fa8c0
> >> >>>mnt_vnode_next_active() at mnt_vnode_next_active+0x2cb/frame
> >> >>>0xfffffe004b7fa920
> >> >>>vfs_msync() at vfs_msync+0x266/frame 0xfffffe004b7fa980
> >> >>>sync_fsync() at sync_fsync+0xe6/frame 0xfffffe004b7fa9c0
> >> >>>--- trap 0, rip = 0, rsp = 0, rbp = 0 ---
> >> >>>Uptime: 1m38s
> >> >>>Dumping 810 out of 7974
> >> >>>MB:..2%..12%..22%..32%..42%..52%..62%..72%..81%..91%---<<BOOT>>---
> >> >>
> >> >>This may be a simple case of increasing the kernel stack. I'll try this
> >> >>at noon.
> >> >
> >> > Increasing kernel stack pages from 8 to 20 still results in the panic.
> >> >
> >> >
> >> > --
> >> > Pardon the typos and autocorrect, small keyboard in use.
> >> > Cheers,
> >> > Cy Schubert <Cy.Schubert at cschubert.com>
> >> > FreeBSD UNIX: <cy at FreeBSD.org> Web: http://www.FreeBSD.org
> >> >
> >> > The need of the many outweighs the greed of the few.
> >> >
> >>
> >>
> >> --
> >> Mateusz Guzik <mjguzik gmail.com>
> >
> >
> >
>
>
> --
> Mateusz Guzik <mjguzik gmail.com>
More information about the svn-src-head
mailing list