Re: aarch64 and kqueue timer events

From: Mike Karels <mike_at_karels.net>
Date: Wed, 28 Jul 2021 02:16:14 UTC
On 7/27/21 8:43 PM, Matthew Grooms wrote:
> On 7/24/2021 8:18 PM, Matthew Grooms wrote:
>> Hi all,
>>
>> I'm seeing some strange behavior with kqueue timers on my aarch64 
>> host. Here is a simple test program that I've compiled on both amd64 
>> and aarch64. It just sets up a simple kqueue timer with a loop that 
>> waits for the event to fire every 3 seconds ...
>>
>> #include <err.h>
>> #include <time.h>
>> #include <stdio.h>
>> #include <unistd.h>
>> #include <sys/event.h>
>>
>> int main( int argc, char *argv[] )
>> {
>>     int kq = kqueue();
>>     if( kq < 0 )
>>         err( 1, "failed to obtain kqueue handle" );
>>
>>     struct kevent ke;
>>     EV_SET( &ke, 1, EVFILT_TIMER, EV_ADD | EV_ENABLE, 0, 3000, 0 );
>>     if( kevent( kq, &ke, 1, NULL, 0, NULL ) < 0 )
>>         err( 1, "failed to add kevent timer filter" );
>>
>>     printf( "started at %i\n", (int)time(NULL) );
>>
>>     while( true )
>>     {
>>         int r = kevent( kq, NULL, 0, &ke, 1, NULL );
>>         if( r < 0 )
>>             err( 1, "failed to read kevent list" );
>>
>>         printf( "timer fired %i times at %i\n", r, (int)time(NULL) );
>>     }
>>
>>     return 0;
>> }
>>
>> When I compile and run the code on an amd64 host, everything works as 
>> expected. The event timer expires once every 3 seconds ...
>>
>> mgrooms@amd64:~/devel$ cc test.cpp -o test && ./test
>> started at 1627175311
>> timer fired 1 times at 1627175314
>> timer fired 1 times at 1627175317
>> timer fired 1 times at 1627175320
>> Thanks in advance,
>>
>> -Matthew
>>
>>
>>
>> However, when I compile and run the same code on an aarch64 host ( 
>> rpi4b ), something very different happens. The event timer expires 
>> after 3 seconds the first time. But each subsequent expiration is for 
>> exactly twice the defined interval, 6 seconds ...
>>
>> mgrooms@aarch64:~/devel$ cc test.cpp -o test && ./test
>> started at 1625789207
>> timer fired 1 times at 1625789210
>> timer fired 1 times at 1625789216
>> timer fired 1 times at 1625789222
>>
>> Any idea what's going on here? Seems like a bug somewhere on the arm 
>> side.
>>
>> Thanks in advance,
>>
> Hi Everyone,
>
> Sorry for the cross post. I started by asking this question in 
> freebsd-arm but didn't get a response. I figured, since aarch64 is 
> Tier1 now, asking wrt stable is fair game. Another user ( José Pérez ) 
> confirmed that this issue was also present on current but my testing 
> was on 13 ...
>
> FreeBSD generic 13.0-STABLE FreeBSD 13.0-STABLE #8 
> stable/13-n246015-ade8b810b02-dirty: Tue Jun 15 21:04:38 CDT 202
>
> Any help would be greatly appreciated.

Another data point: the program runs correctly on 13.0-RELEASE-p3 on rpi4b.

         Mike