svn commit: r279236 - head/sys/netinet
John-Mark Gurney
jmg at funkthat.com
Tue Feb 24 17:34:20 UTC 2015
Zbigniew Bodek wrote this message on Tue, Feb 24, 2015 at 12:57 +0000:
> 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.
So, the whole point of ETHER_ALIGN is to make struct ip aligned on
4 byte offsets... This will probably impact performance on arm for
properly aligned struct ip...
> 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.
I have thought of this, and think that this is the way to go... do
a copy of struct ip into a stack variable, manipulate it from there,
and pull it out later, though I haven't done any performance
measurements, and for items that touch a field or two it'd probably
hurt..
Maybe have two versions of struct ip, one that is aligned to 4 bytes
and another that is aligned to 2 bytes?
Also, did you do the same adjustment for struct tcp and friends? If
struct ip isn't aligned, then struct tcp won't be either causing
similar issues...
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
More information about the svn-src-head
mailing list