diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-13 15:15:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-13 15:15:40 -0500 |
commit | f08d8bcc12de5a153e587027e77de83662eefb8a (patch) | |
tree | 301fedc4a3ba056db2699b471f4cb69edc2151d3 | |
parent | f3573b8f902c507c721999cc669fbb7e045081b8 (diff) | |
parent | d4d1fc61eb38ff8e5af657e2d2f2290859a277f2 (diff) |
Merge tag 'please-pull-gettime_vsyscall_update' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux
Pull ia64 update from Tony Luck:
"Stop ia64 being the last holdout using GENERIC_TIME_VSYSCALL_OLD so
that John Stultz can drop that code"
* tag 'please-pull-gettime_vsyscall_update' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux:
ia64: Update fsyscall gettime to use modern vsyscall_update
-rw-r--r-- | arch/ia64/Kconfig | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/asm-offsets.c | 2 | ||||
-rw-r--r-- | arch/ia64/kernel/fsys.S | 8 | ||||
-rw-r--r-- | arch/ia64/kernel/fsyscall_gtod_data.h | 10 | ||||
-rw-r--r-- | arch/ia64/kernel/time.c | 40 |
5 files changed, 36 insertions, 26 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 1efc444f5fa1..49583c5a5d44 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -47,7 +47,7 @@ config IA64 | |||
47 | select ARCH_TASK_STRUCT_ALLOCATOR | 47 | select ARCH_TASK_STRUCT_ALLOCATOR |
48 | select ARCH_THREAD_STACK_ALLOCATOR | 48 | select ARCH_THREAD_STACK_ALLOCATOR |
49 | select ARCH_CLOCKSOURCE_DATA | 49 | select ARCH_CLOCKSOURCE_DATA |
50 | select GENERIC_TIME_VSYSCALL_OLD | 50 | select GENERIC_TIME_VSYSCALL |
51 | select SYSCTL_ARCH_UNALIGN_NO_WARN | 51 | select SYSCTL_ARCH_UNALIGN_NO_WARN |
52 | select HAVE_MOD_ARCH_SPECIFIC | 52 | select HAVE_MOD_ARCH_SPECIFIC |
53 | select MODULES_USE_ELF_RELA | 53 | select MODULES_USE_ELF_RELA |
diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c index b385ff2bf6ce..f7693f49c573 100644 --- a/arch/ia64/kernel/asm-offsets.c +++ b/arch/ia64/kernel/asm-offsets.c | |||
@@ -212,6 +212,8 @@ void foo(void) | |||
212 | BLANK(); | 212 | BLANK(); |
213 | DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, | 213 | DEFINE(IA64_TIMESPEC_TV_NSEC_OFFSET, |
214 | offsetof (struct timespec, tv_nsec)); | 214 | offsetof (struct timespec, tv_nsec)); |
215 | DEFINE(IA64_TIME_SN_SPEC_SNSEC_OFFSET, | ||
216 | offsetof (struct time_sn_spec, snsec)); | ||
215 | 217 | ||
216 | DEFINE(CLONE_SETTLS_BIT, 19); | 218 | DEFINE(CLONE_SETTLS_BIT, 19); |
217 | #if CLONE_SETTLS != (1<<19) | 219 | #if CLONE_SETTLS != (1<<19) |
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index c0e7c9af2bb9..fe742ffafc7a 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S | |||
@@ -236,9 +236,9 @@ ENTRY(fsys_gettimeofday) | |||
236 | MOV_FROM_ITC(p8, p6, r2, r10) // CPU_TIMER. 36 clocks latency!!! | 236 | MOV_FROM_ITC(p8, p6, r2, r10) // CPU_TIMER. 36 clocks latency!!! |
237 | (p9) ld8 r2 = [r30] // MMIO_TIMER. Could also have latency issues.. | 237 | (p9) ld8 r2 = [r30] // MMIO_TIMER. Could also have latency issues.. |
238 | (p13) ld8 r25 = [r19] // get itc_lastcycle value | 238 | (p13) ld8 r25 = [r19] // get itc_lastcycle value |
239 | ld8 r9 = [r22],IA64_TIMESPEC_TV_NSEC_OFFSET // tv_sec | 239 | ld8 r9 = [r22],IA64_TIME_SN_SPEC_SNSEC_OFFSET // sec |
240 | ;; | 240 | ;; |
241 | ld8 r8 = [r22],-IA64_TIMESPEC_TV_NSEC_OFFSET // tv_nsec | 241 | ld8 r8 = [r22],-IA64_TIME_SN_SPEC_SNSEC_OFFSET // snsec |
242 | (p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm) | 242 | (p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm) |
243 | ;; | 243 | ;; |
244 | (p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared | 244 | (p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared |
@@ -266,9 +266,9 @@ EX(.fail_efault, probe.w.fault r31, 3) | |||
266 | mf | 266 | mf |
267 | ;; | 267 | ;; |
268 | ld4 r10 = [r20] // gtod_lock.sequence | 268 | ld4 r10 = [r20] // gtod_lock.sequence |
269 | shr.u r2 = r2,r23 // shift by factor | ||
270 | ;; | ||
271 | add r8 = r8,r2 // Add xtime.nsecs | 269 | add r8 = r8,r2 // Add xtime.nsecs |
270 | ;; | ||
271 | shr.u r8 = r8,r23 // shift by factor | ||
272 | cmp4.ne p7,p0 = r28,r10 | 272 | cmp4.ne p7,p0 = r28,r10 |
273 | (p7) br.cond.dpnt.few .time_redo // sequence number changed, redo | 273 | (p7) br.cond.dpnt.few .time_redo // sequence number changed, redo |
274 | // End critical section. | 274 | // End critical section. |
diff --git a/arch/ia64/kernel/fsyscall_gtod_data.h b/arch/ia64/kernel/fsyscall_gtod_data.h index 0914c02a1eb0..cc2861445965 100644 --- a/arch/ia64/kernel/fsyscall_gtod_data.h +++ b/arch/ia64/kernel/fsyscall_gtod_data.h | |||
@@ -6,10 +6,16 @@ | |||
6 | * fsyscall gettimeofday data | 6 | * fsyscall gettimeofday data |
7 | */ | 7 | */ |
8 | 8 | ||
9 | /* like timespec, but includes "shifted nanoseconds" */ | ||
10 | struct time_sn_spec { | ||
11 | u64 sec; | ||
12 | u64 snsec; | ||
13 | }; | ||
14 | |||
9 | struct fsyscall_gtod_data_t { | 15 | struct fsyscall_gtod_data_t { |
10 | seqcount_t seq; | 16 | seqcount_t seq; |
11 | struct timespec wall_time; | 17 | struct time_sn_spec wall_time; |
12 | struct timespec monotonic_time; | 18 | struct time_sn_spec monotonic_time; |
13 | u64 clk_mask; | 19 | u64 clk_mask; |
14 | u32 clk_mult; | 20 | u32 clk_mult; |
15 | u32 clk_shift; | 21 | u32 clk_shift; |
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index aa7be020a904..c6ecb97151a2 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
@@ -430,30 +430,32 @@ void update_vsyscall_tz(void) | |||
430 | { | 430 | { |
431 | } | 431 | } |
432 | 432 | ||
433 | void update_vsyscall_old(struct timespec *wall, struct timespec *wtm, | 433 | void update_vsyscall(struct timekeeper *tk) |
434 | struct clocksource *c, u32 mult, u64 cycle_last) | ||
435 | { | 434 | { |
436 | write_seqcount_begin(&fsyscall_gtod_data.seq); | 435 | write_seqcount_begin(&fsyscall_gtod_data.seq); |
437 | 436 | ||
438 | /* copy fsyscall clock data */ | 437 | /* copy vsyscall data */ |
439 | fsyscall_gtod_data.clk_mask = c->mask; | 438 | fsyscall_gtod_data.clk_mask = tk->tkr_mono.mask; |
440 | fsyscall_gtod_data.clk_mult = mult; | 439 | fsyscall_gtod_data.clk_mult = tk->tkr_mono.mult; |
441 | fsyscall_gtod_data.clk_shift = c->shift; | 440 | fsyscall_gtod_data.clk_shift = tk->tkr_mono.shift; |
442 | fsyscall_gtod_data.clk_fsys_mmio = c->archdata.fsys_mmio; | 441 | fsyscall_gtod_data.clk_fsys_mmio = tk->tkr_mono.clock->archdata.fsys_mmio; |
443 | fsyscall_gtod_data.clk_cycle_last = cycle_last; | 442 | fsyscall_gtod_data.clk_cycle_last = tk->tkr_mono.cycle_last; |
444 | 443 | ||
445 | /* copy kernel time structures */ | 444 | fsyscall_gtod_data.wall_time.sec = tk->xtime_sec; |
446 | fsyscall_gtod_data.wall_time.tv_sec = wall->tv_sec; | 445 | fsyscall_gtod_data.wall_time.snsec = tk->tkr_mono.xtime_nsec; |
447 | fsyscall_gtod_data.wall_time.tv_nsec = wall->tv_nsec; | 446 | |
448 | fsyscall_gtod_data.monotonic_time.tv_sec = wtm->tv_sec | 447 | fsyscall_gtod_data.monotonic_time.sec = tk->xtime_sec |
449 | + wall->tv_sec; | 448 | + tk->wall_to_monotonic.tv_sec; |
450 | fsyscall_gtod_data.monotonic_time.tv_nsec = wtm->tv_nsec | 449 | fsyscall_gtod_data.monotonic_time.snsec = tk->tkr_mono.xtime_nsec |
451 | + wall->tv_nsec; | 450 | + ((u64)tk->wall_to_monotonic.tv_nsec |
451 | << tk->tkr_mono.shift); | ||
452 | 452 | ||
453 | /* normalize */ | 453 | /* normalize */ |
454 | while (fsyscall_gtod_data.monotonic_time.tv_nsec >= NSEC_PER_SEC) { | 454 | while (fsyscall_gtod_data.monotonic_time.snsec >= |
455 | fsyscall_gtod_data.monotonic_time.tv_nsec -= NSEC_PER_SEC; | 455 | (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) { |
456 | fsyscall_gtod_data.monotonic_time.tv_sec++; | 456 | fsyscall_gtod_data.monotonic_time.snsec -= |
457 | ((u64)NSEC_PER_SEC) << tk->tkr_mono.shift; | ||
458 | fsyscall_gtod_data.monotonic_time.sec++; | ||
457 | } | 459 | } |
458 | 460 | ||
459 | write_seqcount_end(&fsyscall_gtod_data.seq); | 461 | write_seqcount_end(&fsyscall_gtod_data.seq); |