kern/148307: Incorrect alignment checks in sys/mips/atheros/if_arge.c

Adrian Chadd adrian at freebsd.org
Wed Jul 7 15:36:05 UTC 2010


This patch hasn't been tested. Oleksandr wanted to check the chain its
in entirety.

--- if_arge.c   (revision 209765)
+++ if_arge.c   (working copy)
@@ -818,6 +818,28 @@
 }

 /*
+ * Return whether the mbuf chain is correctly aligned
+ * for the arge TX engine.
+ *
+ * The TX engine requires each fragment to be aligned to a
+ * 4 byte boundary and the size of each fragment except
+ * the last to be a multiple of 4 bytes.
+ */
+static int
+arge_mbuf_chain_is_tx_aligned(struct mbuf *m0)
+{
+       struct mbuf *m;
+
+        for (m = m0; m != NULL; m = m->m_next) {
+               if((mtod(m, intptr_t) & 3) != 0)
+                       return 0;
+               if ((m->m_next != NULL) && ((m->m_len & 0x03) != 0))
+                       return 0;
+       }
+       return 1;
+}
+
+/*
  * Encapsulate an mbuf chain in a descriptor by coupling the mbuf data
  * pointers to the fragment pointers.
  */
@@ -837,7 +859,7 @@
         * even 4 bytes
         */
        m = *m_head;
-       if((mtod(m, intptr_t) & 3) != 0) {
+       if (! arge_mbuf_chain_is_tx_aligned(m)) {
                m = m_defrag(*m_head, M_DONTWAIT);
                if (m == NULL) {
                        *m_head = NULL;


More information about the freebsd-bugs mailing list