Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d28ede83 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by John Stultz
Browse files

timekeeping: Create struct tk_read_base and use it in struct timekeeper



The members of the new struct are the required ones for the new NMI
safe accessor to clcok monotonic. In order to reuse the existing
timekeeping code and to make the update of the fast NMI safe
timekeepers a simple memcpy use the struct for the timekeeper as well
and convert all users.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
parent 6d3aadf3
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -211,7 +211,7 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
void update_vsyscall(struct timekeeper *tk)
void update_vsyscall(struct timekeeper *tk)
{
{
	struct timespec xtime_coarse;
	struct timespec xtime_coarse;
	u32 use_syscall = strcmp(tk->clock->name, "arch_sys_counter");
	u32 use_syscall = strcmp(tk->tkr.clock->name, "arch_sys_counter");


	++vdso_data->tb_seq_count;
	++vdso_data->tb_seq_count;
	smp_wmb();
	smp_wmb();
@@ -224,11 +224,11 @@ void update_vsyscall(struct timekeeper *tk)
	vdso_data->wtm_clock_nsec		= tk->wall_to_monotonic.tv_nsec;
	vdso_data->wtm_clock_nsec		= tk->wall_to_monotonic.tv_nsec;


	if (!use_syscall) {
	if (!use_syscall) {
		vdso_data->cs_cycle_last	= tk->cycle_last;
		vdso_data->cs_cycle_last	= tk->tkr.cycle_last;
		vdso_data->xtime_clock_sec	= tk->xtime_sec;
		vdso_data->xtime_clock_sec	= tk->xtime_sec;
		vdso_data->xtime_clock_nsec	= tk->xtime_nsec;
		vdso_data->xtime_clock_nsec	= tk->tkr.xtime_nsec;
		vdso_data->cs_mult		= tk->mult;
		vdso_data->cs_mult		= tk->tkr.mult;
		vdso_data->cs_shift		= tk->shift;
		vdso_data->cs_shift		= tk->tkr.shift;
	}
	}


	smp_wmb();
	smp_wmb();
+8 −8
Original line number Original line Diff line number Diff line
@@ -214,26 +214,26 @@ void update_vsyscall(struct timekeeper *tk)
{
{
	u64 nsecps;
	u64 nsecps;


	if (tk->clock != &clocksource_tod)
	if (tk->tkr.clock != &clocksource_tod)
		return;
		return;


	/* Make userspace gettimeofday spin until we're done. */
	/* Make userspace gettimeofday spin until we're done. */
	++vdso_data->tb_update_count;
	++vdso_data->tb_update_count;
	smp_wmb();
	smp_wmb();
	vdso_data->xtime_tod_stamp = tk->cycle_last;
	vdso_data->xtime_tod_stamp = tk->tkr.cycle_last;
	vdso_data->xtime_clock_sec = tk->xtime_sec;
	vdso_data->xtime_clock_sec = tk->xtime_sec;
	vdso_data->xtime_clock_nsec = tk->xtime_nsec;
	vdso_data->xtime_clock_nsec = tk->tkr.xtime_nsec;
	vdso_data->wtom_clock_sec =
	vdso_data->wtom_clock_sec =
		tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
		tk->xtime_sec + tk->wall_to_monotonic.tv_sec;
	vdso_data->wtom_clock_nsec = tk->xtime_nsec +
	vdso_data->wtom_clock_nsec = tk->tkr.xtime_nsec +
		+ ((u64) tk->wall_to_monotonic.tv_nsec << tk->shift);
		+ ((u64) tk->wall_to_monotonic.tv_nsec << tk->tkr.shift);
	nsecps = (u64) NSEC_PER_SEC << tk->shift;
	nsecps = (u64) NSEC_PER_SEC << tk->tkr.shift;
	while (vdso_data->wtom_clock_nsec >= nsecps) {
	while (vdso_data->wtom_clock_nsec >= nsecps) {
		vdso_data->wtom_clock_nsec -= nsecps;
		vdso_data->wtom_clock_nsec -= nsecps;
		vdso_data->wtom_clock_sec++;
		vdso_data->wtom_clock_sec++;
	}
	}
	vdso_data->tk_mult = tk->mult;
	vdso_data->tk_mult = tk->tkr.mult;
	vdso_data->tk_shift = tk->shift;
	vdso_data->tk_shift = tk->tkr.shift;
	smp_wmb();
	smp_wmb();
	++vdso_data->tb_update_count;
	++vdso_data->tb_update_count;
}
}
+5 −5
Original line number Original line Diff line number Diff line
@@ -261,7 +261,7 @@ void update_vsyscall_tz(void)
void update_vsyscall(struct timekeeper *tk)
void update_vsyscall(struct timekeeper *tk)
{
{
	struct timespec *wtm = &tk->wall_to_monotonic;
	struct timespec *wtm = &tk->wall_to_monotonic;
	struct clocksource *clock = tk->clock;
	struct clocksource *clock = tk->tkr.clock;


	if (clock != &cycle_counter_cs)
	if (clock != &cycle_counter_cs)
		return;
		return;
@@ -269,13 +269,13 @@ void update_vsyscall(struct timekeeper *tk)
	/* Userspace gettimeofday will spin while this value is odd. */
	/* Userspace gettimeofday will spin while this value is odd. */
	++vdso_data->tb_update_count;
	++vdso_data->tb_update_count;
	smp_wmb();
	smp_wmb();
	vdso_data->xtime_tod_stamp = tk->cycle_last;
	vdso_data->xtime_tod_stamp = tk->tkr.cycle_last;
	vdso_data->xtime_clock_sec = tk->xtime_sec;
	vdso_data->xtime_clock_sec = tk->xtime_sec;
	vdso_data->xtime_clock_nsec = tk->xtime_nsec;
	vdso_data->xtime_clock_nsec = tk->tkr.xtime_nsec;
	vdso_data->wtom_clock_sec = wtm->tv_sec;
	vdso_data->wtom_clock_sec = wtm->tv_sec;
	vdso_data->wtom_clock_nsec = wtm->tv_nsec;
	vdso_data->wtom_clock_nsec = wtm->tv_nsec;
	vdso_data->mult = tk->mult;
	vdso_data->mult = tk->tkr.mult;
	vdso_data->shift = tk->shift;
	vdso_data->shift = tk->tkr.shift;
	smp_wmb();
	smp_wmb();
	++vdso_data->tb_update_count;
	++vdso_data->tb_update_count;
}
}
+12 −11
Original line number Original line Diff line number Diff line
@@ -31,29 +31,30 @@ void update_vsyscall(struct timekeeper *tk)
	gtod_write_begin(vdata);
	gtod_write_begin(vdata);


	/* copy vsyscall data */
	/* copy vsyscall data */
	vdata->vclock_mode	= tk->clock->archdata.vclock_mode;
	vdata->vclock_mode	= tk->tkr.clock->archdata.vclock_mode;
	vdata->cycle_last	= tk->cycle_last;
	vdata->cycle_last	= tk->tkr.cycle_last;
	vdata->mask		= tk->clock->mask;
	vdata->mask		= tk->tkr.mask;
	vdata->mult		= tk->mult;
	vdata->mult		= tk->tkr.mult;
	vdata->shift		= tk->shift;
	vdata->shift		= tk->tkr.shift;


	vdata->wall_time_sec		= tk->xtime_sec;
	vdata->wall_time_sec		= tk->xtime_sec;
	vdata->wall_time_snsec		= tk->xtime_nsec;
	vdata->wall_time_snsec		= tk->tkr.xtime_nsec;


	vdata->monotonic_time_sec	= tk->xtime_sec
	vdata->monotonic_time_sec	= tk->xtime_sec
					+ tk->wall_to_monotonic.tv_sec;
					+ tk->wall_to_monotonic.tv_sec;
	vdata->monotonic_time_snsec	= tk->xtime_nsec
	vdata->monotonic_time_snsec	= tk->tkr.xtime_nsec
					+ ((u64)tk->wall_to_monotonic.tv_nsec
					+ ((u64)tk->wall_to_monotonic.tv_nsec
						<< tk->shift);
						<< tk->tkr.shift);
	while (vdata->monotonic_time_snsec >=
	while (vdata->monotonic_time_snsec >=
					(((u64)NSEC_PER_SEC) << tk->shift)) {
					(((u64)NSEC_PER_SEC) << tk->tkr.shift)) {
		vdata->monotonic_time_snsec -=
		vdata->monotonic_time_snsec -=
					((u64)NSEC_PER_SEC) << tk->shift;
					((u64)NSEC_PER_SEC) << tk->tkr.shift;
		vdata->monotonic_time_sec++;
		vdata->monotonic_time_sec++;
	}
	}


	vdata->wall_time_coarse_sec	= tk->xtime_sec;
	vdata->wall_time_coarse_sec	= tk->xtime_sec;
	vdata->wall_time_coarse_nsec	= (long)(tk->xtime_nsec >> tk->shift);
	vdata->wall_time_coarse_nsec	= (long)(tk->tkr.xtime_nsec >>
						 tk->tkr.shift);


	vdata->monotonic_time_coarse_sec =
	vdata->monotonic_time_coarse_sec =
		vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
		vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
+7 −7
Original line number Original line Diff line number Diff line
@@ -995,19 +995,19 @@ static void update_pvclock_gtod(struct timekeeper *tk)
	struct pvclock_gtod_data *vdata = &pvclock_gtod_data;
	struct pvclock_gtod_data *vdata = &pvclock_gtod_data;
	u64 boot_ns;
	u64 boot_ns;


	boot_ns = ktime_to_ns(ktime_add(tk->base_mono, tk->offs_boot));
	boot_ns = ktime_to_ns(ktime_add(tk->tkr.base_mono, tk->offs_boot));


	write_seqcount_begin(&vdata->seq);
	write_seqcount_begin(&vdata->seq);


	/* copy pvclock gtod data */
	/* copy pvclock gtod data */
	vdata->clock.vclock_mode	= tk->clock->archdata.vclock_mode;
	vdata->clock.vclock_mode	= tk->tkr.clock->archdata.vclock_mode;
	vdata->clock.cycle_last		= tk->cycle_last;
	vdata->clock.cycle_last		= tk->tkr.cycle_last;
	vdata->clock.mask		= tk->clock->mask;
	vdata->clock.mask		= tk->tkr.mask;
	vdata->clock.mult		= tk->mult;
	vdata->clock.mult		= tk->tkr.mult;
	vdata->clock.shift		= tk->shift;
	vdata->clock.shift		= tk->tkr.shift;


	vdata->boot_ns			= boot_ns;
	vdata->boot_ns			= boot_ns;
	vdata->nsec_base		= tk->xtime_nsec;
	vdata->nsec_base		= tk->tkr.xtime_nsec;


	write_seqcount_end(&vdata->seq);
	write_seqcount_end(&vdata->seq);
}
}
Loading