Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 May 2015 12:59:06 +0300
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        John Baldwin <jhb@freebsd.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r282280 - in head/sys/dev: e1000 ixgbe ixl
Message-ID:  <20150505095906.GO34544@FreeBSD.org>
In-Reply-To: <1850166.lcXaWhCA6D@ralph.baldwin.cx>
References:  <201504301823.t3UINd74073186@svn.freebsd.org> <2463555.FfYUgqxYi8@ralph.baldwin.cx> <20150505064556.GM34544@FreeBSD.org> <1850166.lcXaWhCA6D@ralph.baldwin.cx>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, May 05, 2015 at 05:32:11AM -0400, John Baldwin wrote:
J> > On Mon, May 04, 2015 at 04:01:28PM -0400, John Baldwin wrote:
J> > J> > Your answer seems quite orthogonal to my question. I reread it couple of times,
J> > J> > but still can't figure out how exactly do you prefet to fetch per-queue stats.
J> > J> > Can you please explain in more detail?
J> > J> 
J> > J> struct if_queue {
J> > J> 	struct ifnet *ifq_parent;
J> > J> 	void (*ifq_get_counter)(struct if_queue *, ift_counter);
J> > J> 	...
J> > J> };
J> > J> 
J> > J> (Pretend that if_queue is a new object type and that each RX or TX queue on a
J> > J> NIC has one.)
J> > 
J> > This looks like a driver with 1024 queues would carry extra 1024 function pointers
J> > per ifnet. Is it really worth? Could it be that queue #0 differs from queue #1?
J> > Even, if a rare case when queue #N differs from queue #M do exist, they still
J> > can share the pointer and the differentiating logic would be in the function
J> > itself.
J> 
J> Drivers with 1024 queues already have several pointers, however, you could
J> have a "class" pointer (something ifnet doesn't have) like 'cdevsw' where you
J> have a single structure containing the ops and the various queues have a pointer
J> to that instead of having N duplicated function pointers.  OTOH, you could probably
J> keep this as an ifnet op, but accept a queue pointer as the argument still (that
J> would give a similar effect).
J> 
J> If you really want to trim function pointers though, fix ifnet to not duplicate
J> them and use a shared ifnetsw among instances. :)

Note that my own paragraph quoted below states that this is exactly what I did
in projects/ifnet.

J> > Right now, in the projects/ifnet branch, I'm developing in quite opposite
J> > direction - many instances of the same driver share the set of interface
J> > options. This is done to shrink struct ifnet.
J> > 
J> > What's wrong with KPI when the queue number is parameter to an ifop? This
J> > KPI would also hide the queue pointers from the stack, which are quite
J> > driver specific.
J> 
J> I think at some point we will want stack awareness in the stack for more than
J> just stats.  For example, the whole buf_ring/if_transmit thing has been non-ideal
J> in terms of requiring drivers to duplicate a lot of code that was previously
J> hidden from them making the drivers more complex (and fragile).  Several of us
J> would like to push the knowledge of the software ring (which is per-TX queue)
J> back up out of drivers, but that will require some per-queue state stored outside
J> of drivers.  You could certainly do that with parallel arrays instead, but I'm
J> not sure that is better than having a structure (at least I'm not sure that is
J> as easy to reason about when you are working on the stack)

Well, if the drivers access the structure functionally: dequeue, putback, etc.,
then this isn't a big deal.

When the structure is ready, and we got drivers capable of working with it,
we can introduce if_transmit_queue. I hope by that time projects/ifnet will
be finalized, and expanding functionality of ifnet will be much easier.

-- 
Totus tuus, Glebius.



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