dpif-netdev: Initialize upcall->packet when queuing to userspace.
authorBen Pfaff <blp@nicira.com>
Wed, 23 Jul 2014 04:06:44 +0000 (21:06 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 23 Jul 2014 05:30:03 +0000 (22:30 -0700)
Commit db73f7166a6 (netdev-dpdk: Fix race condition with DPDK mempools in
non pmd threads) switched to a new way of setting up 'upcall->packet', but
only initialized two of the fields in the packet.  This could cause
core dumps and other strange behavior.  In particular it caused failures in
several unit tests on XenServer.

This commit fixes the problem by initializing the entire ofpbuf.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Justin Pettit <jpettit@nicira.com>
lib/dpif-netdev.c

index cad8c7a..8422c89 100644 (file)
@@ -2153,6 +2153,7 @@ OVS_REQUIRES(q->mutex)
         struct ofpbuf *buf = &u->buf;
         size_t buf_size;
         struct flow flow;
+        void *data;
 
         upcall->type = type;
 
@@ -2179,8 +2180,8 @@ OVS_REQUIRES(q->mutex)
         /* We have to perform a copy of the packet, because we cannot send DPDK
          * mbufs to a non pmd thread. When the upcall processing will be done
          * in the pmd thread, this copy can be avoided */
-        ofpbuf_set_data(&upcall->packet, ofpbuf_put(buf, ofpbuf_data(packet),
-                        ofpbuf_size(packet)));
+        data = ofpbuf_put(buf, ofpbuf_data(packet), ofpbuf_size(packet));
+        ofpbuf_use_stub(&upcall->packet, data, ofpbuf_size(packet));
         ofpbuf_set_size(&upcall->packet, ofpbuf_size(packet));
 
         seq_change(q->seq);