Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 22 Dec 2012 23:20:05 +1100 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Attilio Rao <attilio@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Bruce Evans <brde@optusnet.com.au>
Subject:   Re: svn commit: r244582 - head/sys/kern
Message-ID:  <20121222230402.P1765@besplex.bde.org>
In-Reply-To: <CAJ-FndCazK%2BE9w8fGvO4uou-sCOgnf8cVFu0nzXjUeTu2RYF4w@mail.gmail.com>
References:  <201212220937.qBM9bYQK050680@svn.freebsd.org> <20121222204409.V1410@besplex.bde.org> <CAJ-FndCazK%2BE9w8fGvO4uou-sCOgnf8cVFu0nzXjUeTu2RYF4w@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 22 Dec 2012, Attilio Rao wrote:

> On Sat, Dec 22, 2012 at 10:51 AM, Bruce Evans <brde@optusnet.com.au> wrote:
>> On Sat, 22 Dec 2012, Attilio Rao wrote:
>>
>>> Log:
>>>  Fixup r240424: On entering KDB backends, the hijacked thread to run
>>>  interrupt context can still be idlethread. At that point, without the
>>>  panic condition, it can still happen that idlethread then will try to
>>>  acquire some locks to carry on some operations.
>>>
>>>  Skip the idlethread check on block/sleep lock operations when KDB is
>>>  active.
>>
>> This seems backwards to me.  It is an error to go near normal locking
>> code when kdb is active.
>
> I completely agree, but this is not what happens nowadays with FreeBSD kernel.
> In my view, KDB should not call into normal code, but in special
> wrappers which skip locking entirely, in particular because other cpus
> are stopped, so there is no race going on.
> However, this requires a big change and as long as this doesn't happen
> we need to stuck with similar hacks.

But this sort of hack only breaks accidental detection of a bug (maybe
the bug causes deadlock or data corruption soon).  The type of hack
that helps is 'if (kdb_active) skip_locking();' deep in code that
shouldn't even be called if kdb is active.  Here it is 'if (kdb_active)
skip_checking();'

>>> Modified: head/sys/kern/kern_lock.c
>>>
>>> ==============================================================================
>>> --- head/sys/kern/kern_lock.c   Sat Dec 22 07:48:09 2012        (r244581)
>>> +++ head/sys/kern/kern_lock.c   Sat Dec 22 09:37:34 2012        (r244582)
>>> @@ -35,6 +35,7 @@
>>> __FBSDID("$FreeBSD$");
>>>
>>> #include <sys/param.h>
>>> +#include <sys/kdb.h>
>>> #include <sys/ktr.h>
>>> #include <sys/lock.h>
>>> #include <sys/lock_profile.h>
>>> @@ -477,7 +478,7 @@ __lockmgr_args(struct lock *lk, u_int fl
>>>         KASSERT((flags & LK_INTERLOCK) == 0 || ilk != NULL,
>>>             ("%s: LK_INTERLOCK passed without valid interlock @ %s:%d",
>>>             __func__, file, line));
>>> -       KASSERT(!TD_IS_IDLETHREAD(curthread),
>>> +       KASSERT(kdb_active != 0 || !TD_IS_IDLETHREAD(curthread),
>>>             ("%s: idle thread %p on lockmgr %s @ %s:%d", __func__,
>>> curthread,
>>>             lk->lock_object.lo_name, file, line));
>>
>>
>> This is backwards from:
>>
>>         KASSERT(kdb_active == 0);
>>
>> which makes it fatal for any thread to call here.
>
> I do not understand. For kdb_active == 0 it still checks for
> IDLETHREAD if it is not idlethread it doesn't panic, it panics
> otherwise, which seems the right to me.

I just mean that the correct kdb_active KASSERT() is independent of the
idlethread one.  It should also have a different message.  I forgot to
provide a message.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121222230402.P1765>