ARM network trouble after recent mbuf changes

Andre Oppermann andre at freebsd.org
Tue Aug 27 20:51:40 UTC 2013


On 27.08.2013 16:57, Ian Lepore wrote:
> On Tue, 2013-08-27 at 16:23 +0200, Andre Oppermann wrote:
>> On 27.08.2013 15:29, Michael Tuexen wrote:
>>> On Aug 27, 2013, at 1:05 PM, Andre Oppermann <andre at FreeBSD.org> wrote:
>>>> Thanks.  I've changed the test accordingly.
>>>>
>>>> While doing the CTASSERTs to prevent such an incident in the future I stumbled
>>>> across a bit of evil name space pollution in mbuf.h.  It is impossible to take
>>>> sizeof(struct m_ext) because "m_ext" is redefined to point into struct mbuf.
>>>>
>>>> In addition to the alignment fix I've solved the namespace issues with m_ext
>>>> and the stupidly named struct pkthdr as well and properly prefixed them.  The
>>>> fallout from LINT was zero (as it should be).
>>>>
>>>> http://people.freebsd.org/~andre/m_hdr-alignment-20130827.diff
>>>>
>>>> Please test.
>>   >
>>> Done. r254954 with your patch applied runs fine on a RPi.
>>
>> Does the CTASSERT trigger if the padding in m_hdr is not there?
>>
>
> Yes:
>
>    --- uipc_mbuf.o ---
>    /local/build/staging/freebsd/bb/src/sys/kern/uipc_mbuf.c:91:1: error: static_assert failed "compile-time assertion failed"
>    CTASSERT(sizeof(struct mbuf) == MSIZE);
>
>
> Since the MLEN and MHLEN macros are used to size the data arrays based
> on the assumption that they begin at a given offset within the struct,
> these asserts more directly express that:
>
>    CTASSERT(MSIZE - offsetof(struct mbuf, m_dat) == MLEN);
>    CTASSERT(MSIZE - offsetof(struct mbuf, m_pktdat) == MHLEN);
>
> With these added you get all 3 asserts and somewhat more of a clue about
> why things are wrong (other than just sizeof mbuf being wrong):

Excellent.  I exchanged them for the struct mbuf member asserts.

>    --- uipc_mbuf.o ---
>    /local/build/staging/freebsd/bb/src/sys/kern/uipc_mbuf.c:91:1: error: static_assert failed "compile-time assertion failed"
>    CTASSERT(sizeof(struct mbuf) == MSIZE);
>    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    /local/build/staging/freebsd/bb/src/sys/sys/systm.h:100:21: note: expanded from macro 'CTASSERT'
>    #define CTASSERT(x)     _Static_assert(x, "compile-time assertion failed")
>                            ^
>    /local/build/staging/freebsd/bb/src/sys/kern/uipc_mbuf.c:97:1: error: static_assert failed "compile-time assertion failed"
>    CTASSERT(MSIZE - offsetof(struct mbuf, m_dat) == MLEN);
>    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    /local/build/staging/freebsd/bb/src/sys/sys/systm.h:100:21: note: expanded from macro 'CTASSERT'
>    #define CTASSERT(x)     _Static_assert(x, "compile-time assertion failed")
>                            ^              ~
>    /local/build/staging/freebsd/bb/src/sys/kern/uipc_mbuf.c:98:1: error: static_assert failed "compile-time assertion failed"
>    CTASSERT(MSIZE - offsetof(struct mbuf, m_pktdat) == MHLEN);
>    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    /local/build/staging/freebsd/bb/src/sys/sys/systm.h:100:21: note: expanded from macro 'CTASSERT'
>    #define CTASSERT(x)     _Static_assert(x, "compile-time assertion failed")
>                            ^              ~
>
>
> IMO, it would be great if MLEN and MHLEN could be #define'd in terms of
> offsetof() expressions, but the compiler is unhappy about asking for
> offsetof an incomplete struct, even though it has all the info it needs
> at the point the expression is encountered.

Yeah, I couldn't find a way either to solve this nasty circular dependency.

-- 
Andre



More information about the freebsd-arm mailing list