2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

dpif-linux: Remove poll_fd_woke() optimization from dpif_linux_recv().

This optimization on its own provided about 37% benefit against a
load of a single netperf CRR test, but at the same time it penalized
ovs-benchmark by about 11%.  We can get back the CRR performance
loss, and more, other ways, so the first step is to revert this
patch, temporarily accepting the performance loss.
This commit is contained in:
Ben Pfaff
2011-11-10 15:39:39 -08:00
parent c06bba0130
commit f6d1465cec

View File

@@ -1097,39 +1097,38 @@ dpif_linux_recv(struct dpif *dpif_, struct dpif_upcall *upcall)
for (i = 0; i < N_UPCALL_SOCKS; i++) {
struct nl_sock *upcall_sock;
int dp_ifindex;
dpif->last_read_upcall = (dpif->last_read_upcall + 1) &
(N_UPCALL_SOCKS - 1);
upcall_sock = dpif->upcall_socks[dpif->last_read_upcall];
if (nl_sock_woke(upcall_sock)) {
int dp_ifindex;
for (;;) {
struct ofpbuf *buf;
int error;
for (;;) {
struct ofpbuf *buf;
int error;
if (++read_tries > 50) {
return EAGAIN;
}
if (++read_tries > 50) {
return EAGAIN;
}
error = nl_sock_recv(upcall_sock, &buf, false);
if (error == EAGAIN) {
break;
} else if (error) {
return error;
}
error = nl_sock_recv(upcall_sock, &buf, false);
if (error == EAGAIN) {
break;
} else if (error) {
return error;
}
error = parse_odp_packet(buf, upcall, &dp_ifindex);
if (!error
&& dp_ifindex == dpif->dp_ifindex
&& dpif->listen_mask & (1u << upcall->type)) {
return 0;
}
error = parse_odp_packet(buf, upcall, &dp_ifindex);
if (!error
&& dp_ifindex == dpif->dp_ifindex
&& dpif->listen_mask & (1u << upcall->type)) {
return 0;
}
ofpbuf_delete(buf);
if (error) {
return error;
}
ofpbuf_delete(buf);
if (error) {
return error;
}
}
}