• Jack Morgenstein's avatar
    net/mlx4_core: Fix deadlock when switching between polling and event fw commands · 95f76fb6
    Jack Morgenstein authored
    commit a7e1f049 upstream.
    
    When switching from polling-based fw commands to event-based fw
    commands, there is a race condition which could cause a fw command
    in another task to hang: that task will keep waiting for the polling
    sempahore, but may never be able to acquire it. This is due to
    mlx4_cmd_use_events, which "down"s the sempahore back to 0.
    
    During driver initialization, this is not a problem, since no other
    tasks which invoke FW commands are active.
    
    However, there is a problem if the driver switches to polling mode
    and then back to event mode during normal operation.
    
    The "test_interrupts" feature does exactly that.
    Running "ethtool -t <eth device> offline" causes the PF driver to
    temporarily switch to polling mode, and then back to event mode.
    (Note that for VF drivers, such switching is not performed).
    
    Fix this by adding a read-write semaphore for protection when
    switching between modes.
    
    Fixes: 225c7b1f ("IB/mlx4: Add a driver Mellanox ConnectX InfiniBand adapters")
    Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
    Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    [bwh: Backported to 3.16: adjust context, indentation]
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    95f76fb6
mlx4.h 36.1 KB