aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-11-13 15:15:40 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-13 15:15:40 -0500
commitf08d8bcc12de5a153e587027e77de83662eefb8a (patch)
tree301fedc4a3ba056db2699b471f4cb69edc2151d3
parentf3573b8f902c507c721999cc669fbb7e045081b8 (diff)
parentd4d1fc61eb38ff8e5af657e2d2f2290859a277f2 (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/Kconfig2
-rw-r--r--arch/ia64/kernel/asm-offsets.c2
-rw-r--r--arch/ia64/kernel/fsys.S8
-rw-r--r--arch/ia64/kernel/fsyscall_gtod_data.h10
-rw-r--r--arch/ia64/kernel/time.c40
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" */
10struct time_sn_spec {
11 u64 sec;
12 u64 snsec;
13};
14
9struct fsyscall_gtod_data_t { 15struct 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
433void update_vsyscall_old(struct timespec *wall, struct timespec *wtm, 433void 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);