• Sergey Ryazanov's avatar
    usb: cdc-wdm: fix reading stuck on device close · 01e01f5c
    Sergey Ryazanov authored
    cdc-wdm tracks whether a response reading request is in-progress and
    blocks the next request from being sent until the previous request is
    completed. As soon as last user closes the cdc-wdm device file, the
    driver cancels any ongoing requests, resets the pending response
    counter, but leaves the response reading in-progress flag
    (WDM_RESPONDING) untouched.
    
    So if the user closes the device file during the response receive
    request is being performed, no more data will be obtained from the
    modem. The request will be cancelled, effectively preventing the
    WDM_RESPONDING flag from being reseted. Keeping the flag set will
    prevent a new response receive request from being sent, permanently
    blocking the read path. The read path will staying blocked until the
    module will be reloaded or till the modem will be re-attached.
    
    This stuck has been observed with a Huawei E3372 modem attached to an
    OpenWrt router and using the comgt utility to set up a network
    connection.
    
    Fix this issue by clearing the WDM_RESPONDING flag on the device file
    close.
    
    Without this fix, the device reading stuck can be easily reproduced in a
    few connection establishing attempts. With this fix, a load test for
    modem connection re-establishing worked for several hours without any
    issues.
    
    Fixes: 922a5ead ("usb: cdc-wdm: Fix race between autosuspend and reading from the device")
    Signed-off-by: default avatarSergey Ryazanov <ryazanov.s.a@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Acked-by: default avatarOliver Neukum <oneukum@suse.com>
    Link: https://lore.kernel.org/r/20220501175828.8185-1-ryazanov.s.a@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    01e01f5c
cdc-wdm.c 32.8 KB