tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: KASSERTMSG fix



On Wed, Sep 07, 2011 at 05:43:14PM +0200, Jean-Yves Migeon wrote:
> On 07.09.2011 17:02, Joerg Sonnenberger wrote:
> > On Wed, Sep 07, 2011 at 04:54:05PM +0200, Jean-Yves Migeon wrote:
> >> The attached patch takes care of this; it does not really "append" the
> >> msg to the panic string (so it won't be available via panicstr like
> >> before), but now KASSERTMSG() will print the additional info.
> > 
> > I'm not sure I like the approach. I would prefer to introduce a second
> > panic() function with explicit file/line number / function argument.
> > panic() itself could be replaced by a macro calling that new verbose
> > panic function, maybe under an option.
> 
> Hmm. This is generally done via the fmt string of panic(9). Someone
> could also ask to have explicit timestamping and function name, the
> "verbose panic" prototype will become rapidly ugly...

Timestamping can be done in panic itself. For the rest, it is more a
question of consistency and ease of use. I haven't tried building a
kernel to see what the size impact of always including them would be.

> > I think it is time for KASSERTMSG and friends to just adopt C99 variadic
> > macros with the associated dropping of a pair of (). That involves more
> > code churn though.
> 
> I did not propose this for this reason: I can fix all the KASSERTMSG()
> uses in src, but not those outside the tree. And I expect that most
> compile time warnings here won't make much sense once the macro gets
> changed.

I don't think the compiler warnings will degrade much, even with GCC.
I don't think there is enough external code to justify worrying about
it.

> This can work around the limitations elegantly though (provided all call
> sites are fixed):
> 
> #define KASSERTMSG(e, fmt, ...) do {            \
>   panic(                                        \
>     "kernel diag assert \"%s\" failed: file \"%s\", line %d; " fmt, \
>     #e, __FILE__, __LINE__, ## __VA_ARGS__);    \
> } while(0)

That assumes that fmt is a string literal. I don't think it is easier
than:

panic_verbose(__FILE__, __LINE__, #e, fmt, ##__VA_ARGS__);

and it would allow panic to be turned into the verbose form easily.

> But do all compilers used with NetBSD support variadic macros?

The kernel is C99, any compiler not supporting that is irrelevant.

Joerg


Home | Main Index | Thread Index | Old Index