lkml.org 
[lkml]   [2010]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] powerpc: Simplify update_vsyscall
    Date
    Currently powerpc's update_vsyscall calls an inline update_gtod.
    However, both are straightforward, and there are no other users,
    so this patch merges update_gtod into update_vsyscall.

    Compiles, but otherwise untested.

    Cc: Anton Blanchard <anton@samba.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: John Stultz <johnstul@us.ibm.com>
    ---
    arch/powerpc/kernel/time.c | 55 ++++++++++++++++++++------------------------
    1 files changed, 25 insertions(+), 30 deletions(-)

    diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
    index 1b16b9a..9a06ff9 100644
    --- a/arch/powerpc/kernel/time.c
    +++ b/arch/powerpc/kernel/time.c
    @@ -423,30 +423,6 @@ void udelay(unsigned long usecs)
    }
    EXPORT_SYMBOL(udelay);

    -static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
    - u64 new_tb_to_xs)
    -{
    - /*
    - * tb_update_count is used to allow the userspace gettimeofday code
    - * to assure itself that it sees a consistent view of the tb_to_xs and
    - * stamp_xsec variables. It reads the tb_update_count, then reads
    - * tb_to_xs and stamp_xsec and then reads tb_update_count again. If
    - * the two values of tb_update_count match and are even then the
    - * tb_to_xs and stamp_xsec values are consistent. If not, then it
    - * loops back and reads them again until this criteria is met.
    - * We expect the caller to have done the first increment of
    - * vdso_data->tb_update_count already.
    - */
    - vdso_data->tb_orig_stamp = new_tb_stamp;
    - vdso_data->stamp_xsec = new_stamp_xsec;
    - vdso_data->tb_to_xs = new_tb_to_xs;
    - vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
    - vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
    - vdso_data->stamp_xtime = xtime;
    - smp_wmb();
    - ++(vdso_data->tb_update_count);
    -}
    -
    #ifdef CONFIG_SMP
    unsigned long profile_pc(struct pt_regs *regs)
    {
    @@ -840,7 +816,7 @@ static cycle_t timebase_read(struct clocksource *cs)
    void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
    u32 mult)
    {
    - u64 t2x, stamp_xsec;
    + u64 new_tb_to_xs, new_stamp_xsec;

    if (clock != &clocksource_timebase)
    return;
    @@ -851,11 +827,30 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,

    /* XXX this assumes clock->shift == 22 */
    /* 4611686018 ~= 2^(20+64-22) / 1e9 */
    - t2x = (u64) mult * 4611686018ULL;
    - stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
    - do_div(stamp_xsec, 1000000000);
    - stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
    - update_gtod(clock->cycle_last, stamp_xsec, t2x);
    + new_tb_to_xs = (u64) mult * 4611686018ULL;
    + new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
    + do_div(new_stamp_xsec, 1000000000);
    + new_stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
    +
    + /*
    + * tb_update_count is used to allow the userspace gettimeofday code
    + * to assure itself that it sees a consistent view of the tb_to_xs and
    + * stamp_xsec variables. It reads the tb_update_count, then reads
    + * tb_to_xs and stamp_xsec and then reads tb_update_count again. If
    + * the two values of tb_update_count match and are even then the
    + * tb_to_xs and stamp_xsec values are consistent. If not, then it
    + * loops back and reads them again until this criteria is met.
    + * We expect the caller to have done the first increment of
    + * vdso_data->tb_update_count already.
    + */
    + vdso_data->tb_orig_stamp = clock->cycle_last;
    + vdso_data->stamp_xsec = new_stamp_xsec;
    + vdso_data->tb_to_xs = new_tb_to_xs;
    + vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
    + vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
    + vdso_data->stamp_xtime = xtime;
    + smp_wmb();
    + ++(vdso_data->tb_update_count);
    }

    void update_vsyscall_tz(void)
    --
    1.6.0.4


    \
     
     \ /
      Last update: 2010-03-05 03:41    [W:2.906 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site