Subject: Re: Small Ethernet packet padding
To: None <cube@cubidou.net>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: tech-net
Date: 10/31/2004 14:50:11
On Sun, Oct 31, 2004 at 02:24:54PM +0100, cube@cubidou.net wrote:
> On Sun, Oct 31, 2004 at 01:33:11PM +0100, Manuel Bouyer wrote:
> > On Sun, Oct 31, 2004 at 12:18:29PM +0100, cube@cubidou.net wrote:
> [...]
> > > Also, I wonder what is the gain of making the padding at
> > > the driver level. I'd like some input there too. If
> > > there is no actual advantage to doing that inside the
> > > hardware driver, I think it would be best to convert all
> > > affected drivers to such a scheme as the low-level padding
> > > adds quite some complexity to the driver.
> >
> > The problem with doing this at the the ethernet level is that
> > it will always cost you extra CPU cycles.
>
> Indeed, I'll burn some CPU cycles even when the drivers doesn't need
> the padding.
>
> > - if the adapter is doing PIO, just write a buch of 0 to the I/O port,
> > no need to extend the packet. See ne2000.c for an example. This cost less
> > cpu cycles than setting memory to 0 and then bus_space_write()ing this to
> > the I/O port.
> > - if the adapter is doing scatter/gather DMA, just add an extra preallocated,
> > preset to 0 segment at the end. This is almost free in term of CPU cycles.
> > See if_tl.c for an example.
> > - if the adapter is doing DMA from a fixed preallocated buffer (and the mbuf
> > chain is copied to this buffer before transmit), just memset the required
> > space to 0. Again cost less cycles than setting memory to 0 and copying it
> > to the buffer.
> > - for adapters that autopad themselves, you still add a test in the path.
> >
> > Now, I don't know if saving these extra CPU cycles is really important or
> > not. When I did the work on this padding problem, it was decided that the
> > best place to do this was in the drivers themselves, because it was the most
> > efficient.
>
> But it feels so much cleaner that way.
i don't think so. ether_output() doesn't always pass the mbuf to a real
ethernet device (in which case padding may be inappropriate), or to a device
which may have different padding restrictions (does wifi need padding
to ETHER_MIN_LEN ?). Also, packets may come to the adapter's if_snd queue
from other places than ether_output() (if_vlan will do it, as does if_bridge).
> When you told me to look at tl(4)
> code, that's what I did. But I wasn't able to adapt it to gem(4). Almost,
> but it simply made the interface fail. I know that it's very important to
Well, something is wrong then. Either the chip is buggy, or you code wasn't
right. Anyway, it doesn't look right to add bloat to a common piece of
code because one driver in the tree can't handle it.
> spend as little time as possible in the network stack, but drivers are
> already very complicated pieces of code.
The code to add padding doesn't add only a few lines of code, really.
--
Manuel Bouyer <bouyer@antioche.eu.org>
NetBSD: 26 ans d'experience feront toujours la difference
--