• Ben Hutchings's avatar
    sfc: Do not use efx_process_channel_now() in online self-test · d4fabcc8
    Ben Hutchings authored
    During self-tests we use efx_process_channel_now() to handle
    completion and other events synchronously.  This disables interrupts
    and NAPI processing for the channel in question, but it may still be
    interrupted by another channel.  A single socket may receive packets
    from multiple net devices or even multiple channels of the same net
    device, so this can result in deadlock on a socket lock.
    
    Receiving packets in process context will also result in incorrect
    classification by the network cgroup classifier.
    
    Therefore, we must only use efx_process_channel_now() in the offline
    loopback tests (which never deliver packets up the stack) and not for
    the online interrupt and event tests.
    
    For the interrupt test, there is no reason to process events.  We
    only care that an interrupt is raised.
    
    For the event test, we want to know whether events have been received,
    and there may be many events ahead of the one we inject.  Therefore
    remove efx_channel::magic_count and instead test whether
    efx_channel::eventq_read_ptr advances.  This is currently an event
    queue index and might wrap around to exactly the same value, resulting
    in a false negative.  Therefore move the masking to efx_event() and
    efx_nic_eventq_read_ack() so that it cannot wrap within the time of
    the test.
    
    The event test also tries to diagnose failures by checking whether an
    event was delivered without causing an interrupt.  Add and use a
    helper function that only does this.
    Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
    d4fabcc8
selftest.c 20.8 KB