Crash in accounting code: encode_long(), due to bad rusage data?
Diomidis Spinellis
dds at aueb.gr
Sun Aug 19 16:32:46 PDT 2007
Robert Watson wrote:
> I recently upgraded two servers from FreeBSD 6-STABLE to FreeBSD
> 7-CURRENT in anticipation of the forthcoming release. Both of them run
> with accounting enabled at all times. When a large pine session was
> exiting on one of the two boxes, I ran into the following panic:
>
> panic: encode_long: -ve value -32749
Getting rid of the panic is easy:
--- kern_acct.c 2007-08-20 01:15:18.000000000 +0300
+++ kern_acct.c.new 2007-08-20 01:16:06.000000000 +0300
@@ -523,8 +523,7 @@
int norm_exp; /* Normalized exponent */
int shift;
- KASSERT(val >= 0, ("encode_long: -ve value %ld", val));
- if (val == 0)
+ if (val <= 0)
return (0);
norm_exp = fls(val) - 1;
shift = FLT_MANT_DIG - norm_exp - 1;
However, as you wrote, this doesn't fix the root of the problem.
> I find the large negative value in ru_idrss somewhat sad to contemplate,
> and while this could well be a problem with capturing of process runtime
> information, I'd like it if the accounting code were robust against this
> sort of bug, rather than panicking, and I guess I'd also rather than the
> process runtime information also be correctly captured :-).
Do you think it makes any sense for encode_long to be correctly encoding
negative numbers, or should we concentrate on locating and fixing the
negative ru_idrss problem?
Diomidis Spinellis - http://www.spinellis.gr
More information about the freebsd-current
mailing list