Re: [PATCH] FS: timerfd: Fix unexpected return value of timerfd_read function.

From: Arul Jeniston
Date: Thu Sep 05 2019 - 04:48:33 EST


hi Tglx,

When we adjust the date setting using date command we observed
'timerfd_read()' on CLOCK_REALTIME (TFD_TIMER_ABSTIME flag is set)
returns 0.
we don't see any hardware influence here and we are able to recreate
it consistently. Is it expected? if yes, isn't it something to be
documented in timerfd read() man page?

Steps followed to make timerfd read to return 0.

1. run the following script in background to move the date front and back

root@sonic:~/test/exp2# cat ./clock_change_test.sh
while [ 1 ]
do
date --set="04 sep 2019 09:50:21" > /dev/null
date --set="04 sep 2019 09:58:21" > /dev/null
done

root@sonic:~/test/exp2# ./clock_change_test.sh

2. Execute the following program to do read on CLOCK_REALTIME timer.

root@sonic:~/test/exp2# cat timerfdtest.c
#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/epoll.h>
#include <sys/timerfd.h>

int main()
{
int tfd;
struct itimerspec ts;
tfd = timerfd_create(CLOCK_REALTIME, 0);
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 10;
ts.it_value.tv_sec = 10;
ts.it_value.tv_nsec = 1000;
if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &ts, NULL) < 0) {
return EXIT_FAILURE;
}

while(1) {
uint64_t noftimeo;
if (read(tfd, &noftimeo, sizeof(noftimeo)) == 0) {
printf("read returned 0 nooftimeo:%d\n", noftimeo);
}
}
/* not reached */
return EXIT_SUCCESS;
}

3. Observed the following read failure logs within few minutes.
root@sonic:~/test/exp2# ./timerfdtest
read returned 0 nooftimeo:1392


Regards,
Arul


On Tue, Aug 20, 2019 at 3:12 PM Arul Jeniston <arul.jeniston@xxxxxxxxx> wrote:
>
> Hi Tglx,
>
> > Can you please boot something more recent - at least 4.19 LTS - on that
> > machine and let it run for a couple of days to check whether there are 'TSC
> > ADJUST' related entries in dmesg?
>
> Sure. Would check and update.
>
> Regards,
> Arul