Replace bcopy() to update ether_addr
Warner Losh
imp at bsdimp.com
Mon Aug 20 16:41:17 UTC 2012
On Aug 20, 2012, at 8:46 AM, Mitya wrote:
> Hi.
> I found some overhead code in /src/sys/net/if_ethersubr.c and /src/sys/netgraph/ng_ether.c
>
> It contains strings, like bcopy(src, dst, ETHER_ADDR_LEN);
> When src and dst are "struct ether_addr*", and ETHER_ADDR_LEN equal 6.
> This code call every time, when we send Ethernet packet.
> On example, on my machine in invoked nearly 20K per second.
>
> Why we are use bcopy(), to copy only 6 bytes?
> Answer - in some architectures we are can not directly copy unaligned data.
True for shorts, longs, etc. But why do we need it for ether_addr? It is a struct that's just an array... That's always safe.
> I propose this solution.
>
> In file /usr/src/include/net/ethernet.h add this lines:
>
> static inline void ether_addr_copy(ether_addr* src, ether_addr* dst) {
> #if defined(__i386__) || defined(__amd64__)
Bleck. that's uber ugly. We have a define for unaligned vs aligned architectures. we should use that here. If we even need this ifdef at all.
Warner
> *dst = *src;
> #else
> bcopy(src, dst, ETHER_ADDR_LEN);
> #endif
> }
>
> On platform i386 gcc produce like this code:
> leal -30(%ebp), %eax
> leal 6(%eax), %ecx
> leal -44(%ebp), %edx
> movl (%edx), %eax
> movl %eax, (%ecx)
> movzwl 4(%edx), %eax
> movw %ax, 4(%ecx)
> And clang produce this:
> movl -48(%ebp), %ecx
> movl %ecx, -26(%ebp)
> movw -44(%ebp), %si
> movw %si, -22(%ebp)
>
>
> All this variants are much faster, than bcopy()
>
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
More information about the freebsd-net
mailing list