cvs commit: src/sys/conf options src/sys/netinet ip_output.c

Mike Silbersack silby at
Thu Mar 27 14:21:58 PST 2003

On Thu, 27 Mar 2003, Sam Leffler wrote:

> I thought about this some more.  If the purpose of m_defrag* is to handle
> problems in drivers where the s/g requirements are too large then you want
> to do the minimum amount of work since the results going to be used once and
> thrown away.  This says to me that you want to coalesce only until you know

The purpose of it is to defragment mbuf chains.  As you point out, we
already have m_copypacket, m_clone, and a bunch of handwritten functions
in network drivers which try to do various parts of this operation, with
optimizations.  And, due to these optimizations, they all have

m_defrag shouldn't be called all that often by network drivers, so I'm not
overly concerned about speed issues; I'm more concerned that it achieve
its goal in the most correct fashion.

> and leave clusters/ext's alone.  Then if the subsequent bus_dma_load_mbuf
> call fails you discard the packet.  Other than the read/write requirements
> this is exactly m_clone.

Discarding a packet because we're too lazy to defrag it isn't a very good

Also note that this function will be useful in other places where we are
keeping mbuf chains around for long periods of time (IP reassembly) and
wish to save memory at the cost of a bit of processor time.  If I optimize
it so that it doesn't merge mbuf clusters, it'll be a useless function.

I'm sure that enhancing the function so that it stops once it reaches
"goal" would be advantageous, but that's an optimization I'll let someone
else do in the future.

Mike "Silby" Silbersack

More information about the cvs-src mailing list