mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 14:25:26 +00:00
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 <blp@nicira.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user