From f08ba30d05a8dd815ddd43f1d21fca4253c51de1 Mon Sep 17 00:00:00 2001
From: Vlad Zolotarov <vladz@cloudius-systems.com>
Date: Thu, 13 Feb 2014 15:05:35 +0200
Subject: [PATCH] virtio-net: don't copy a virtio_net_hdr in receiver()

don't copy a virtio virtio_net_hdr to a local buffer in receiver().
This prevents CPU's optimizations.
Cast the mbuf's beginning to the virtio_net_hdr and use the relevant
fields where needed allowing a proper load prediction (as a result of
branch prediction).

Reviewed-by: Dor Laor <dor@cloudius-systems.com>
Reviewed-by: Zhi Yong Wu <zwu.kernel@gmail.com>
Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 drivers/virtio-net.cc | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
index cc5521b08..92e3d639f 100644
--- a/drivers/virtio-net.cc
+++ b/drivers/virtio-net.cc
@@ -393,7 +393,7 @@ void net::receiver()
 
         // use local header that we copy out of the mbuf since we're
         // truncating it.
-        struct net_hdr_mrg_rxbuf mhdr;
+        net_hdr_mrg_rxbuf* mhdr;
 
         while (m != nullptr) {
 
@@ -409,12 +409,12 @@ void net::receiver()
                 continue;
             }
 
-            memcpy(&mhdr, mtod(m, void*), _hdr_size);
+            mhdr = mtod(m, net_hdr_mrg_rxbuf*);
 
             if (!_mergeable_bufs) {
                 nbufs = 1;
             } else {
-                nbufs = mhdr.num_buffers;
+                nbufs = mhdr->num_buffers;
             }
 
             m->M_dat.MH.MH_pkthdr.len = len;
@@ -450,9 +450,9 @@ void net::receiver()
             m_adj(m_head, offset);
 
             if ((_ifn->if_capenable & IFCAP_RXCSUM) &&
-                (mhdr.hdr.flags &
+                (mhdr->hdr.flags &
                  net_hdr::VIRTIO_NET_HDR_F_NEEDS_CSUM)) {
-                if (bad_rx_csum(m_head, &mhdr.hdr))
+                if (bad_rx_csum(m_head, &mhdr->hdr))
                     csum_err++;
                 else
                     csum_ok++;
-- 
GitLab