From: Julien Grall Date: Mon, 5 Oct 2015 17:35:54 +0000 (+0100) Subject: xen/netfront: Add 2 bytes padding in the rx mbuf X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=96f74a1d464a37a82b444a6a4917908aae69d6b0;p=people%2Fjulieng%2Ffreebsd.git xen/netfront: Add 2 bytes padding in the rx mbuf The ethernet header size is not word aligned. Therefore the IP packet and so on won't be align. On some architecture (such as ARM) unaligned access may be slower and/or not supported. Therefore we might reveice an alignement fault. To avoid this case, we need to pull-up the data of ETHER_ALIGN bytes. I'm not sure how this patch will impact x86, we need to do some benchmarking without and with it. Furthermore, I don't know if m_copyup is the rigth function to use here. Can any expert to the network stack can tell me if there is a better solution? --- diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c index 7588956210e6..57f826f1d0cc 100644 --- a/sys/dev/xen/netfront/netfront.c +++ b/sys/dev/xen/netfront/netfront.c @@ -86,6 +86,8 @@ __FBSDID("$FreeBSD$"); #include "xenbus_if.h" +#define ETHER_ALIGN 2 + /* Features supported by all backends. TSO and LRO can be negotiated */ #define XN_CSUM_FEATURES (CSUM_TCP | CSUM_UDP) @@ -1247,6 +1249,22 @@ next_skip_queue: ref_cons = *cons + frags; frags++; } + + if (err == 0) { + /* + * The ethernet header size is not word aligned. Therefore, + * the IP packet and so on won't be align. On some architecture + * (such as ARM) unaligned access may be slower and/or not + * supported. Therefore we might receive an alignment fault. + * To avoid this case, we need to pull-up the data of + * ETHER_ALIGN bytes. + */ + m0 = m_copyup(m0, min(m0->m_pkthdr.len, max_protohdr), + ETHER_ALIGN); + if (m0 == 0) + err = ENOMEM; + } + *list = m0; *cons += frags;