On Tue, 14 Jul 2020 11:59:14 +0200 (CEST)
Mark Kettenis <[email protected]> wrote:

> Yeah, one possible approach would be to increment ogen by two.  A
> little bit easier to check that they can never be the same since one
> is always odd and the other is always even.
> 
> Another possible approach would be to export both timehands.  This
> could help avoiding some of the looping int the bin*time() functions
> in libc.  Not sure that's worth it.  And we should probably go for the
> "quick" fix initially regardless.

I suspect that the bin*time() functions almost never loop back.

Here's a quick fix: read ogen from the other struct timehands, so
there is only one sequence of generation values, giving odds to th0
and evens to th1 (until the generation overflows and skips zero, then
it would give evens to th0 and odds to th1).

I like this better than my first diff.  OK?

Index: kern/kern_tc.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_tc.c,v
retrieving revision 1.62
diff -u -p -r1.62 kern_tc.c
--- kern/kern_tc.c      6 Jul 2020 13:33:09 -0000       1.62
+++ kern/kern_tc.c      14 Jul 2020 21:58:57 -0000
@@ -583,8 +583,8 @@ tc_windup(struct bintime *new_boottime, 
         * the contents, the generation must be zero.
         */
        tho = timehands;
+       ogen = tho->th_generation;
        th = tho->th_next;
-       ogen = th->th_generation;
        th->th_generation = 0;
        membar_producer();
        memcpy(th, tho, offsetof(struct timehands, th_generation));

Reply via email to