Skip to content
Snippets Groups Projects
Commit f08ba30d authored by Vlad Zolotarov's avatar Vlad Zolotarov Committed by Pekka Enberg
Browse files

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: default avatarDor Laor <dor@cloudius-systems.com>
Reviewed-by: default avatarZhi Yong Wu <zwu.kernel@gmail.com>
Signed-off-by: default avatarVlad Zolotarov <vladz@cloudius-systems.com>
Signed-off-by: default avatarPekka Enberg <penberg@cloudius-systems.com>
parent 94e9e41c
No related branches found
No related tags found
No related merge requests found
......@@ -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++;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment