Loading include/linux/time.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void) extern void read_persistent_clock(struct timespec *ts); extern void read_persistent_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts); extern int persistent_clock_is_local; extern int update_persistent_clock(struct timespec now); extern int update_persistent_clock(struct timespec now); void timekeeping_init(void); void timekeeping_init(void); extern int timekeeping_suspended; extern int timekeeping_suspended; Loading kernel/time.c +8 −0 Original line number Original line Diff line number Diff line Loading @@ -114,6 +114,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, return 0; return 0; } } /* * Indicates if there is an offset between the system clock and the hardware * clock/persistent clock/rtc. */ int persistent_clock_is_local; /* /* * Adjust the time obtained from the CMOS to be UTC time instead of * Adjust the time obtained from the CMOS to be UTC time instead of * local time. * local time. Loading @@ -135,6 +141,8 @@ static inline void warp_clock(void) struct timespec adjust; struct timespec adjust; adjust = current_kernel_time(); adjust = current_kernel_time(); if (sys_tz.tz_minuteswest != 0) persistent_clock_is_local = 1; adjust.tv_sec += sys_tz.tz_minuteswest * 60; adjust.tv_sec += sys_tz.tz_minuteswest * 60; do_settimeofday(&adjust); do_settimeofday(&adjust); } } Loading kernel/time/ntp.c +6 −2 Original line number Original line Diff line number Diff line Loading @@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work) getnstimeofday(&now); getnstimeofday(&now); if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { struct timespec adjust = now; fail = -ENODEV; fail = -ENODEV; if (persistent_clock_is_local) adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); #ifdef CONFIG_GENERIC_CMOS_UPDATE #ifdef CONFIG_GENERIC_CMOS_UPDATE fail = update_persistent_clock(now); fail = update_persistent_clock(adjust); #endif #endif #ifdef CONFIG_RTC_SYSTOHC #ifdef CONFIG_RTC_SYSTOHC if (fail == -ENODEV) if (fail == -ENODEV) fail = rtc_set_ntp_time(now); fail = rtc_set_ntp_time(adjust); #endif #endif } } Loading Loading
include/linux/time.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void) extern void read_persistent_clock(struct timespec *ts); extern void read_persistent_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts); extern int persistent_clock_is_local; extern int update_persistent_clock(struct timespec now); extern int update_persistent_clock(struct timespec now); void timekeeping_init(void); void timekeeping_init(void); extern int timekeeping_suspended; extern int timekeeping_suspended; Loading
kernel/time.c +8 −0 Original line number Original line Diff line number Diff line Loading @@ -114,6 +114,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, return 0; return 0; } } /* * Indicates if there is an offset between the system clock and the hardware * clock/persistent clock/rtc. */ int persistent_clock_is_local; /* /* * Adjust the time obtained from the CMOS to be UTC time instead of * Adjust the time obtained from the CMOS to be UTC time instead of * local time. * local time. Loading @@ -135,6 +141,8 @@ static inline void warp_clock(void) struct timespec adjust; struct timespec adjust; adjust = current_kernel_time(); adjust = current_kernel_time(); if (sys_tz.tz_minuteswest != 0) persistent_clock_is_local = 1; adjust.tv_sec += sys_tz.tz_minuteswest * 60; adjust.tv_sec += sys_tz.tz_minuteswest * 60; do_settimeofday(&adjust); do_settimeofday(&adjust); } } Loading
kernel/time/ntp.c +6 −2 Original line number Original line Diff line number Diff line Loading @@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work) getnstimeofday(&now); getnstimeofday(&now); if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) { struct timespec adjust = now; fail = -ENODEV; fail = -ENODEV; if (persistent_clock_is_local) adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); #ifdef CONFIG_GENERIC_CMOS_UPDATE #ifdef CONFIG_GENERIC_CMOS_UPDATE fail = update_persistent_clock(now); fail = update_persistent_clock(adjust); #endif #endif #ifdef CONFIG_RTC_SYSTOHC #ifdef CONFIG_RTC_SYSTOHC if (fail == -ENODEV) if (fail == -ENODEV) fail = rtc_set_ntp_time(now); fail = rtc_set_ntp_time(adjust); #endif #endif } } Loading