From: Ben Pfaff Date: Wed, 23 May 2012 21:56:20 +0000 (-0700) Subject: dpif-linux: Avoid pessimal behavior when kernel-to-user buffers overflow. X-Git-Tag: sliver-openvswitch-1.8.90-0~48^2~394 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=e222833e3915daacf8e22d97290a6e901206a405 dpif-linux: Avoid pessimal behavior when kernel-to-user buffers overflow. When a kernel-to-user Netlink buffer overflows, the kernel reports ENOBUFS without passing along an actual message. When it does this, we should immediately try again, because we know that there is a message waiting, instead of reporting the error to the caller. This improves the OVS response rate to "hping3 --flood" traffic by a few percentage points in my testing. Signed-off-by: Ben Pfaff --- diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 256c9d6cc..9d84edd09 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -150,6 +150,7 @@ struct dpif_linux { }; static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(9999, 5); +static struct vlog_rate_limit enobufs_rl = VLOG_RATE_LIMIT_INIT(60, 5); /* Generic Netlink family numbers for OVS. */ static int ovs_datapath_family; @@ -1138,6 +1139,15 @@ dpif_linux_recv(struct dpif *dpif_, struct dpif_upcall *upcall, error = nl_sock_recv(upcall_sock, buf, false); if (error) { + if (error == ENOBUFS) { + /* ENOBUFS typically means that we've received so many + * packets that the buffer overflowed. Try again + * immediately because there's almost certainly a packet + * waiting for us. */ + VLOG_ERR_RL(&enobufs_rl, "%s: lost packet with hash %d", + dpif_name(dpif_), dpif->ready_mask); + continue; + } if (error == EAGAIN) { break; }