mirror of https://gitee.com/openkylin/linux.git
powerpc: Simplify update_vsyscall
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. Signed-off-by: John Stultz <johnstul@us.ibm.com> Cc: Anton Blanchard <anton@samba.org> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1279068988-21864-5-git-send-email-johnstul@us.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
592913ecb8
commit
b0797b60d0
|
@ -423,30 +423,6 @@ void udelay(unsigned long usecs)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(udelay);
|
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
|
#ifdef CONFIG_SMP
|
||||||
unsigned long profile_pc(struct pt_regs *regs)
|
unsigned long profile_pc(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -876,7 +852,7 @@ static cycle_t timebase_read(struct clocksource *cs)
|
||||||
void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
||||||
u32 mult)
|
u32 mult)
|
||||||
{
|
{
|
||||||
u64 t2x, stamp_xsec;
|
u64 new_tb_to_xs, new_stamp_xsec;
|
||||||
|
|
||||||
if (clock != &clocksource_timebase)
|
if (clock != &clocksource_timebase)
|
||||||
return;
|
return;
|
||||||
|
@ -887,11 +863,30 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
||||||
|
|
||||||
/* XXX this assumes clock->shift == 22 */
|
/* XXX this assumes clock->shift == 22 */
|
||||||
/* 4611686018 ~= 2^(20+64-22) / 1e9 */
|
/* 4611686018 ~= 2^(20+64-22) / 1e9 */
|
||||||
t2x = (u64) mult * 4611686018ULL;
|
new_tb_to_xs = (u64) mult * 4611686018ULL;
|
||||||
stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
|
new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
|
||||||
do_div(stamp_xsec, 1000000000);
|
do_div(new_stamp_xsec, 1000000000);
|
||||||
stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
|
new_stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
|
||||||
update_gtod(clock->cycle_last, stamp_xsec, t2x);
|
|
||||||
|
/*
|
||||||
|
* 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)
|
void update_vsyscall_tz(void)
|
||||||
|
|
Loading…
Reference in New Issue