Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Aug 2013 22:51:34 +0200
From:      Andre Oppermann <andre@freebsd.org>
To:        Ian Lepore <ian@FreeBSD.org>
Cc:        freebsd-arm <freebsd-arm@FreeBSD.org>
Subject:   Re: ARM network trouble after recent mbuf changes
Message-ID:  <521D1156.9030708@freebsd.org>
In-Reply-To: <1377615455.1111.180.camel@revolution.hippie.lan>
References:  <1377550636.1111.156.camel@revolution.hippie.lan> <521BC472.7040804@freebsd.org> <521BD531.4090104@sbcglobal.net> <521C4CD9.4050308@freebsd.org> <0E0536B2-2B7F-4EED-9EFD-4B9E2C2D729A@freebsd.org> <521C87FF.8010100@freebsd.org> <D2FB4EEE-DE17-43CB-9E77-7BCA7D1B9661@freebsd.org> <521CB66B.9020806@freebsd.org> <1377615455.1111.180.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?521D1156.9030708>