Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 Jul 2017 19:15:47 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-bugs@FreeBSD.org
Subject:   [Bug 219399] System panics after several hours of 14-threads-compilation orgies using poudriere on AMD Ryzen...
Message-ID:  <bug-219399-8-D4d4f26sG9@https.bugs.freebsd.org/bugzilla/>
In-Reply-To: <bug-219399-8@https.bugs.freebsd.org/bugzilla/>
References:  <bug-219399-8@https.bugs.freebsd.org/bugzilla/>

next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D219399

--- Comment #184 from Mark Millard <markmi@dsl-only.net> ---
(In reply to Nils Beyer from comment #183)

For:

#3  0xffffffff80a6b9e3 in panic (fmt=3D<value optimized out>) at
/usr/src/sys/kern/kern_shutdown.c:690
#4  0xffffffff80a4cf71 in _mtx_lock_spin_cookie (c=3D<value optimized out>,
v=3D<value optimized out>, tid=3D18446735290631902560, opts=3D<value optimi=
zed out>,
file=3D<value optimized out>,=20
   line=3D<value optimized out>) at /usr/src/sys/kern/kern_mutex.c:672

I looked up the panic call at:

/usr/src/sys/kern/kern_mutex.c:672

It is the one in:

static void
_mtx_lock_spin_failed(struct mtx *m)
{
        struct thread *td;

        td =3D mtx_owner(m);

        /* If the mutex is unlocked, try again. */
        if (td =3D=3D NULL)
                return;

        printf( "spin lock %p (%s) held by %p (tid %d) too long\n",
            m, m->lock_object.lo_name, td, td->td_tid);
#ifdef WITNESS
        witness_display_spinlock(&m->lock_object, td, printf);
#endif
        panic("spin lock held too long");
}


So the duration of holding the lock is involved in
hitting this specific panic.


In _mtx_lock_spin_cookie there is:

        for (;;) {
                if (v =3D=3D MTX_UNOWNED) {
                        if (_mtx_obtain_lock_fetch(m, &v, tid))
                                break;
                        continue;
                }
                /* Give interrupts a chance while we spin. */
                spinlock_exit();
                do {
                        if (lda.spin_cnt < 10000000) {
                                lock_delay(&lda);
                        } else {
                                lda.spin_cnt++;
                                if (lda.spin_cnt < 60000000 || kdb_active ||
                                    panicstr !=3D NULL)
                                        DELAY(1);
                                else
                                        _mtx_lock_spin_failed(m);
                                cpu_spinwait();
                        }
                        v =3D MTX_READ_VALUE(m);
                } while (v !=3D MTX_UNOWNED);
                spinlock_enter();
        }

So apparently lda.spin_cnt made it to 60000000
or beyond.

--=20
You are receiving this mail because:
You are the assignee for the bug.=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-219399-8-D4d4f26sG9>