Date: Thu, 31 Oct 2013 23:35:35 +0100 From: Andre Oppermann <andre@freebsd.org> To: John-Mark Gurney <jmg@funkthat.com>, Luigi Rizzo <rizzo@iet.unipi.it> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org, Ian Lepore <ian@FreeBSD.org> Subject: Re: svn commit: r257455 - head/sys/net Message-ID: <5272DB37.6010801@freebsd.org> In-Reply-To: <20131031221457.GG58155@funkthat.com> References: <201310311546.r9VFkAIb049844@svn.freebsd.org> <20131031180336.GA62132@onelab2.iet.unipi.it> <5272AAC4.4030700@freebsd.org> <1383247645.31172.29.camel@revolution.hippie.lan> <20131031200502.GB83212@onelab2.iet.unipi.it> <20131031204916.GF58155@funkthat.com> <20131031211337.GA83561@onelab2.iet.unipi.it> <20131031221457.GG58155@funkthat.com>
index | next in thread | previous in thread | raw e-mail
On 31.10.2013 23:14, John-Mark Gurney wrote:
> Luigi Rizzo wrote this message on Thu, Oct 31, 2013 at 22:13 +0100:
>> On Thu, Oct 31, 2013 at 01:49:16PM -0700, John-Mark Gurney wrote:
>>> Luigi Rizzo wrote this message on Thu, Oct 31, 2013 at 21:05 +0100:
>>>> On Thu, Oct 31, 2013 at 01:27:25PM -0600, Ian Lepore wrote:
>>>> ...
>>>>> Is there any chance all this reworking might get us to a position where
>>>>> the protocol header in an mbuf doesn't have to be 32-bit aligned
>>>>> anymore? We pay a pretty heavy price for that requirement in the
>>>>> drivers of the least capable hardware we support, the systems that have
>>>>> the least horsepower to spare to make an extra copy of each packet to
>>>>> realign it.
>>>>
>>>> So are you suggesting to use some 'copy_unaligned_32()' function/macro to
>>>> access 32-bit protocol fields in the network stack ?
>>>> (16-bit entries should not be an issue)
>>>
>>> my idea has been to make a change to the various ip/tcp/udp layers
>>> that is dependant upon __NO_STRICT_ALIGNMENT and if we do require
>>> strict alignment to copy the header to a stack buffer to align the
>>> data...
>>
>> I'd rather use accessors functions/macros to read/write
>> the unaligned headers so we can hide the #ifdefs in only
>> one place.
>
> I am/was trying to prevent massive code curn...
>
>> The copy to a stack buffer is probably useful even for readability
>
> Oh, I also realized I left out another part of it...
>
> void
> ip_input(struct mbuf *m)
> {
> #ifndef __NO_STRICT_ALIGNMENT
> struct ip tmpip;
> #endif
> struct ip *ip = NULL;
>
> #ifndef __NO_STRICT_ALIGNMENT
> bcopy(mtod(m, struct ip *), &tmpip, sizeof tmpip);
> ip = &tmpip;
> #else
> ip = mtod(m, struct ip *);
> #endif
Still massive code churn for all protocols above layer 3.
> }
>> regardless of alignment (i do this in ipfw so i parse the
>> packet only once, and those values are used often),
>> but we should be careful to keep the copy in
>> sync with the original in places where those headers are modified
>> (NAT, ipfw fwd, maybe somewhere else ?)
>
> If you modify the packet, you need to be careful to write back the
> data when needed, i.e. passing the mbuf to another layer or
> returning.. But that isn't anything too different than other
> functions...
Since the beginning and continuing the direct structure casting has
been the way to access protocol data. Completely changing this
would be a very big change requiring a throughout audit of the kernel.
> Looks like I'll have to revive my TS-7200 port for testing as npe on
> AVILA apparently can handle the slightly odd alignment...
Architectures that have trouble with unaligned access should only
be used with RX DMA engines that can 16bit align their writes. ;)
Then it's only a call to m_adj before the mbuf is mapped into the
RX ring and you're good.
--
Andre
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5272DB37.6010801>
