• Dimitri Sivanich's avatar
    [PATCH] X86_64 monotonic_clock goes backwards · cbf9b4bb
    Dimitri Sivanich authored
    I've noticed some erratic behavior while testing the X86_64 version
    of monotonic_clock().
    
    While spinning in a loop reading monotonic clock values (pinned to a
    single cpu) I noticed that the difference between subsequent values
    occasionally went negative (time going backwards).
    
    I found that in the following code:
                    this_offset = get_cycles_sync();
                    /* FIXME: 1000 or 1000000? */
    -->             offset = (this_offset - last_offset)*1000 / cpu_khz;
            }
            return base + offset;
    
    the offset sometimes turns out to be 0, even though
    this_offset > last_offset.
    
    +Added fix From: Toyo Abe <toyoa@mvista.com>
    
    The x86_64-mm-monotonic-clock.patch in 2.6.18-rc4-mm2 made a change to
    the updating of monotonic_base. It now uses cycles_2_ns().
    
    I suggest that a set_cyc2ns_scale() should be done prior to the setup_irq().
    Because cycles_2_ns() can be called from the timer ISR right after the irq0
    is enabled.
    Signed-off-by: default avatarToyo Abe <toyoa@mvista.com>
    Signed-off-by: default avatarDimitri Sivanich <sivanich@sgi.com>
    Signed-off-by: default avatarAndi Kleen <ak@suse.de>
    cbf9b4bb
time.c 33.2 KB