]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
netdevice: convert private flags > BIT(31) to bitfields
authorAlexander Lobakin <aleksander.lobakin@intel.com>
Thu, 29 Aug 2024 12:33:36 +0000 (14:33 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 3 Sep 2024 09:36:43 +0000 (11:36 +0200)
Make dev->priv_flags `u32` back and define bits higher than 31 as
bitfield booleans as per Jakub's suggestion. This simplifies code
which accesses these bits with no optimization loss (testb both
before/after), allows to not extend &netdev_priv_flags each time,
but also scales better as bits > 63 in the future would only add
a new u64 to the structure with no complications, comparing to
that extending ::priv_flags would require converting it to a bitmap.
Note that I picked `unsigned long :1` to not lose any potential
optimizations comparing to `bool :1` etc.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Documentation/networking/net_cachelines/net_device.rst
drivers/net/ethernet/microchip/lan966x/lan966x_main.c
drivers/net/macvlan.c
drivers/net/vxlan/vxlan_core.c
include/linux/netdevice.h
net/8021q/vlanproc.c
net/core/dev.c
net/core/dev_ioctl.c
net/core/rtnetlink.c

index a0e0fab8161ad5a0f15b799aadabd11a71adc634..1fe3cdfe35822d3c77cf0822c6c1d20386cd7cb8 100644 (file)
@@ -7,6 +7,7 @@ net_device struct fast path usage breakdown
 
 Type                                Name                    fastpath_tx_access  fastpath_rx_access  Comments
 ..struct                            ..net_device                                                    
+unsigned_long:32                    priv_flags              read_mostly         -                   __dev_queue_xmit(tx)
 char                                name[16]                -                   -                   
 struct_netdev_name_node*            name_node                                                       
 struct_dev_ifalias*                 ifalias                                                         
@@ -23,7 +24,6 @@ struct_list_head                    ptype_specific
 struct                              adj_list                                                        
 unsigned_int                        flags                   read_mostly         read_mostly         __dev_queue_xmit,__dev_xmit_skb,ip6_output,__ip6_finish_output(tx);ip6_rcv_core(rx)
 xdp_features_t                      xdp_features                                                    
-unsigned_long_long                  priv_flags              read_mostly         -                   __dev_queue_xmit(tx)
 struct_net_device_ops*              netdev_ops              read_mostly         -                   netdev_core_pick_tx,netdev_start_xmit(tx)
 struct_xdp_metadata_ops*            xdp_metadata_ops                                                
 int                                 ifindex                 -                   read_mostly         ip6_rcv_core
@@ -163,6 +163,8 @@ struct_lock_class_key*              qdisc_tx_busylock
 bool                                proto_down                                                      
 unsigned:1                          wol_enabled                                                     
 unsigned:1                          threaded                -                   -                   napi_poll(napi_enable,dev_set_threaded)
+unsigned_long:1                     see_all_hwtstamp_requests                                       
+unsigned_long:1                     change_proto_down                                               
 struct_list_head                    net_notifier_list                                               
 struct_macsec_ops*                  macsec_ops                                                      
 struct_udp_tunnel_nic_info*         udp_tunnel_nic_info                                             
index ec672af12e2515803745ef7833c65923ae841b1e..534d4716d5f7d4bd670e1b6a133a4e5b0ebeac9f 100644 (file)
@@ -816,7 +816,7 @@ static int lan966x_probe_port(struct lan966x *lan966x, u32 p,
                         NETIF_F_HW_VLAN_STAG_TX |
                         NETIF_F_HW_TC;
        dev->hw_features |= NETIF_F_HW_TC;
-       dev->priv_flags |= IFF_SEE_ALL_HWTSTAMP_REQUESTS;
+       dev->see_all_hwtstamp_requests = true;
        dev->needed_headroom = IFH_LEN_BYTES;
 
        eth_hw_addr_gen(dev, lan966x->base_mac, p + 1);
index 24298a33e0e94851ebf9c704c723f25ac7bf5eec..b45f137f365e7adf759106c97a785a499bf7f2c3 100644 (file)
@@ -1213,7 +1213,8 @@ void macvlan_common_setup(struct net_device *dev)
        dev->max_mtu            = ETH_MAX_MTU;
        dev->priv_flags        &= ~IFF_TX_SKB_SHARING;
        netif_keep_dst(dev);
-       dev->priv_flags        |= IFF_UNICAST_FLT | IFF_CHANGE_PROTO_DOWN;
+       dev->priv_flags        |= IFF_UNICAST_FLT;
+       dev->change_proto_down  = true;
        dev->netdev_ops         = &macvlan_netdev_ops;
        dev->needs_free_netdev  = true;
        dev->priv_destructor    = macvlan_dev_free;
index 34391c18bba7e93181b7819b9dbfd44fb69cd82d..4a54dd1950c1005808bd6b68d833952101706862 100644 (file)
@@ -3331,7 +3331,8 @@ static void vxlan_setup(struct net_device *dev)
        dev->hw_features |= NETIF_F_RXCSUM;
        dev->hw_features |= NETIF_F_GSO_SOFTWARE;
        netif_keep_dst(dev);
-       dev->priv_flags |= IFF_NO_QUEUE | IFF_CHANGE_PROTO_DOWN;
+       dev->priv_flags |= IFF_NO_QUEUE;
+       dev->change_proto_down = true;
 
        /* MTU range: 68 - 65535 */
        dev->min_mtu = ETH_MIN_MTU;
index fce70990b209ccc30f65a91fae639421fc4dab97..d6f35c9d8580d22c55417bfc0e743998095866f5 100644 (file)
@@ -1613,7 +1613,8 @@ struct net_device_ops {
  * userspace; this means that the order of these flags can change
  * during any kernel release.
  *
- * You should have a pretty good reason to be extending these flags.
+ * You should add bitfield booleans after either net_device::priv_flags
+ * (hotpath) or ::threaded (slowpath) instead of extending these flags.
  *
  * @IFF_802_1Q_VLAN: 802.1Q VLAN device
  * @IFF_EBRIDGE: Ethernet bridging device
@@ -1652,10 +1653,6 @@ struct net_device_ops {
  * @IFF_NO_ADDRCONF: prevent ipv6 addrconf
  * @IFF_TX_SKB_NO_LINEAR: device/driver is capable of xmitting frames with
  *     skb_headlen(skb) == 0 (data starts from frag0)
- * @IFF_CHANGE_PROTO_DOWN: device supports setting carrier via IFLA_PROTO_DOWN
- * @IFF_SEE_ALL_HWTSTAMP_REQUESTS: device wants to see calls to
- *     ndo_hwtstamp_set() for all timestamp requests regardless of source,
- *     even if those aren't HWTSTAMP_SOURCE_NETDEV.
  */
 enum netdev_priv_flags {
        IFF_802_1Q_VLAN                 = 1<<0,
@@ -1690,8 +1687,6 @@ enum netdev_priv_flags {
        IFF_L3MDEV_RX_HANDLER           = 1<<29,
        IFF_NO_ADDRCONF                 = BIT_ULL(30),
        IFF_TX_SKB_NO_LINEAR            = BIT_ULL(31),
-       IFF_CHANGE_PROTO_DOWN           = BIT_ULL(32),
-       IFF_SEE_ALL_HWTSTAMP_REQUESTS   = BIT_ULL(33),
 };
 
 /* Specifies the type of the struct net_device::ml_priv pointer */
@@ -1723,6 +1718,9 @@ enum netdev_reg_state {
  *     data with strictly "high-level" data, and it has to know about
  *     almost every data structure used in the INET module.
  *
+ *     @priv_flags:    flags invisible to userspace defined as bits, see
+ *                     enum netdev_priv_flags for the definitions
+ *
  *     @name:  This is the first field of the "visible" part of this structure
  *             (i.e. as seen by users in the "Space.c" file).  It is the name
  *             of the interface.
@@ -1789,8 +1787,6 @@ enum netdev_reg_state {
  *
  *     @flags:         Interface flags (a la BSD)
  *     @xdp_features:  XDP capability supported by the device
- *     @priv_flags:    Like 'flags' but invisible to userspace,
- *                     see if.h for the definitions
  *     @gflags:        Global flags ( kept as legacy )
  *     @priv_len:      Size of the ->priv flexible array
  *     @priv:          Flexible array containing private data
@@ -1964,6 +1960,12 @@ enum netdev_reg_state {
  *
  *     @threaded:      napi threaded mode is enabled
  *
+ *     @see_all_hwtstamp_requests: device wants to see calls to
+ *                     ndo_hwtstamp_set() for all timestamp requests
+ *                     regardless of source, even if those aren't
+ *                     HWTSTAMP_SOURCE_NETDEV
+ *     @change_proto_down: device supports setting carrier via IFLA_PROTO_DOWN
+ *
  *     @net_notifier_list:     List of per-net netdev notifier block
  *                             that follow this device when it is moved
  *                             to another network namespace.
@@ -2014,7 +2016,9 @@ struct net_device {
 
        /* TX read-mostly hotpath */
        __cacheline_group_begin(net_device_read_tx);
-       unsigned long long      priv_flags;
+       struct_group(priv_flags_fast,
+               unsigned long           priv_flags:32;
+       );
        const struct net_device_ops *netdev_ops;
        const struct header_ops *header_ops;
        struct netdev_queue     *_tx;
@@ -2350,6 +2354,10 @@ struct net_device {
        bool                    proto_down;
        bool                    threaded;
 
+       /* priv_flags_slow, ungrouped to save space */
+       unsigned long           see_all_hwtstamp_requests:1;
+       unsigned long           change_proto_down:1;
+
        struct list_head        net_notifier_list;
 
 #if IS_ENABLED(CONFIG_MACSEC)
index 87b959da00cd3844de1b56b45045e88e6a0293ba..fa67374bda494c343bd96b3df167f242918f6de9 100644 (file)
@@ -238,9 +238,9 @@ static int vlandev_seq_show(struct seq_file *seq, void *offset)
 
        stats = dev_get_stats(vlandev, &temp);
        seq_printf(seq,
-                  "%s  VID: %d  REORDER_HDR: %i  dev->priv_flags: %llx\n",
+                  "%s  VID: %d  REORDER_HDR: %i  dev->priv_flags: %x\n",
                   vlandev->name, vlan->vlan_id,
-                  (int)(vlan->flags & 1), vlandev->priv_flags);
+                  (int)(vlan->flags & 1), (u32)vlandev->priv_flags);
 
        seq_printf(seq, fmt64, "total frames received", stats->rx_packets);
        seq_printf(seq, fmt64, "total bytes received", stats->rx_bytes);
index 932d67b975f5013281e4efd7786fc18061797a23..56aed88ceadfe3150fb05be5695d4cdbdc34c153 100644 (file)
@@ -9274,7 +9274,7 @@ EXPORT_SYMBOL(netdev_port_same_parent_id);
  */
 int dev_change_proto_down(struct net_device *dev, bool proto_down)
 {
-       if (!(dev->priv_flags & IFF_CHANGE_PROTO_DOWN))
+       if (!dev->change_proto_down)
                return -EOPNOTSUPP;
        if (!netif_device_present(dev))
                return -ENODEV;
@@ -11930,7 +11930,7 @@ static struct pernet_operations __net_initdata default_device_ops = {
 static void __init net_dev_struct_check(void)
 {
        /* TX read-mostly hotpath */
-       CACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, priv_flags);
+       CACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, priv_flags_fast);
        CACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, netdev_ops);
        CACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, header_ops);
        CACHELINE_ASSERT_GROUP_MEMBER(struct net_device, net_device_read_tx, _tx);
index 8592c052c0f4f37c102777a68e44d52860288493..473c437b6b5386bd7ff4ff2256ef84ad800ce7fc 100644 (file)
@@ -317,8 +317,7 @@ static int dev_get_hwtstamp(struct net_device *dev, struct ifreq *ifr)
  * should take precedence in front of hardware timestamping provided by the
  * netdev. If the netdev driver needs to perform specific actions even for PHY
  * timestamping to work properly (a switch port must trap the timestamped
- * frames and not forward them), it must set IFF_SEE_ALL_HWTSTAMP_REQUESTS in
- * dev->priv_flags.
+ * frames and not forward them), it must set dev->see_all_hwtstamp_requests.
  */
 int dev_set_hwtstamp_phylib(struct net_device *dev,
                            struct kernel_hwtstamp_config *cfg,
@@ -332,13 +331,13 @@ int dev_set_hwtstamp_phylib(struct net_device *dev,
 
        cfg->source = phy_ts ? HWTSTAMP_SOURCE_PHYLIB : HWTSTAMP_SOURCE_NETDEV;
 
-       if (phy_ts && (dev->priv_flags & IFF_SEE_ALL_HWTSTAMP_REQUESTS)) {
+       if (phy_ts && dev->see_all_hwtstamp_requests) {
                err = ops->ndo_hwtstamp_get(dev, &old_cfg);
                if (err)
                        return err;
        }
 
-       if (!phy_ts || (dev->priv_flags & IFF_SEE_ALL_HWTSTAMP_REQUESTS)) {
+       if (!phy_ts || dev->see_all_hwtstamp_requests) {
                err = ops->ndo_hwtstamp_set(dev, cfg, extack);
                if (err) {
                        if (extack->_msg)
@@ -347,7 +346,7 @@ int dev_set_hwtstamp_phylib(struct net_device *dev,
                }
        }
 
-       if (phy_ts && (dev->priv_flags & IFF_SEE_ALL_HWTSTAMP_REQUESTS))
+       if (phy_ts && dev->see_all_hwtstamp_requests)
                changed = kernel_hwtstamp_config_changed(&old_cfg, cfg);
 
        if (phy_ts) {
index cd9487a12d1a30401ed85fd28acfe80033c46d04..f0a52098708584aa27461b7ee941fa324adcaf20 100644 (file)
@@ -2724,7 +2724,7 @@ static int do_set_proto_down(struct net_device *dev,
        bool proto_down;
        int err;
 
-       if (!(dev->priv_flags & IFF_CHANGE_PROTO_DOWN)) {
+       if (!dev->change_proto_down) {
                NL_SET_ERR_MSG(extack,  "Protodown not supported by device");
                return -EOPNOTSUPP;
        }