Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: skb: free up one bit in tx_flags

The linked series wants to add skb tx completion timestamps.
That needs a bit in skb_shared_info.tx_flags, but all are in use.

A per-skb bit is only needed for features that are configured on a
per packet basis. Per socket features can be read from sk->sk_tsflags.

Per packet tsflags can be set in sendmsg using cmsg, but only those in
SOF_TIMESTAMPING_TX_RECORD_MASK.

Per packet tsflags can also be set without cmsg by sandwiching a
send inbetween two setsockopts:

val |= SOF_TIMESTAMPING_$FEATURE;
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val));
write(fd, buf, sz);
val &= ~SOF_TIMESTAMPING_$FEATURE;
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val));

Changing a datapath test from skb_shinfo(skb)->tx_flags to
skb->sk->sk_tsflags can change behavior in that case, as the tx_flags
is written before the second setsockopt updates sk_tsflags.

Therefore, only bits can be reclaimed that cannot be set by cmsg and
are also highly unlikely to be used to target individual packets
otherwise.

Free up the bit currently used for SKBTX_HW_TSTAMP_USE_CYCLES. This
selects between clock and free running counter source for HW TX
timestamps. It is probable that all packets of the same socket will
always use the same source.

Link: https://lore.kernel.org/netdev/cover.1739988644.git.pav@iki.fi/
Signed-off-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Reviewed-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Link: https://patch.msgid.link/20250225023416.2088705-1-willemdebruijn.kernel@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Willem de Bruijn and committed by
Jakub Kicinski
e6116fc6 80c4a001

+7 -16
+2 -2
drivers/net/ethernet/engleder/tsnep_main.c
··· 852 852 struct skb_shared_hwtstamps hwtstamps; 853 853 u64 timestamp; 854 854 855 - if (skb_shinfo(entry->skb)->tx_flags & 856 - SKBTX_HW_TSTAMP_USE_CYCLES) 855 + if (entry->skb->sk && 856 + READ_ONCE(entry->skb->sk->sk_tsflags) & SOF_TIMESTAMPING_BIND_PHC) 857 857 timestamp = 858 858 __le64_to_cpu(entry->desc_wb->counter); 859 859 else
+2 -1
drivers/net/ethernet/intel/igc/igc_main.c
··· 1668 1668 if (igc_request_tx_tstamp(adapter, skb, &tstamp_flags)) { 1669 1669 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; 1670 1670 tx_flags |= IGC_TX_FLAGS_TSTAMP | tstamp_flags; 1671 - if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP_USE_CYCLES) 1671 + if (skb->sk && 1672 + READ_ONCE(skb->sk->sk_tsflags) & SOF_TIMESTAMPING_BIND_PHC) 1672 1673 tx_flags |= IGC_TX_FLAGS_TSTAMP_TIMER_1; 1673 1674 } else { 1674 1675 adapter->tx_hwtstamp_skipped++;
+2 -3
include/linux/skbuff.h
··· 478 478 /* device driver is going to provide hardware time stamp */ 479 479 SKBTX_IN_PROGRESS = 1 << 2, 480 480 481 - /* generate hardware time stamp based on cycles if supported */ 482 - SKBTX_HW_TSTAMP_USE_CYCLES = 1 << 3, 481 + /* reserved */ 482 + SKBTX_RESERVED = 1 << 3, 483 483 484 484 /* generate wifi status information (where possible) */ 485 485 SKBTX_WIFI_STATUS = 1 << 4, ··· 500 500 SKBTX_SCHED_TSTAMP | \ 501 501 SKBTX_BPF) 502 502 #define SKBTX_ANY_TSTAMP (SKBTX_HW_TSTAMP | \ 503 - SKBTX_HW_TSTAMP_USE_CYCLES | \ 504 503 SKBTX_ANY_SW_TSTAMP) 505 504 506 505 /* Definitions for flags in struct skb_shared_info */
+1 -10
net/socket.c
··· 680 680 { 681 681 u8 flags = *tx_flags; 682 682 683 - if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) { 683 + if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) 684 684 flags |= SKBTX_HW_TSTAMP_NOBPF; 685 - 686 - /* PTP hardware clocks can provide a free running cycle counter 687 - * as a time base for virtual clocks. Tell driver to use the 688 - * free running cycle counter for timestamp if socket is bound 689 - * to virtual clock. 690 - */ 691 - if (tsflags & SOF_TIMESTAMPING_BIND_PHC) 692 - flags |= SKBTX_HW_TSTAMP_USE_CYCLES; 693 - } 694 685 695 686 if (tsflags & SOF_TIMESTAMPING_TX_SOFTWARE) 696 687 flags |= SKBTX_SW_TSTAMP;