tech-kern archive

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

TSC clock going backwards on suspend/resume



Hi -
while the problems leading to the monotonic clock being
accused of going backwards are fixed afaics I've found
a case where the clock really doesn't behave:
With the "TSC" as timecounter source I see a step
backwards always after a suspend/resume cycle. This is
a dual-core box so the calibration code might be
involved. Would someone understanding the TSC code
please have a look at this?
I'll append the patch which I used to detect the problem --
unfortunately a positive leads to a panic due to
some locking problem. Too bad, formerly one could
do kernel printfs to the console at any time...
best regards
Matthias





-------------------------------------------------------------------
-------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich

Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzende des Aufsichtsrats: MinDir'in Baerbel Brumme-Bothe
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr. Harald Bolt,
Dr. Sebastian M. Schmidt
-------------------------------------------------------------------
-------------------------------------------------------------------
#
# old_revision [77d74059018fef25e0045ba3376431d15ce0288b]
#
# patch "sys/kern/kern_tc.c"
#  from [dee01e2e4a4717a30f6cbd731a567b4d3ab8a082]
#    to [b0bf69b04598218be191f35700b7e03946a4e311]
#
============================================================
--- sys/kern/kern_tc.c  dee01e2e4a4717a30f6cbd731a567b4d3ab8a082
+++ sys/kern/kern_tc.c  b0bf69b04598218be191f35700b7e03946a4e311
@@ -305,6 +305,8 @@ tc_delta(struct timehands *th)
  * the comment in <sys/timevar.h> for a description of these 12 functions.
  */
 
+static int xxxbupsecs;
+
 void
 binuptime(struct bintime *bt)
 {
@@ -318,6 +320,10 @@ binuptime(struct bintime *bt)
                *bt = th->th_offset;
                bintime_addx(bt, th->th_scale * tc_delta(th));
        } while (gen == 0 || gen != th->th_generation);
+
+       if (bt->sec < xxxbupsecs)
+               printf("binuptime: %qd/%d\n", bt->sec, xxxbupsecs);
+       xxxbupsecs = bt->sec;
 }
 
 void


Home | Main Index | Thread Index | Old Index