Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Apr 2026 11:58:09 +0200
From:      Kristof Provost <kp@FreeBSD.org>
To:        Andrew Gallatin <gallatin@FreeBSD.org>
Cc:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   Re: git: 956acdce0505 - main - loopback: Account for packet drops
Message-ID:  <CAEBDB5C-26CC-4F4F-8B27-2E0CC25AAFF2@FreeBSD.org>
In-Reply-To: <69de99dd.422ab.2b84d627@gitrepo.freebsd.org>

index | next in thread | previous in thread | raw e-mail

On 14 Apr 2026, at 21:47, Andrew Gallatin wrote:
> The branch main has been updated by gallatin:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=956acdce0505ca8028d287d3b44789c623c8f37e
>
> commit 956acdce0505ca8028d287d3b44789c623c8f37e
> Author:     Andrew Gallatin <gallatin@FreeBSD.org>
> AuthorDate: 2026-04-14 19:43:28 +0000
> Commit:     Andrew Gallatin <gallatin@FreeBSD.org>
> CommitDate: 2026-04-14 19:43:28 +0000
>
>     loopback: Account for packet drops
>
>     Make loopback packet drops more obvious by reporting them
>     in interface stats visable via netstat -ni
>     Since loopback uses netisr, packets can be dropped if the
>     netisr queue overflows.  These drops are visible via
>     netisr -Q, but its not an obvious place to look.
>
>     Differential Revision: https://reviews.freebsd.org/D56356
>     Reviewed by: glebius, tuexen
>     Sponsored by: Netflix
> ---
>  sys/net/if_loop.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
> index 37309260a0d3..2ff265d5d1e7 100644
> --- a/sys/net/if_loop.c
> +++ b/sys/net/if_loop.c
> @@ -350,9 +350,13 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
>  		m_freem(m);
>  		return (EAFNOSUPPORT);
>  	}
> -	if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
> -	if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len);
> -	netisr_queue(isr, m);	/* mbuf is free'd on failure. */
> +	if (netisr_queue(isr, m) == 0) {
> +		if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
> +		if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len);

I’m seeing reproducible KASAN use-after-free warnings here (running the pf tests).
Which makes sense, because after the netisr_queue() call we no longer own the mbuf.

I think we need something like this:

	diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
	index 2ff265d5d1e7..33ddd3a8540e 100644
	--- a/sys/net/if_loop.c
	+++ b/sys/net/if_loop.c
	@@ -276,6 +276,7 @@ int
	 if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
	 {
	        int isr;
	+       int32_t len;

	        M_ASSERTPKTHDR(m);
	        m_tag_delete_nonpersistent(m);
	@@ -350,9 +351,10 @@ if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen)
	                m_freem(m);
	                return (EAFNOSUPPORT);
	        }
	+       len = m->m_pkthdr.len;
	        if (netisr_queue(isr, m) == 0) {
	                if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
	-               if_inc_counter(ifp, IFCOUNTER_IBYTES, m->m_pkthdr.len);
	+               if_inc_counter(ifp, IFCOUNTER_IBYTES, len);
	        } else {
	                /* mbuf is free'd on failure. */
	                if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);

Best regards,
Kristof


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAEBDB5C-26CC-4F4F-8B27-2E0CC25AAFF2>