On Tue, Feb 26, 2019 at 9:36 PM Jakub Drnec <jay...@email.cz> wrote: > > Hi all, > > I think I observed a potential problem, is this the correct place to report > it? (CC me, not on list) > > [1.] One line summary: monotonic clock can be made to decrease on ppc64 > [2.] Full description: > Setting the realtime clock can sometimes make the monotonic clock go back by > over a hundred years. > Decreasing the realtime clock across the y2k38 threshold is one reliable way > to reproduce. > Allegedly this can also happen just by running ntpd, I have not managed to > reproduce that other > than booting with rtc at >2038 and then running ntp.
Isn't it the expected behavior. Here is what I see for powermac: $ git show 22db552b50fa ... This changes the logic to cast to an unsigned 32-bit number first for the Macintosh time and then convert that to the Unix time, which then gives us a time in the documented 1904..2040 year range. I decided not to use the longer 1970..2106 range that other drivers use, for consistency with the literal interpretation of the register, but that could be easily changed if we decide we want to support any Mac after 2040. ... > When this happens, anything with timers (e.g. openjdk) breaks rather badly. > > [3.] Keywords: gettimeofday, ppc64, vdso > [4.] Kernel information > [4.1.] Kernel version: any (tested on 4.19) > [4.2.] Kernel .config file: any > [5.] Most recent kernel version which did not have the bug: not a regression > [6.] Output of Oops..: not applicable > [7.] Example program which triggers the problem > --- testcase.c > #include <stdio.h> > #include <time.h> > #include <stdlib.h> > #include <unistd.h> > > long get_time() { > struct timespec tp; > if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) { > perror("clock_gettime failed"); > exit(1); > } > long result = tp.tv_sec + tp.tv_nsec / 1000000000; > return result; > } > > int main() { > printf("monitoring monotonic clock...\n"); > long last = get_time(); > while(1) { > long now = get_time(); > if (now < last) { > printf("clock went backwards by %ld seconds!\n", > last - now); > } > last = now; > sleep(1); > } > return 0; > } > --- > when running > # date -s 2040-1-1 > # date -s 2037-1-1 > program outputs: clock went backwards by 4294967295 seconds! > > [8.] Environment: any ppc64, currently reproducing on qemu-system-ppc64le > running debian unstable > [X.] Other notes, patches, fixes, workarounds: > The problem seems to be in vDSO code in > arch/powerpc/kernel/vdso64/gettimeofday.S. > (possibly because some values used in the calculation are only 32 bit?) > Slightly silly workaround: > nuke the "cmpwi cr1,r3,CLOCK_MONOTONIC" in __kernel_clock_gettime > Now it always goes through the syscall fallback which does not have the same > problem. > > Regards, > Jakub Drnec