Date: Tue, 21 Aug 2012 13:24:15 +0200 From: Luigi Rizzo <rizzo@iet.unipi.it> To: Marius Strobl <marius@alchemy.franken.de> Cc: freebsd-hackers@freebsd.org, Mitya <mitya@cabletv.dp.ua>, freebsd-net@freebsd.org Subject: Re: Replace bcopy() to update ether_addr Message-ID: <20120821112415.GA50078@onelab2.iet.unipi.it> In-Reply-To: <20120821102630.GA89551@alchemy.franken.de> References: <50324DB4.6080905@cabletv.dp.ua> <20120821102630.GA89551@alchemy.franken.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Aug 21, 2012 at 12:26:30PM +0200, Marius Strobl wrote:
...
> > Why we are use bcopy(), to copy only 6 bytes?
> > Answer - in some architectures we are can not directly copy unaligned data.
> >
> > 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__)
> > *dst = *src;
> > #else
> > bcopy(src, dst, ETHER_ADDR_LEN);
> > #endif
> > }
...
> > All this variants are much faster, than bcopy()
> >
>
> A bit orthogonal to this but also related to the performance
> impact of these bcopy() calls, for !__NO_STRICT_ALIGNMENT
> architectures these places probably should use memcpy()
> instead as bcopy() additionally has to check for overlap
> while the former does not. Overlaps unlikely are an issue
> in these cases and at least NetBSD apparently has done the
> switch to memcpy() 5.5 years ago.
even more orthogonal:
I found that copying 8n + (5, 6 or 7) bytes was much much slower than
copying a multiple of 8 bytes. For n=0, 1,2,4,8 bytes are efficient,
other cases are slow (turned into 2 or 3 different writes).
The netmap code uses a pkt_copy routine that does exactly this
rounding, gaining some 10-20ns per packet for small sizes.
cheers
luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120821112415.GA50078>
