Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Feb 2015 12:16:10 -0800
From:      Adrian Chadd <adrian@freebsd.org>
To:        Zbigniew Bodek <zbb@freebsd.org>
Cc:        "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>
Subject:   Re: svn commit: r279236 - head/sys/netinet
Message-ID:  <CAJ-VmonKBO=DZoMxp=h49G4mebCpWzOc-vcERRwvn489sRiruw@mail.gmail.com>
In-Reply-To: <201502241257.t1OCv40V097418@svn.freebsd.org>
References:  <201502241257.t1OCv40V097418@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

Erm, did you test this stuff on MIPS too?

We should be smarter about accessing fields in the IP header, rather
than trying to play alignment games like this.



-adrian


On 24 February 2015 at 04:57, Zbigniew Bodek <zbb@freebsd.org> wrote:
> Author: zbb
> Date: Tue Feb 24 12:57:03 2015
> New Revision: 279236
> URL: https://svnweb.freebsd.org/changeset/base/279236
>
> Log:
>   Change struct attribute to avoid aligned operations mismatch
>
>   Previous __alignment(4) allowed compiler to assume that operations are
>   performed on aligned region. On ARM processor, this led to alignment fault
>   as shown below:
>   trapframe: 0xda9e5b10
>   FSR=00000001, FAR=a67b680e, spsr=60000113
>   r0 =00000000, r1 =00000068, r2 =0000007c, r3 =00000000
>   r4 =a67b6826, r5 =a67b680e, r6 =00000014, r7 =00000068
>   r8 =00000068, r9 =da9e5bd0, r10=00000011, r11=da9e5c10
>   r12=da9e5be0, ssp=da9e5b60, slr=a054f164, pc =a054f2cc
>   <...>
>   udp_input+0x264: ldmia r5, {r0-r3, r6}
>   udp_input+0x268: stmia r12, {r0-r3, r6}
>
>   This was due to instructions which do not support unaligned access,
>   whereas for __alignment(2) compiler replaced ldmia/stmia with some
>   logically equivalent memcpy operations.
>   In fact, the assumption that 'struct ip' is always 4-byte aligned
>   is definitely false, as we have no impact on data alignment of packet
>   stream received.
>
>   Another possible solution would be to explicitely perform memcpy()
>   on objects of 'struct ip' type, which, however, would suffer from
>   performance drop, and be merely a problem hiding.
>
>   Please, note that this has nothing to do with
>   ARM32_DISABLE_ALIGNMENT_FAULTS option, but is related strictly to
>   compiler behaviour.
>
>   Submitted by:  Wojciech Macek <wma@semihalf.com>
>   Reviewed by:   glebius, ian
>   Obtained from: Semihalf
>
> Modified:
>   head/sys/netinet/ip.h
>
> Modified: head/sys/netinet/ip.h
> ==============================================================================
> --- head/sys/netinet/ip.h       Tue Feb 24 12:31:08 2015        (r279235)
> +++ head/sys/netinet/ip.h       Tue Feb 24 12:57:03 2015        (r279236)
> @@ -67,7 +67,7 @@ struct ip {
>         u_char  ip_p;                   /* protocol */
>         u_short ip_sum;                 /* checksum */
>         struct  in_addr ip_src,ip_dst;  /* source and dest address */
> -} __packed __aligned(4);
> +} __packed __aligned(2);
>
>  #define        IP_MAXPACKET    65535           /* maximum packet size */
>
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmonKBO=DZoMxp=h49G4mebCpWzOc-vcERRwvn489sRiruw>