]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
xen/netfront: Add 2 bytes padding in the rx mbuf
authorJulien Grall <julien.grall@linaro.org>
Wed, 4 Jun 2014 21:13:20 +0000 (22:13 +0100)
committerJulien Grall <julien.grall@citrix.com>
Sat, 3 Oct 2015 18:37:15 +0000 (19:37 +0100)
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 defined. Therefore we might reveice an alignement fault.
To void 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.

I'mi also not sure m_copyup is the right function to any. Can any expert to the
network stack can tell me if there is a better solution?

sys/dev/xen/netfront/netfront.c

index 835c6ae09462975fc6791a8d92b6ad6c349e800a..9f6ee017da779b508311ef7010ce60d9f4068296 100644 (file)
@@ -88,6 +88,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)
 
@@ -1357,6 +1359,21 @@ next_skip_queue:
                ref_cons = *cons + frags;
                frags++;
        }
+
+       if (!err) {
+               /* 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 denied.
+                * 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)
+                       err = ENOMEM;
+       }
+
        *list = m0;
        *cons += frags;
        *pages_flipped_p = pages_flipped;