• Julian Wiedmann's avatar
    s390/qeth: fix deadlock during recovery · 0b9902c1
    Julian Wiedmann authored
    When qeth_dev_layer2_store() - holding the discipline_mutex - waits
    inside qeth_l*_remove_device() for a qeth_do_reset() thread to complete,
    we can hit a deadlock if qeth_do_reset() concurrently calls
    qeth_set_online() and thus tries to aquire the discipline_mutex.
    
    Move the discipline_mutex locking outside of qeth_set_online() and
    qeth_set_offline(), and turn the discipline into a parameter so that
    callers understand the dependency.
    
    To fix the deadlock, we can now relax the locking:
    As already established, qeth_l*_remove_device() waits for
    qeth_do_reset() to complete. So qeth_do_reset() itself is under no risk
    of having card->discipline ripped out while it's running, and thus
    doesn't need to take the discipline_mutex.
    
    Fixes: 9dc48ccc ("qeth: serialize sysfs-triggered device configurations")
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
    Reviewed-by: default avatarAlexandra Winter <wintera@linux.ibm.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    0b9902c1
qeth_l2_main.c 63.4 KB