• Stefan Raspl's avatar
    qeth: fix deadlock between recovery and bonding driver · 2efaf5ff
    Stefan Raspl authored
    The recovery thread, when failing, tears down the respective interface. To do
    so, it needs to obtain the rtnl lock first, as the interface configuration is
    changed.
    If another process tries to modify an interface setting at the same time, that
    process can obtain the rtnl lock first, but the respective callback in the qeth
    driver will block until recovery has completed - which cannot happen since the
    calling process already obtained it.
    In one particular case, the bonding driver acquired the rtnl lock to modify the
    card's MAC address, while the recovery failed at the same time due to the card
    being removed. Hence qeth_l2_set_mac_address (implicitly holding the rtnl lock)
    was waiting on qeth_l2_recover, which deadlocked when waiting on the rtnl lock.
    This patch uses rtnl_trylock instead of rtnl_lock in the recovery thread. If the
    lock cannot be obtained, the interface will be left up, but the card state
    remains in CARD_STATE_RECOVER, which will prevent any further activities on the
    card.
    Signed-off-by: default avatarStefan Raspl <raspl@linux.vnet.ibm.com>
    Signed-off-by: default avatarFrank Blaschka <frank.blaschka@de.ibm.com>
    Reviewed-by: default avatarUrsula Braun <ursula.braun@de.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2efaf5ff
qeth_l2_main.c 35.1 KB