[Bug 219399] System panics after several hours of 14-threads-compilation orgies using poudriere on AMD Ryzen...

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Fri Jul 28 19:15:51 UTC 2017


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219399

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

For:

#3  0xffffffff80a6b9e3 in panic (fmt=<value optimized out>) at
/usr/src/sys/kern/kern_shutdown.c:690
#4  0xffffffff80a4cf71 in _mtx_lock_spin_cookie (c=<value optimized out>,
v=<value optimized out>, tid=18446735290631902560, opts=<value optimized out>,
file=<value optimized out>, 
   line=<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 = mtx_owner(m);

        /* If the mutex is unlocked, try again. */
        if (td == 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 == 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 != NULL)
                                        DELAY(1);
                                else
                                        _mtx_lock_spin_failed(m);
                                cpu_spinwait();
                        }
                        v = MTX_READ_VALUE(m);
                } while (v != MTX_UNOWNED);
                spinlock_enter();
        }

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

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


More information about the freebsd-bugs mailing list