dpif-linux: Remove poll_fd_woke() optimization from dpif_linux_recv().
authorBen Pfaff <blp@nicira.com>
Thu, 10 Nov 2011 23:39:39 +0000 (15:39 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 29 Nov 2011 00:54:40 +0000 (16:54 -0800)
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.

lib/dpif-linux.c

index c5628b7..b1e5e31 100644 (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;
             }
         }
     }