mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
staging: usbip: vhci: handle EAGAIN from SO_RCVTIMEO
If there is a receive timeout without any active requests, we can tell the connection was idle and ignore the timeout. If there are active requests for which we expect to receive a reply we close the connection. This makes it possible to set an upper bound on the time a usbip device may be unresponsive. This is a workaround for the lack of heart-beat messages in the USBIP protocol. Extending the protocol would break compatibility with all previous stub versions, so this seems like the lesser evil. Signed-off-by: Max Vozeler <max@vozeler.com> Tested-by: Mark Wehby <MWehby@luxotticaRetail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
7e249c8b07
commit
bd65f6233f
@ -193,6 +193,19 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
|
||||
return;
|
||||
}
|
||||
|
||||
static int vhci_priv_tx_empty(struct vhci_device *vdev)
|
||||
{
|
||||
int empty = 0;
|
||||
|
||||
spin_lock(&vdev->priv_lock);
|
||||
|
||||
empty = list_empty(&vdev->priv_rx);
|
||||
|
||||
spin_unlock(&vdev->priv_lock);
|
||||
|
||||
return empty;
|
||||
}
|
||||
|
||||
/* recv a pdu */
|
||||
static void vhci_rx_pdu(struct usbip_device *ud)
|
||||
{
|
||||
@ -210,8 +223,14 @@ static void vhci_rx_pdu(struct usbip_device *ud)
|
||||
if (ret < 0) {
|
||||
if (ret == -ECONNRESET)
|
||||
usbip_uinfo("connection reset by peer\n");
|
||||
else if (ret != -ERESTARTSYS)
|
||||
else if (ret == -EAGAIN) {
|
||||
/* ignore if connection was idle */
|
||||
if (vhci_priv_tx_empty(vdev))
|
||||
return;
|
||||
usbip_uinfo("connection timed out with pending urbs\n");
|
||||
} else if (ret != -ERESTARTSYS)
|
||||
usbip_uinfo("xmit failed %d\n", ret);
|
||||
|
||||
usbip_event_add(ud, VDEV_EVENT_ERROR_TCP);
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user