cvs commit: src/sys/net if_vlan.c

Yar Tikhiy yar at comp.chem.msu.su
Thu Aug 10 23:40:40 UTC 2006


On Tue, Aug 08, 2006 at 12:15:07PM -0400, John Baldwin wrote:
> On Tuesday 08 August 2006 05:50, Yar Tikhiy wrote:
> > On Fri, Aug 04, 2006 at 04:44:07PM -0400, John Baldwin wrote:
> > > 
> > > To be honest, as someone who works with bug reports, I'd actually like 
> > > backtraces up front w/o requiring the user to compile a custom kernel, 
> etc.  
> > > Having a simple backend in place and kdb_backtrace()'s where relevant 
> would 
> > > be very handy. :)
> > > 
> > > > > Places that call kdb_enter() aren't all #ifdef KDB IIRC.  It's 
> > > > > just a feature that kdb_foo() functions become NOPs when the kernel 
> isn't 
> > > > > configured for debugging, so I think the #ifdef KDB's would be 
> redundant.
> > > > 
> > > > None of the kdb_*() functions in src/sys/kern/subr_kdb.c turn into
> > > > NOPs when option KDB is not present. They are all unconditionally
> > > > functional by design and should therefore be called conditionally
> > > > by consequence.
> > > 
> > > Well, given that separation, I'm not sure KDB is the right option to make 
> > > calls conditional.  Rather, some specific is-debugging-enabled? option 
> (like 
> > > INARIANTS or FOO_DEBUG) should be used instead.  i.e.:
> > > 
> > > #ifdef FOO_DEBUG
> > > 	if (foo_bad) {
> > > 		printf("foo is bad\n");
> > > 		kdb_backtrace();
> > > 	}
> > > #endif
> > > 
> > > I don't think that warrants an extra #ifdef KDB.
> > 
> > Please excuse me, but there is a small inconsistency in your words.
> > On the one hand, you wish users could obtain and post backtraces
> > with no special efforts.  This is a great point because users don't
> > always have time or resources to reproduce a problem with kernel
> > debug features enabled, and some weird problems defy reproducing.
> > On the other hand, you suggest putting kdb_backtrace() calls under
> > secial #ifdef's.  That would effectively cancel out the benefits
> > from using kdb_backtrace() for "mild debugging" because you would
> > still have to have the users re-compile their kernels or modules
> > and try to catch the bug again.  A call to kdb_backtrace() is cheap,
> > so there is little sense in leaving it out from production kernels
> > and modules.  IMHO the only case when it should be done is when the
> > consistency check around kdb_backtrace() is expensive and sits on
> > a performance-critical path.
> 
> No, you misunderstood.  Suppose you have a set of extra checks turned on (such 
> as options WITNESS), then any witness-related kdb_backtrace()'s would be 
> sufficiently protected by #ifdef WITNESS without the need for an #ifdef KDB.  
> In fact, if a user includes WITNESS but doesn't include 'options KDB' (which 
> now seems useless) or 'options DDB', it would be neat to have a little stack 
> unwinder still dump out the backtrace, but it would be conditional on WITNESS 
> since it requires WITNESS to do the checking.  This similar to KASSERT being 
> conditional on INVARIANTS.  I think most of the kdb_backtrace()'s I would 
> throw in would probably be #ifdef INVARIANTS in fact.  The only one I can 
> think of that is always turned on is in subr_turnstile.c where it tries to 
> backtrace the thread that slept while holding a lock.  In this case, because 
> the kdb_* API is too limited, it has to use a DDB-specific call and is thus 
> #ifdef DDB, but I'd actually prefer it to not be DDB-specific.

Oh, now I see your point and can't but agree with it.  Indeed,
#ifdef INVARIANTS is a fair compromise between using kdb_backtrace()
unconditionally and having to set a bunch of scary FOO_DEBUG options
to catch a less obvious bug.  As a matter of fact, some FOO_DEBUG
options will enable code rather unsuitable for production, such as
a per-packet printf on the main path; they are good for hard-core
developers only.  (I wonder if such printfs should be converted to
KTR-aware code ideally...)

Now I think I have a chance to apply to if_vlan.c what I've learned here.
Thank you all for the fruitful discussion!

-- 
Yar


More information about the cvs-src mailing list