Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Apr 2004 09:03:02 -0800 (PST)
From:      wpaul@FreeBSD.ORG (Bill Paul)
To:        ru@FreeBSD.org (Ruslan Ermilov)
Cc:        net@FreeBSD.org
Subject:   Re: [PATCH] TX algorithms, missetting IFF_OACTIVE and if_timer
Message-ID:  <20040402170302.C227F16A4CF@hub.freebsd.org>
In-Reply-To: <20040402120619.GA10105@ip.net.ua> from Ruslan Ermilov at "Apr 2, 2004 03:06:19 pm"

next in thread | previous in thread | raw e-mail | index | archive | help
> Gang,
> 
> I've been wading through several network drivers recently,
> learning Bill Paul's code.  Specifically, I examined the
> following drivers: ste(4), rl(4), dc(4), nge(4), and vr(4).
> 
> They all use the consumer/producer approach for handling TX.
> if_start() works with the producer, and txeof() works with
> the consumer.  The condition (consumer == producer) is when
> the TX ring is empty.  To differentiate the case of an empty
> ring from the full ring, some drivers (ste(4), dc(4), and
> nge(4)) have the threshold (6 for dc(4), 3 for ste(4), and
> 2 for nge(4)) to assert the gap between producer and consumer,
> thus not allow the producer to catch the consumer.  (The
> vr(4) is hairier, and I will not discuss it in detail here.)
> 
> First, could you please explain these magic numbers?

Not really, no. Very often, values were chosen because they worked
(and in some cases, they weren't chosen by me).

> Also, some drivers use indexes for consumer and producer,
> where they could use "next" pointers, which should be faster.

"Should" be faster? I'm not saying you're wrong, but can you prove
that it's faster to use lists? I started out using linked lists
for descriptors, but then I started to encounter chips that used
producer/consumer indexes internally (like the Adaptec 'starfire'
chip and the Tigon II). I decided that since I tended to allocate
all of the descriptors in contiguous chunks anyway, it was simpler
to just treat them as arrays and use index counters.

> I also think that using the gap between producer/consumer is
> suboptimal, but this gap is part of the existing algorithm.

Nowhere is it written that you can't change the algorithm. :)

Note that if you're looking for approval from me to check in these
patches, don't bother: I will neither approve nor disapprove. The
only way for me to know if your changes are correct is to test them,
and I don't have the time or resources right now to do that. If you
want to commit them, go ahead. It's your funeral. :)

> As an aside, lot of drivers that support auto-padding
> still have useless xx_pad[XX_MIN_FRAMELEN] element in
> their xx_chain_data structure, namely, dc(4), ste(4),
> and tl(4) have it.  I think these were copied from
> some template driver, is it safe to remove them?

If nothing references them, sure. Note that there is no "template
driver." I write new drivers by choosing an existing driver that
most closely matches the design of the chip I need to support, run
it through sed(1) to change its name, strip out all the device-dependent
stuff specific to the old device and replace it with stuff for the
new device.

And then the stork comes, and it's a driver.

-Bill

--
=============================================================================
-Bill Paul            (510) 749-2329 | Senior Engineer, Master of Unix-Fu
                 wpaul@windriver.com | Wind River Systems
=============================================================================
              <adamw> you're just BEGGING to face the moose
=============================================================================



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040402170302.C227F16A4CF>