1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-02 08:42:48 +00:00

xen/netfront: Decouple XENNET tags from mbuf lifetimes

netmap's generic mode tries to improve performance by minimizing mbuf
allocations.  In service of this goal, it maintains an extra reference
to the mbuf and polls the counter to see if the driver has released its
reference by calling m_freem().  As a result, the extref destructor is
not called when expected by the netfront driver, and mbufs tags are not
freed.

Modify the tx path to release its mbuf tags promptly when reclaiming tx
descriptors.  They are drawn from a fixed-size pool, so otherwise are
quickly exhausted when a netfront interface is in netmap generic mode.

Co-authored by:	royger
MFC after:	2 weeks
Fixes:	dabb3db7a8 ("xen/netfront: deal with mbuf data crossing a page boundary")
Sponsored by:	Cloud Software Group
Sponsored by:	Klara, Inc.
Sponsored by:	Zenarmor
This commit is contained in:
Mark Johnston 2024-08-02 13:09:41 +00:00
parent e5d6af4fe7
commit 2e4781cb12

View File

@ -335,8 +335,16 @@ static void mbuf_release(struct mbuf *m)
KASSERT(ref != NULL, ("Cannot find refcount"));
KASSERT(ref->count > 0, ("Invalid reference count"));
if (--ref->count == 0)
if (--ref->count == 0) {
/*
* Explicitly free the tag while we hold the tx queue lock.
* This ensures that the tag is deleted promptly in case
* something else is holding extra references to the mbuf chain,
* such as netmap.
*/
m_tag_delete(m, &ref->tag);
m_freem(m);
}
}
static void tag_free(struct m_tag *t)