From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, kuba@kernel.org, edumazet@google.com,
pabeni@redhat.com, horms@kernel.org, andrew+netdev@lunn.ch,
daniel@iogearbox.net, Willem de Bruijn <willemb@google.com>
Subject: [PATCH net] net/packet: ignore timestamp bits when testing tx frame status
Date: Sun, 4 Oct 2026 13:10:53 -0400 [thread overview]
Message-ID: <20261004171847.186954-1-willemdebruijn.kernel@gmail.com> (raw)
From: Willem de Bruijn <willemb@google.com>
Since the commit in Fixes, the tx completion handler writes the frame
status as TP_STATUS_AVAILABLE | ts, where ts can be
TP_STATUS_TS_SOFTWARE or TP_STATUS_TS_RAW_HARDWARE.
Two places compare a tx frame status to TP_STATUS_AVAILABLE for
equality, and so fail to detect such a released frame:
- tpacket_snd(), when packet_xmit() fails: the packet is silently
dropped instead of an error being returned to the caller for retry.
- packet_poll(), on the tx ring head frame: the socket is not reported
as writable.
Mask out the timestamp bits in both. In packet_lookup_frame(), only do
so when testing a tx ring frame for TP_STATUS_AVAILABLE.
Fixes: b9c32fb27170 ("packet: if hw/sw ts enabled in rx/tx ring, report which ts we got")
Signed-off-by: Willem de Bruijn <willemb@google.com>
---
net/packet/af_packet.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 6ff16eef24f4..1cabe292ebb4 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -398,6 +398,10 @@ static inline struct page * __pure pgv_to_page(void *addr)
return virt_to_page(addr);
}
+/* Timestamp bits that may be set in addition to the frame state */
+static const u32 tp_status_ts_mask = TP_STATUS_TS_SOFTWARE |
+ TP_STATUS_TS_RAW_HARDWARE;
+
static void __packet_set_status(struct packet_sock *po, void *frame, int status)
{
union tpacket_uhdr h;
@@ -519,6 +523,7 @@ static void *packet_lookup_frame(const struct packet_sock *po,
{
unsigned int pg_vec_pos, frame_offset;
union tpacket_uhdr h;
+ u32 mask = 0;
pg_vec_pos = position / rb->frames_per_block;
frame_offset = position % rb->frames_per_block;
@@ -526,7 +531,10 @@ static void *packet_lookup_frame(const struct packet_sock *po,
h.raw = rb->pg_vec[pg_vec_pos].buffer +
(frame_offset * rb->frame_size);
- if (status != __packet_get_status(po, h.raw))
+ if (rb == &po->tx_ring && status == TP_STATUS_AVAILABLE)
+ mask = tp_status_ts_mask;
+
+ if (status != (__packet_get_status(po, h.raw) & ~mask))
return NULL;
return h.raw;
@@ -2948,7 +2956,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
if (unlikely(err != 0)) {
if (err > 0)
err = net_xmit_errno(err);
- if (err && __packet_get_status(po, ph) ==
+ if (err && (__packet_get_status(po, ph) & ~tp_status_ts_mask) ==
TP_STATUS_AVAILABLE) {
/* skb was destructed already */
skb = NULL;
--
2.56.0.rc1.315.gc6ed9934b7-goog
next reply other threads:[~2026-10-04 17:18 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-04 17:10 Willem de Bruijn [this message]
2026-10-04 17:24 ` [PATCH net] net/packet: ignore timestamp bits when testing tx frame status netdev-bot+sinfo
2026-10-04 22:37 ` Willem de Bruijn
2026-10-07 0:50 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261004171847.186954-1-willemdebruijn.kernel@gmail.com \
--to=willemdebruijn.kernel@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.