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