From: Yun Lu <luyun@kylinos.cn>
Due to the changes in commit 581073f626e3 ("af_packet: do not call
packet_read_pending() from tpacket_destruct_skb()"), every time
tpacket_destruct_skb() is executed, the skb_completion is marked as
completed. When wait_for_completion_interruptible_timeout() returns
completed, the pending_refcnt has not yet been reduced to zero.
Therefore, when ph is NULL, the wait function may need to be called
multiple times untill packet_read_pending() finally returns zero.
We should call sock_sndtimeo() only once, otherwise the SO_SNDTIMEO
constraint could be way off.
Fixes: 581073f626e3 ("af_packet: do not call packet_read_pending() from tpacket_destruct_skb()")
Cc: stable@kernel.org
Suggested-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Yun Lu <luyun@kylinos.cn>
---
net/packet/af_packet.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 3d43f3eae759..7089b8c2a655 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2785,7 +2785,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
int len_sum = 0;
int status = TP_STATUS_AVAILABLE;
int hlen, tlen, copylen = 0;
- long timeo = 0;
+ long timeo;
mutex_lock(&po->pg_vec_lock);
@@ -2839,6 +2839,7 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
if ((size_max > dev->mtu + reserve + VLAN_HLEN) && !vnet_hdr_sz)
size_max = dev->mtu + reserve + VLAN_HLEN;
+ timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT);
reinit_completion(&po->skb_completion);
do {
@@ -2846,7 +2847,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
TP_STATUS_SEND_REQUEST);
if (unlikely(ph == NULL)) {
if (need_wait && skb) {
- timeo = sock_sndtimeo(&po->sk, msg->msg_flags & MSG_DONTWAIT);
timeo = wait_for_completion_interruptible_timeout(&po->skb_completion, timeo);
if (timeo <= 0) {
err = !timeo ? -ETIMEDOUT : -ERESTARTSYS;
--
2.43.0
On Wed, Jul 09, 2025 at 05:56:52PM +0800, Yun Lu wrote: > From: Yun Lu <luyun@kylinos.cn> > > Due to the changes in commit 581073f626e3 ("af_packet: do not call > packet_read_pending() from tpacket_destruct_skb()"), every time > tpacket_destruct_skb() is executed, the skb_completion is marked as > completed. When wait_for_completion_interruptible_timeout() returns > completed, the pending_refcnt has not yet been reduced to zero. > Therefore, when ph is NULL, the wait function may need to be called > multiple times untill packet_read_pending() finally returns zero. nit: until > > We should call sock_sndtimeo() only once, otherwise the SO_SNDTIMEO > constraint could be way off. > > Fixes: 581073f626e3 ("af_packet: do not call packet_read_pending() from tpacket_destruct_skb()") > Cc: stable@kernel.org > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Yun Lu <luyun@kylinos.cn> ...
Yun Lu wrote: > From: Yun Lu <luyun@kylinos.cn> > > Due to the changes in commit 581073f626e3 ("af_packet: do not call > packet_read_pending() from tpacket_destruct_skb()"), every time > tpacket_destruct_skb() is executed, the skb_completion is marked as > completed. When wait_for_completion_interruptible_timeout() returns > completed, the pending_refcnt has not yet been reduced to zero. > Therefore, when ph is NULL, the wait function may need to be called > multiple times untill packet_read_pending() finally returns zero. > > We should call sock_sndtimeo() only once, otherwise the SO_SNDTIMEO > constraint could be way off. > > Fixes: 581073f626e3 ("af_packet: do not call packet_read_pending() from tpacket_destruct_skb()") > Cc: stable@kernel.org > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Yun Lu <luyun@kylinos.cn> Reviewed-by: Willem de Bruijn <willemb@google.com>
On Wed, Jul 9, 2025 at 2:57 AM Yun Lu <luyun_611@163.com> wrote: > > From: Yun Lu <luyun@kylinos.cn> > > Due to the changes in commit 581073f626e3 ("af_packet: do not call > packet_read_pending() from tpacket_destruct_skb()"), every time > tpacket_destruct_skb() is executed, the skb_completion is marked as > completed. When wait_for_completion_interruptible_timeout() returns > completed, the pending_refcnt has not yet been reduced to zero. > Therefore, when ph is NULL, the wait function may need to be called > multiple times untill packet_read_pending() finally returns zero. > > We should call sock_sndtimeo() only once, otherwise the SO_SNDTIMEO > constraint could be way off. > > Fixes: 581073f626e3 ("af_packet: do not call packet_read_pending() from tpacket_destruct_skb()") > Cc: stable@kernel.org > Suggested-by: Eric Dumazet <edumazet@google.com> > Signed-off-by: Yun Lu <luyun@kylinos.cn> Reviewed-by: Eric Dumazet <edumazet@google.com>
© 2016 - 2025 Red Hat, Inc.