Re: 2.6.23-rc3-mm1 - vdso and gettimeofday issues with glibc

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

 



On 09/01/2007 06:07 AM, Andi Kleen wrote:
>>         write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
>>         /* copy vsyscall data */
>>         vsyscall_gtod_data.clock.vread = clock->vread;
>>         vsyscall_gtod_data.clock.cycle_last = clock->cycle_last;
>>         vsyscall_gtod_data.clock.mask = clock->mask;
>>         vsyscall_gtod_data.clock.mult = clock->mult;
>>         vsyscall_gtod_data.clock.shift = clock->shift;
>>         vsyscall_gtod_data.wall_time_sec = wall_time->tv_sec;
>>         vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;  <===
>>         vsyscall_gtod_data.sys_tz = sys_tz;
>>         vsyscall_gtod_data.wall_time_nsec = wall_time->tv_nsec;  <===
> 
> Must have been a (harmless) merging mistake, but I bet gcc optimizes it out
> anyways.
> 

I did find this after some digging:


In the vdso code:

static inline long vgetns(void)
{
        cycles_t (*vread)(void);
        vread = gtod->clock.vread;
        return ((vread() - gtod->clock.cycle_last) * gtod->clock.mult) >>
                gtod->clock.shift;
}


Looks like an open-coded version of this in the kernel timekeeping code:

static inline s64 __get_nsec_offset(void)
{
        cycle_t cycle_now, cycle_delta;
        s64 ns_offset;

        /* read clocksource: */
        cycle_now = clocksource_read(clock);

        /* calculate the delta since the last update_wall_time: */
        cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;

        /* convert to nanoseconds: */
        ns_offset = cyc2ns(clock, cycle_delta);

        return ns_offset;
}

But the vdso version isn't doing any masking. And the mask is different for
different clocksources, so it has to track the underlying kernel's clocksource
when it gets changed.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux