|
|
e293be |
commit ade1bdffe90e59cd257cb9bd4f5abe4de5f14911
|
|
|
e293be |
Author: Arnd Bergmann <arnd@arndb.de>
|
|
|
e293be |
Date: Mon Sep 28 22:21:31 2015 +0200
|
|
|
e293be |
|
|
|
e293be |
ntp/pps: use y2038 safe types in pps_event_time
|
|
|
e293be |
|
|
|
e293be |
The pps_event_time uses two 'timespec' structures internally, which
|
|
|
e293be |
suffer from the y2038 problem. The uses of this structure are
|
|
|
e293be |
fairly self-contained in the pps code, so this replaces them all at
|
|
|
e293be |
once.
|
|
|
e293be |
|
|
|
e293be |
Unfortunately, this includes the sfc ethernet driver aside from the
|
|
|
e293be |
pps subsystem, so we change that one as well. Both touch the
|
|
|
e293be |
same data structure, and there probably is no good way to split
|
|
|
e293be |
the patch into smaller units.
|
|
|
e293be |
|
|
|
e293be |
Acked-by: Richard Cochran <richardcochran@gmail.com>
|
|
|
e293be |
Acked-by: David S. Miller <davem@davemloft.net>
|
|
|
e293be |
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
|
|
|
e293be |
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
|
|
e293be |
Signed-off-by: John Stultz <john.stultz@linaro.org>
|
|
|
e293be |
|
|
|
e293be |
Ported to kernel-3.10.0-862.el7 by T.Kabe
|
|
|
e293be |
diff -up ./drivers/net/ethernet/sfc/ptp.c.pps ./drivers/net/ethernet/sfc/ptp.c
|
|
|
e293be |
--- ./drivers/net/ethernet/sfc/ptp.c.pps 2018-03-22 06:40:12.000000000 +0900
|
|
|
e293be |
+++ ./drivers/net/ethernet/sfc/ptp.c 2018-04-18 17:22:49.000000000 +0900
|
|
|
e293be |
@@ -646,26 +646,26 @@ static void efx_ptp_send_times(struct ef
|
|
|
e293be |
struct pps_event_time *last_time)
|
|
|
e293be |
{
|
|
|
e293be |
struct pps_event_time now;
|
|
|
e293be |
- struct timespec limit;
|
|
|
e293be |
+ struct timespec64 limit;
|
|
|
e293be |
struct efx_ptp_data *ptp = efx->ptp_data;
|
|
|
e293be |
int *mc_running = ptp->start.addr;
|
|
|
e293be |
|
|
|
e293be |
pps_get_ts(&now;;
|
|
|
e293be |
limit = now.ts_real;
|
|
|
e293be |
- timespec_add_ns(&limit, SYNCHRONISE_PERIOD_NS);
|
|
|
e293be |
+ timespec64_add_ns(&limit, SYNCHRONISE_PERIOD_NS);
|
|
|
e293be |
|
|
|
e293be |
/* Write host time for specified period or until MC is done */
|
|
|
e293be |
- while ((timespec_compare(&now.ts_real, &limit) < 0) &&
|
|
|
e293be |
+ while ((timespec64_compare(&now.ts_real, &limit) < 0) &&
|
|
|
e293be |
ACCESS_ONCE(*mc_running)) {
|
|
|
e293be |
- struct timespec update_time;
|
|
|
e293be |
+ struct timespec64 update_time;
|
|
|
e293be |
unsigned int host_time;
|
|
|
e293be |
|
|
|
e293be |
/* Don't update continuously to avoid saturating the PCIe bus */
|
|
|
e293be |
update_time = now.ts_real;
|
|
|
e293be |
- timespec_add_ns(&update_time, SYNCHRONISATION_GRANULARITY_NS);
|
|
|
e293be |
+ timespec64_add_ns(&update_time, SYNCHRONISATION_GRANULARITY_NS);
|
|
|
e293be |
do {
|
|
|
e293be |
pps_get_ts(&now;;
|
|
|
e293be |
- } while ((timespec_compare(&now.ts_real, &update_time) < 0) &&
|
|
|
e293be |
+ } while ((timespec64_compare(&now.ts_real, &update_time) < 0) &&
|
|
|
e293be |
ACCESS_ONCE(*mc_running));
|
|
|
e293be |
|
|
|
e293be |
/* Synchronise NIC with single word of time only */
|
|
|
e293be |
@@ -721,7 +721,7 @@ efx_ptp_process_times(struct efx_nic *ef
|
|
|
e293be |
struct efx_ptp_data *ptp = efx->ptp_data;
|
|
|
e293be |
u32 last_sec;
|
|
|
e293be |
u32 start_sec;
|
|
|
e293be |
- struct timespec delta;
|
|
|
e293be |
+ struct timespec64 delta;
|
|
|
e293be |
ktime_t mc_time;
|
|
|
e293be |
|
|
|
e293be |
if (number_readings == 0)
|
|
|
e293be |
diff -up ./drivers/pps/kapi.c.pps ./drivers/pps/kapi.c
|
|
|
e293be |
--- ./drivers/pps/kapi.c.pps 2018-03-22 06:40:12.000000000 +0900
|
|
|
e293be |
+++ ./drivers/pps/kapi.c 2018-04-18 17:13:42.000000000 +0900
|
|
|
e293be |
@@ -179,8 +179,8 @@ void pps_event(struct pps_device *pps, s
|
|
|
e293be |
/* check event type */
|
|
|
e293be |
BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0);
|
|
|
e293be |
|
|
|
e293be |
- dev_dbg(pps->dev, "PPS event at %ld.%09ld\n",
|
|
|
e293be |
- ts->ts_real.tv_sec, ts->ts_real.tv_nsec);
|
|
|
e293be |
+ dev_dbg(pps->dev, "PPS event at %lld.%09ld\n",
|
|
|
e293be |
+ (s64)ts->ts_real.tv_sec, ts->ts_real.tv_nsec);
|
|
|
e293be |
|
|
|
e293be |
timespec_to_pps_ktime(&ts_real, ts->ts_real);
|
|
|
e293be |
|
|
|
e293be |
diff -up ./include/linux/pps_kernel.h.pps ./include/linux/pps_kernel.h
|
|
|
e293be |
--- ./include/linux/pps_kernel.h.pps 2018-04-15 20:28:44.000000000 +0900
|
|
|
e293be |
+++ ./include/linux/pps_kernel.h 2018-04-18 17:19:29.000000000 +0900
|
|
|
e293be |
@@ -48,9 +48,9 @@ struct pps_source_info {
|
|
|
e293be |
|
|
|
e293be |
struct pps_event_time {
|
|
|
e293be |
#ifdef CONFIG_NTP_PPS
|
|
|
e293be |
- struct timespec ts_raw;
|
|
|
e293be |
+ struct timespec64 ts_raw;
|
|
|
e293be |
#endif /* CONFIG_NTP_PPS */
|
|
|
e293be |
- struct timespec ts_real;
|
|
|
e293be |
+ struct timespec64 ts_real;
|
|
|
e293be |
};
|
|
|
e293be |
|
|
|
e293be |
/* The main struct */
|
|
|
e293be |
@@ -105,7 +105,7 @@ extern void pps_event(struct pps_device
|
|
|
e293be |
struct pps_device *pps_lookup_dev(void const *cookie);
|
|
|
e293be |
|
|
|
e293be |
static inline void timespec_to_pps_ktime(struct pps_ktime *kt,
|
|
|
e293be |
- struct timespec ts)
|
|
|
e293be |
+ struct timespec64 ts)
|
|
|
e293be |
{
|
|
|
e293be |
kt->sec = ts.tv_sec;
|
|
|
e293be |
kt->nsec = ts.tv_nsec;
|
|
|
e293be |
@@ -115,25 +115,18 @@ static inline void pps_get_ts(struct pps
|
|
|
e293be |
{
|
|
|
e293be |
struct system_time_snapshot snap;
|
|
|
e293be |
ktime_get_snapshot(&snap);
|
|
|
e293be |
-#if defined CONFIG_X86_64
|
|
|
e293be |
ts->ts_real = ktime_to_timespec64(snap.real);
|
|
|
e293be |
#ifdef CONFIG_NTP_PPS
|
|
|
e293be |
ts->ts_raw = ktime_to_timespec64(snap.raw);
|
|
|
e293be |
#endif
|
|
|
e293be |
-#else
|
|
|
e293be |
- ts->ts_real = ktime_to_timespec(snap.real);
|
|
|
e293be |
-#ifdef CONFIG_NTP_PPS
|
|
|
e293be |
- ts->ts_raw = ktime_to_timespec(snap.raw);
|
|
|
e293be |
-#endif
|
|
|
e293be |
-#endif
|
|
|
e293be |
}
|
|
|
e293be |
|
|
|
e293be |
/* Subtract known time delay from PPS event time(s) */
|
|
|
e293be |
-static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec delta)
|
|
|
e293be |
+static inline void pps_sub_ts(struct pps_event_time *ts, struct timespec64 delta)
|
|
|
e293be |
{
|
|
|
e293be |
- ts->ts_real = timespec_sub(ts->ts_real, delta);
|
|
|
e293be |
+ ts->ts_real = timespec64_sub(ts->ts_real, delta);
|
|
|
e293be |
#ifdef CONFIG_NTP_PPS
|
|
|
e293be |
- ts->ts_raw = timespec_sub(ts->ts_raw, delta);
|
|
|
e293be |
+ ts->ts_raw = timespec64_sub(ts->ts_raw, delta);
|
|
|
e293be |
#endif
|
|
|
e293be |
}
|
|
|
e293be |
|