• Niklas Söderlund's avatar
    samples/bpf, xdpsock: Fix race when running for fix duration of time · 8fa42d78
    Niklas Söderlund authored
    When running xdpsock for a fix duration of time before terminating
    using --duration=<n>, there is a race condition that may cause xdpsock
    to terminate immediately.
    
    When running for a fixed duration of time the check to determine when to
    terminate execution is in is_benchmark_done() and is being executed in
    the context of the poller thread,
    
        if (opt_duration > 0) {
                unsigned long dt = (get_nsecs() - start_time);
    
                if (dt >= opt_duration)
                        benchmark_done = true;
        }
    
    However start_time is only set after the poller thread have been
    created. This leaves a small window when the poller thread is starting
    and calls is_benchmark_done() for the first time that start_time is not
    yet set. In that case start_time have its initial value of 0 and the
    duration check fails as it do not correlate correctly for the
    applications start time and immediately sets benchmark_done which in
    turn terminates the xdpsock application.
    
    Fix this by setting start_time before creating the poller thread.
    
    Fixes: d3f11b01 ("samples/bpf: xdpsock: Add duration option to specify how long to run")
    Signed-off-by: default avatarNiklas Söderlund <niklas.soderlund@corigine.com>
    Signed-off-by: default avatarSimon Horman <simon.horman@corigine.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20220315102948.466436-1-niklas.soderlund@corigine.com
    8fa42d78
xdpsock_user.c 50.9 KB