• Oleg Nesterov's avatar
    selftests/timers/posix_timers: Reimplement check_timer_distribution() · 6d029c25
    Oleg Nesterov authored
    check_timer_distribution() runs ten threads in a busy loop and tries to
    test that the kernel distributes a process posix CPU timer signal to every
    thread over time.
    
    There is not guarantee that this is true even after commit bcb7ee79
    ("posix-timers: Prefer delivery of signals to the current thread") because
    that commit only avoids waking up the sleeping process leader thread, but
    that has nothing to do with the actual signal delivery.
    
    As the signal is process wide the first thread which observes sigpending
    and wins the race to lock sighand will deliver the signal. Testing shows
    that this hangs on a regular base because some threads never win the race.
    
    The comment "This primarily tests that the kernel does not favour any one."
    is wrong. The kernel does favour a thread which hits the timer interrupt
    when CLOCK_PROCESS_CPUTIME_ID expires.
    
    Rewrite the test so it only checks that the group leader sleeping in join()
    never receives SIGALRM and the thread which burns CPU cycles receives all
    signals.
    
    In older kernels which do not have commit bcb7ee79 ("posix-timers:
    Prefer delivery of signals to the current thread") the test-case fails
    immediately, the very 1st tick wakes the leader up. Otherwise it quickly
    succeeds after 100 ticks.
    
    CI testing wants to use newer selftest versions on stable kernels. In this
    case the test is guaranteed to fail.
    
    So check in the failure case whether the kernel version is less than v6.3
    and skip the test result in that case.
    
    [ tglx: Massaged change log, renamed the version check helper ]
    
    Fixes: e797203f ("selftests/timers/posix_timers: Test delivery of signals across threads")
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20240409133802.GD29396@redhat.com
    6d029c25
kselftest.h 9.75 KB