From 32ca216b49b2417a102457ce54bdd9bb76d6f02d Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 20 Dec 2013 16:03:12 +0100 Subject: [KERNEL] Improved read timeout handling --- src/config.h | 2 +- src/kernel/net.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/config.h b/src/config.h index 6342222..45593c2 100644 --- a/src/config.h +++ b/src/config.h @@ -82,7 +82,7 @@ #define TIMER_INTERVAL_KEEPALIVE_PACKET 6 // Expect a keepalive response every X seconds -#define SOCKET_KEEPALIVE_TIMEOUT 7 +#define SOCKET_KEEPALIVE_TIMEOUT 8 // Number of unsuccessful alt_server probes before read errors are reported to the block layer // (ALL servers will be probed this many times) diff --git a/src/kernel/net.c b/src/kernel/net.c index 3db8da2..9b0de11 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -911,8 +911,9 @@ int dnbd3_net_receive(void *data) unsigned long irqflags; sigset_t blocked, oldset; uint16_t rid; + unsigned long int recv_timeout = jiffies; - int count, remaining, ret, recv_timeout = 0; + int count, remaining, ret; init_msghdr(msg); set_user_nice(current, -20); @@ -925,8 +926,9 @@ int dnbd3_net_receive(void *data) ret = kernel_recvmsg(dev->sock, &msg, &iov, 1, sizeof(dnbd3_reply), msg.msg_flags); if (ret == -EAGAIN) { - if ((recv_timeout += SOCKET_TIMEOUT_CLIENT_DATA) > SOCKET_KEEPALIVE_TIMEOUT) - error_dev("ERROR: Receive timeout reached."); + if (jiffies < recv_timeout) recv_timeout = jiffies; // Handle overflow + if ((jiffies - recv_timeout) / HZ > SOCKET_KEEPALIVE_TIMEOUT) + error_dev_va("ERROR: Receive timeout reached (%d of %d secs).", (int)((jiffies - recv_timeout) / HZ), (int)SOCKET_KEEPALIVE_TIMEOUT); continue; } if (ret <= 0) @@ -941,7 +943,8 @@ int dnbd3_net_receive(void *data) if (dnbd3_reply.cmd == 0) error_dev("ERROR: Command was 0 (Receive)."); - recv_timeout = 0; + // Update timeout + recv_timeout = jiffies; // what to do? switch (dnbd3_reply.cmd) -- cgit v1.2.3-55-g7522