linux-mips
[Top] [All Lists]

Re: patch to kaweth.c to align IP header

To: "Kevin D. Kissell" <kevink@mips.com>
Subject: Re: patch to kaweth.c to align IP header
From: Carsten Langgaard <carstenl@mips.com>
Date: Thu, 05 Sep 2002 10:57:35 +0200
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>, Quinn Jensen <jensenq@lineo.com>, linux-mips@linux-mips.org
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <3D765072.60208@Lineo.COM> <1031182461.3017.137.camel@irongate.swansea.linux.org.uk> <008d01c254b5$d7398500$10eca8c0@grendel>
Sender: linux-mips-bounce@linux-mips.org
"Kevin D. Kissell" wrote:

> ----- Original Message -----
> From: "Alan Cox" <alan@lxorguk.ukuu.org.uk>
> To: "Quinn Jensen" <jensenq@lineo.com>
> Cc: <linux-mips@linux-mips.org>
> Sent: Thursday, September 05, 2002 1:34 AM
> Subject: Re: patch to kaweth.c to align IP header
>
> > On Wed, 2002-09-04 at 19:26, Quinn Jensen wrote:
> > > All,
> > >
> > > The Kawasaki LSI USB Ethernet driver was causing a crash
> > > in ipt_do_table() on mips because the address fields in
> > > the IP header were not word aligned.  Many (all?) other
> >
> > You -must- handle alignment traps in the kernel for networking. The
> > network code assumes and relies on this property and there are plenty of
> > other ways to get misaligned datagrams through things like ip in ip.
> >
> > > ethernet drivers do an skb_reserve of 2 to word align
> > > the address fields, and doing this in kaweth.c fixed
> > > my crash.
> >
> > Its not the crash fix, its however right in the sense its a good
> > performance optimisation for most platforms
>
> It is true that, due to the unfortunate lack of foresight in the
> design of IP, no pre-alignment of buffers will *guarantee*
> that the address or other fields of IP headers will be aligned.
>
> But I note that a design which assumes, for non x86 CPUs,
> that unaligned references will be handled by a kernel trap
> handler had darn well better assure itself that the misaligned
> case is extemely infrequent.  Otherwise, it would be a distinctly
> better design to extract all multi-byte IP header values using
> a macro which could map to a direct, possibly unaligned,
> load for CISC architectures, and to appropriate sequences
> of instructions for RISC architectures.  I haven't measured
> the alignment fault path for MIPS/Linux (in any case, MIPS
> isn't the only architecture affected here), but if we assume for
> the sake of the argument that it's 50 instructions, and that an
> unaligned halfword costs 4 inline instructions (lbu,lbu,sll,or),
> then using the unaligned reference trap as a crutch is a win
> only if the fields are correctly aligned roughtly 94% of the time.
>
> If full 32-bit or 64-bit words are being extracted, a MIPS CPU
> can do the unaligned accesses in only 2 in-line instructions,
> which would push the breakeven point out even further.
>
> Does anyone have any actual statistical data on the cost
> and frequency of this use of the unaligned access fixup?
>

There is implemented a counter in the unaligned exception handler, you used
to get hold of the value through /proc/cpuinfo, but this has apparently been
removed from the latest kernels.


>
>             Regards,
>
>             Kevin K.

--
_    _ ____  ___   Carsten Langgaard   Mailto:carstenl@mips.com
|\  /|||___)(___   MIPS Denmark        Direct: +45 4486 5527
| \/ |||    ____)  Lautrupvang 4B      Switch: +45 4486 5555
  TECHNOLOGIES     2750 Ballerup       Fax...: +45 4486 5556
                   Denmark             http://www.mips.com




<Prev in Thread] Current Thread [Next in Thread>