svn commit: r258328 - head/sys/net

John-Mark Gurney jmg at funkthat.com
Tue Nov 19 18:04:27 UTC 2013


Robert Watson wrote this message on Tue, Nov 19, 2013 at 11:04 +0000:
> On Mon, 18 Nov 2013, George V. Neville-Neil wrote:
> 
> > Allow ethernet drivers to pass in packets connected via the nextpkt 
> > pointer.
> > Handling packets in this way allows drivers to amortize work during 
> > packet reception.
> >
> > Submitted by:	Vijay Singh
> > Sponsored by:	NetApp
> 
> Currently, it is quite easy to make mistakes regarding individual mbuf 
> chains vs. lists of mbuf chains.  This leads me to wonder whether a new 
> type, perhaps simply constructed on the stack before passing in, should be 
> used for KPIs that accept lists of packets.  E.g.,
> 
> 	/*
> 	 * This structure is almost always allocated on a caller stack, so
> 	 * cannot itself be queued without memory allocation in most cases.
> 	 */
> 	struct mbuf_queue {
> 		struct mbuf	*mq_head;
> 	};
> 
> 	int
> 	ether_input(struct ifnet *ifp, struct mbuf_queue *m)

Why not pass in the structure (not a pointer to the struct) if the
struct really is the above?  It would even be able to save the stack
allocation (not that it's that expensive)...

so instead:
int
ether_input(struct ifnet *ifp, struct mbuf_queue m)

You can also create the struct via a macro like:
#define MAKE_MQ(mbuf)	((struct mbuf_queue){ (mbuf) })

so below would become:

return (ether_input(ifp, MAKE_MQ(m)));

Just a thought...  But I do like using the compiler for this...  The
above makes the compiler do the work, and it be transparent from the
code side...

> 	{
> 
> 		...
> 	}
> 
> 	...
> 		struct mbuf_queue mq = { m };
> 
> 		return (ether_input(ifp, &mq));
> 	...
> 
> That way the compiler can help us figure out where we expect an individual 
> packet but have accidentally leaked a queue.  Functions that accept only a 
> single packet could also more agressively assert that m->m_nextpkt is NULL:
> 
> 	M_ASSERT_ONEPACKET(m);

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."


More information about the svn-src-all mailing list