Skip to content
  • Michael Grzeschik's avatar
    usb: gadget: u_ether: fix kworker 100% CPU issue with still used interfaces in eth_stop · b1b552a6
    Michael Grzeschik authored
    This patch fixes an issue introduced by patch:
    
        72c973dd
    
     usb: gadget: add usb_endpoint_descriptor to struct usb_ep
    
    Without this patch we see a kworker taking 100% CPU, after this sequence:
    
    - Connect gadget to a windows host
    - load g_ether
    - ifconfig up <ip>; ifconfig down; ifconfig up
    - ping <windows host>
    
    The "ifconfig down" results in calling eth_stop(), which will call
    usb_ep_disable() and, if the carrier is still ok, usb_ep_enable():
    
             usb_ep_disable(link->in_ep);
             usb_ep_disable(link->out_ep);
             if (netif_carrier_ok(net)) {
                     usb_ep_enable(link->in_ep);
                     usb_ep_enable(link->out_ep);
             }
    
    The ep should stay enabled, but will not, as ep_disable set the desc
    pointer to NULL, therefore the subsequent ep_enable will fail. This leads
    to permanent rescheduling of the eth_work() worker as usb_ep_queue()
    (called by the worker) will fail due to the unconfigured endpoint.
    
    We fix this issue by saving the ep descriptors and re-assign them before
    usb_ep_enable().
    
    Cc: Tatyana Brokhman <tlinder@codeaurora.org>
    Signed-off-by: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b1b552a6