wifi: free SKBTX_WIFI_STATUS skb tx_flags flag
authorJohannes Berg <johannes.berg@intel.com>
Thu, 13 Mar 2025 12:49:39 +0000 (13:49 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Apr 2025 13:09:25 +0000 (15:09 +0200)
Jason mentioned at netdevconf that we've run out of tx_flags in
the skb_shinfo(). Gain one bit back by removing the wifi bit.

We can do that because the only userspace application for it
(hostapd) doesn't change the setting on the socket, it just
uses different sockets, and normally doesn't even use this any
more, sending the frames over nl80211 instead.

Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Link: https://patch.msgid.link/20250313134942.52ff54a140ec.If390bbdc46904cf451256ba989d7a056c457af6e@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/ath/wil6210/txrx.h
drivers/net/wireless/marvell/mwifiex/main.c
include/linux/skbuff.h
include/net/sock.h
net/mac80211/mesh.c
net/mac80211/tx.c

index 689f68d89a440cb96df508df18a8853e5edc4498..33ccd0b248d4e23379c250644a8c12edc1139e9e 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef WIL6210_TXRX_H
 #define WIL6210_TXRX_H
 
+#include <net/sock.h>
 #include "wil6210.h"
 #include "txrx_edma.h"
 
@@ -617,7 +618,7 @@ static inline bool wil_need_txstat(struct sk_buff *skb)
        const u8 *da = wil_skb_get_da(skb);
 
        return is_unicast_ether_addr(da) && skb->sk &&
-              (skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS);
+              sock_flag(skb->sk, SOCK_WIFI_STATUS);
 }
 
 static inline void wil_consume_skb(struct sk_buff *skb, bool acked)
index 0e1f53940401431138805dc60ebf87443124d211..40b48386cfa9ea23182abd51ddd6c5c73746c290 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <linux/suspend.h>
+#include <net/sock.h>
 
 #include "main.h"
 #include "wmm.h"
@@ -939,7 +940,7 @@ mwifiex_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        multicast = is_multicast_ether_addr(skb->data);
 
        if (unlikely(!multicast && skb->sk &&
-                    skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS &&
+                    sock_flag(skb->sk, SOCK_WIFI_STATUS) &&
                     priv->adapter->fw_api_ver == MWIFIEX_FW_V15))
                skb = mwifiex_clone_skb_for_tx_status(priv,
                                                      skb,
index b974a277975a8a7b6f40c362542e9e8522539009..9ee39670e8f4021a92a7b74b17b1437418b340f7 100644 (file)
@@ -481,9 +481,6 @@ enum {
        /* generate software time stamp on packet tx completion */
        SKBTX_COMPLETION_TSTAMP = 1 << 3,
 
-       /* generate wifi status information (where possible) */
-       SKBTX_WIFI_STATUS = 1 << 4,
-
        /* determine hardware time stamp based on time or cycles */
        SKBTX_HW_TSTAMP_NETDEV = 1 << 5,
 
index 694f954258d4372ed33d6eb298c4247519df635c..36b2191097908be5c0c7a8ad166352207dc5e408 100644 (file)
@@ -2736,8 +2736,6 @@ static inline void _sock_tx_timestamp(struct sock *sk,
                                *tskey = atomic_inc_return(&sk->sk_tskey) - 1;
                }
        }
-       if (unlikely(sock_flag(sk, SOCK_WIFI_STATUS)))
-               *tx_flags |= SKBTX_WIFI_STATUS;
 }
 
 static inline void sock_tx_timestamp(struct sock *sk,
index 7257f5610af5a3ebd7ef777d07f7ebbcd7db0aa7..e2ce11ddb1112b513eed822c92f3ebb0b78f52e2 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/slab.h>
 #include <linux/unaligned.h>
+#include <net/sock.h>
 #include "ieee80211_i.h"
 #include "mesh.h"
 #include "wme.h"
@@ -776,7 +777,7 @@ bool ieee80211_mesh_xmit_fast(struct ieee80211_sub_if_data *sdata,
        if (ethertype < ETH_P_802_3_MIN)
                return false;
 
-       if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
+       if (skb->sk && sock_flag(skb->sk, SOCK_WIFI_STATUS))
                return false;
 
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
index 20179db88c4a6c88e49617204b16840b6a36556b..b75f72fbefd9212cdbc78493442ee564672d5a15 100644 (file)
@@ -26,6 +26,7 @@
 #include <net/codel_impl.h>
 #include <linux/unaligned.h>
 #include <net/fq_impl.h>
+#include <net/sock.h>
 #include <net/gso.h>
 
 #include "ieee80211_i.h"
@@ -2876,8 +2877,7 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
        }
 
        if (unlikely(!multicast &&
-                    ((skb->sk &&
-                      skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS) ||
+                    ((skb->sk && sock_flag(skb->sk, SOCK_WIFI_STATUS)) ||
                      ctrl_flags & IEEE80211_TX_CTL_REQ_TX_STATUS)))
                info_id = ieee80211_store_ack_skb(local, skb, &info_flags,
                                                  cookie);
@@ -3774,7 +3774,7 @@ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
                return false;
 
        /* don't handle TX status request here either */
-       if (skb->sk && skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)
+       if (skb->sk && sock_flag(skb->sk, SOCK_WIFI_STATUS))
                return false;
 
        if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
@@ -4664,8 +4664,7 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
                        memcpy(IEEE80211_SKB_CB(seg), info, sizeof(*info));
        }
 
-       if (unlikely(skb->sk &&
-                    skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) {
+       if (unlikely(skb->sk && sock_flag(skb->sk, SOCK_WIFI_STATUS))) {
                info->status_data = ieee80211_store_ack_skb(local, skb,
                                                            &info->flags, NULL);
                if (info->status_data)