Skip to content

Commit

Permalink
dpif-linux: Avoid pessimal behavior when kernel-to-user buffers overf…
Browse files Browse the repository at this point in the history
…low.

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 <[email protected]>
  • Loading branch information
blp committed Jun 1, 2012
1 parent cf1b8a9 commit e222833
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions lib/dpif-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit e222833

Please sign in to comment.