We almost ran out of unsigned int bitwidth. Define priv flags and
check for potential overflow in the fashion of netdev_features_t.
Defined this way, priv_flags can be easily expanded later with
just changing its typedef.

Signed-off-by: Alexander Lobakin <aloba...@pm.me>
Reported-by: kernel test robot <l...@intel.com> # Inverted assert condition
---
 include/linux/netdevice.h | 199 ++++++++++++++++++++------------------
 1 file changed, 105 insertions(+), 94 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 3b6f82c2c271..2c1a642ecdc0 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1483,107 +1483,118 @@ struct net_device_ops {
  *
  * You should have a pretty good reason to be extending these flags.
  *
- * @IFF_802_1Q_VLAN: 802.1Q VLAN device
- * @IFF_EBRIDGE: Ethernet bridging device
- * @IFF_BONDING: bonding master or slave
- * @IFF_ISATAP: ISATAP interface (RFC4214)
- * @IFF_WAN_HDLC: WAN HDLC device
- * @IFF_XMIT_DST_RELEASE: dev_hard_start_xmit() is allowed to
+ * @IFF_802_1Q_VLAN_BIT: 802.1Q VLAN device
+ * @IFF_EBRIDGE_BIT: Ethernet bridging device
+ * @IFF_BONDING_BIT: bonding master or slave
+ * @IFF_ISATAP_BIT: ISATAP interface (RFC4214)
+ * @IFF_WAN_HDLC_BIT: WAN HDLC device
+ * @IFF_XMIT_DST_RELEASE_BIT: dev_hard_start_xmit() is allowed to
  *     release skb->dst
- * @IFF_DONT_BRIDGE: disallow bridging this ether dev
- * @IFF_DISABLE_NETPOLL: disable netpoll at run-time
- * @IFF_MACVLAN_PORT: device used as macvlan port
- * @IFF_BRIDGE_PORT: device used as bridge port
- * @IFF_OVS_DATAPATH: device used as Open vSwitch datapath port
- * @IFF_TX_SKB_SHARING: The interface supports sharing skbs on transmit
- * @IFF_UNICAST_FLT: Supports unicast filtering
- * @IFF_TEAM_PORT: device used as team port
- * @IFF_SUPP_NOFCS: device supports sending custom FCS
- * @IFF_LIVE_ADDR_CHANGE: device supports hardware address
+ * @IFF_DONT_BRIDGE_BIT: disallow bridging this ether dev
+ * @IFF_DISABLE_NETPOLL_BIT: disable netpoll at run-time
+ * @IFF_MACVLAN_PORT_BIT: device used as macvlan port
+ * @IFF_BRIDGE_PORT_BIT: device used as bridge port
+ * @IFF_OVS_DATAPATH_BIT: device used as Open vSwitch datapath port
+ * @IFF_TX_SKB_SHARING_BIT: The interface supports sharing skbs on transmit
+ * @IFF_UNICAST_FLT_BIT: Supports unicast filtering
+ * @IFF_TEAM_PORT_BIT: device used as team port
+ * @IFF_SUPP_NOFCS_BIT: device supports sending custom FCS
+ * @IFF_LIVE_ADDR_CHANGE_BIT: device supports hardware address
  *     change when it's running
- * @IFF_MACVLAN: Macvlan device
- * @IFF_XMIT_DST_RELEASE_PERM: IFF_XMIT_DST_RELEASE not taking into account
+ * @IFF_MACVLAN_BIT: Macvlan device
+ * @IFF_XMIT_DST_RELEASE_PERM_BIT: IFF_XMIT_DST_RELEASE not taking into account
  *     underlying stacked devices
- * @IFF_L3MDEV_MASTER: device is an L3 master device
- * @IFF_NO_QUEUE: device can run without qdisc attached
- * @IFF_OPENVSWITCH: device is a Open vSwitch master
- * @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device
- * @IFF_TEAM: device is a team device
- * @IFF_RXFH_CONFIGURED: device has had Rx Flow indirection table configured
- * @IFF_PHONY_HEADROOM: the headroom value is controlled by an external
+ * @IFF_L3MDEV_MASTER_BIT: device is an L3 master device
+ * @IFF_NO_QUEUE_BIT: device can run without qdisc attached
+ * @IFF_OPENVSWITCH_BIT: device is a Open vSwitch master
+ * @IFF_L3MDEV_SLAVE_BIT: device is enslaved to an L3 master device
+ * @IFF_TEAM_BIT: device is a team device
+ * @IFF_RXFH_CONFIGURED_BIT: device has had Rx Flow indirection table 
configured
+ * @IFF_PHONY_HEADROOM_BIT: the headroom value is controlled by an external
  *     entity (i.e. the master device for bridged veth)
- * @IFF_MACSEC: device is a MACsec device
- * @IFF_NO_RX_HANDLER: device doesn't support the rx_handler hook
- * @IFF_FAILOVER: device is a failover master device
- * @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device
- * @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device
- * @IFF_LIVE_RENAME_OK: rename is allowed while device is up and running
+ * @IFF_MACSEC_BIT: device is a MACsec device
+ * @IFF_NO_RX_HANDLER_BIT: device doesn't support the rx_handler hook
+ * @IFF_FAILOVER_BIT: device is a failover master device
+ * @IFF_FAILOVER_SLAVE_BIT: device is lower dev of a failover master device
+ * @IFF_L3MDEV_RX_HANDLER_BIT: only invoke the rx handler of L3 master device
+ * @IFF_LIVE_RENAME_OK_BIT: rename is allowed while device is up and running
+ *
+ * @NETDEV_PRIV_FLAG_COUNT: total priv flags count
  */
 enum netdev_priv_flags {
-       IFF_802_1Q_VLAN                 = 1<<0,
-       IFF_EBRIDGE                     = 1<<1,
-       IFF_BONDING                     = 1<<2,
-       IFF_ISATAP                      = 1<<3,
-       IFF_WAN_HDLC                    = 1<<4,
-       IFF_XMIT_DST_RELEASE            = 1<<5,
-       IFF_DONT_BRIDGE                 = 1<<6,
-       IFF_DISABLE_NETPOLL             = 1<<7,
-       IFF_MACVLAN_PORT                = 1<<8,
-       IFF_BRIDGE_PORT                 = 1<<9,
-       IFF_OVS_DATAPATH                = 1<<10,
-       IFF_TX_SKB_SHARING              = 1<<11,
-       IFF_UNICAST_FLT                 = 1<<12,
-       IFF_TEAM_PORT                   = 1<<13,
-       IFF_SUPP_NOFCS                  = 1<<14,
-       IFF_LIVE_ADDR_CHANGE            = 1<<15,
-       IFF_MACVLAN                     = 1<<16,
-       IFF_XMIT_DST_RELEASE_PERM       = 1<<17,
-       IFF_L3MDEV_MASTER               = 1<<18,
-       IFF_NO_QUEUE                    = 1<<19,
-       IFF_OPENVSWITCH                 = 1<<20,
-       IFF_L3MDEV_SLAVE                = 1<<21,
-       IFF_TEAM                        = 1<<22,
-       IFF_RXFH_CONFIGURED             = 1<<23,
-       IFF_PHONY_HEADROOM              = 1<<24,
-       IFF_MACSEC                      = 1<<25,
-       IFF_NO_RX_HANDLER               = 1<<26,
-       IFF_FAILOVER                    = 1<<27,
-       IFF_FAILOVER_SLAVE              = 1<<28,
-       IFF_L3MDEV_RX_HANDLER           = 1<<29,
-       IFF_LIVE_RENAME_OK              = 1<<30,
+       IFF_802_1Q_VLAN_BIT,
+       IFF_EBRIDGE_BIT,
+       IFF_BONDING_BIT,
+       IFF_ISATAP_BIT,
+       IFF_WAN_HDLC_BIT,
+       IFF_XMIT_DST_RELEASE_BIT,
+       IFF_DONT_BRIDGE_BIT,
+       IFF_DISABLE_NETPOLL_BIT,
+       IFF_MACVLAN_PORT_BIT,
+       IFF_BRIDGE_PORT_BIT,
+       IFF_OVS_DATAPATH_BIT,
+       IFF_TX_SKB_SHARING_BIT,
+       IFF_UNICAST_FLT_BIT,
+       IFF_TEAM_PORT_BIT,
+       IFF_SUPP_NOFCS_BIT,
+       IFF_LIVE_ADDR_CHANGE_BIT,
+       IFF_MACVLAN_BIT,
+       IFF_XMIT_DST_RELEASE_PERM_BIT,
+       IFF_L3MDEV_MASTER_BIT,
+       IFF_NO_QUEUE_BIT,
+       IFF_OPENVSWITCH_BIT,
+       IFF_L3MDEV_SLAVE_BIT,
+       IFF_TEAM_BIT,
+       IFF_RXFH_CONFIGURED_BIT,
+       IFF_PHONY_HEADROOM_BIT,
+       IFF_MACSEC_BIT,
+       IFF_NO_RX_HANDLER_BIT,
+       IFF_FAILOVER_BIT,
+       IFF_FAILOVER_SLAVE_BIT,
+       IFF_L3MDEV_RX_HANDLER_BIT,
+       IFF_LIVE_RENAME_OK_BIT,
+
+       NETDEV_PRIV_FLAG_COUNT,
 };
 
-#define IFF_802_1Q_VLAN                        IFF_802_1Q_VLAN
-#define IFF_EBRIDGE                    IFF_EBRIDGE
-#define IFF_BONDING                    IFF_BONDING
-#define IFF_ISATAP                     IFF_ISATAP
-#define IFF_WAN_HDLC                   IFF_WAN_HDLC
-#define IFF_XMIT_DST_RELEASE           IFF_XMIT_DST_RELEASE
-#define IFF_DONT_BRIDGE                        IFF_DONT_BRIDGE
-#define IFF_DISABLE_NETPOLL            IFF_DISABLE_NETPOLL
-#define IFF_MACVLAN_PORT               IFF_MACVLAN_PORT
-#define IFF_BRIDGE_PORT                        IFF_BRIDGE_PORT
-#define IFF_OVS_DATAPATH               IFF_OVS_DATAPATH
-#define IFF_TX_SKB_SHARING             IFF_TX_SKB_SHARING
-#define IFF_UNICAST_FLT                        IFF_UNICAST_FLT
-#define IFF_TEAM_PORT                  IFF_TEAM_PORT
-#define IFF_SUPP_NOFCS                 IFF_SUPP_NOFCS
-#define IFF_LIVE_ADDR_CHANGE           IFF_LIVE_ADDR_CHANGE
-#define IFF_MACVLAN                    IFF_MACVLAN
-#define IFF_XMIT_DST_RELEASE_PERM      IFF_XMIT_DST_RELEASE_PERM
-#define IFF_L3MDEV_MASTER              IFF_L3MDEV_MASTER
-#define IFF_NO_QUEUE                   IFF_NO_QUEUE
-#define IFF_OPENVSWITCH                        IFF_OPENVSWITCH
-#define IFF_L3MDEV_SLAVE               IFF_L3MDEV_SLAVE
-#define IFF_TEAM                       IFF_TEAM
-#define IFF_RXFH_CONFIGURED            IFF_RXFH_CONFIGURED
-#define IFF_PHONY_HEADROOM             IFF_PHONY_HEADROOM
-#define IFF_MACSEC                     IFF_MACSEC
-#define IFF_NO_RX_HANDLER              IFF_NO_RX_HANDLER
-#define IFF_FAILOVER                   IFF_FAILOVER
-#define IFF_FAILOVER_SLAVE             IFF_FAILOVER_SLAVE
-#define IFF_L3MDEV_RX_HANDLER          IFF_L3MDEV_RX_HANDLER
-#define IFF_LIVE_RENAME_OK             IFF_LIVE_RENAME_OK
+typedef u32 netdev_priv_flags_t;
+static_assert(sizeof(netdev_priv_flags_t) * BITS_PER_BYTE >=
+             NETDEV_PRIV_FLAG_COUNT);
+
+#define __IFF_BIT(bit)                 ((netdev_priv_flags_t)1 << (bit))
+#define __IFF(name)                    __IFF_BIT(IFF_##name##_BIT)
+
+#define IFF_802_1Q_VLAN                        __IFF(802_1Q_VLAN)
+#define IFF_EBRIDGE                    __IFF(EBRIDGE)
+#define IFF_BONDING                    __IFF(BONDING)
+#define IFF_ISATAP                     __IFF(ISATAP)
+#define IFF_WAN_HDLC                   __IFF(WAN_HDLC)
+#define IFF_XMIT_DST_RELEASE           __IFF(XMIT_DST_RELEASE)
+#define IFF_DONT_BRIDGE                        __IFF(DONT_BRIDGE)
+#define IFF_DISABLE_NETPOLL            __IFF(DISABLE_NETPOLL)
+#define IFF_MACVLAN_PORT               __IFF(MACVLAN_PORT)
+#define IFF_BRIDGE_PORT                        __IFF(BRIDGE_PORT)
+#define IFF_OVS_DATAPATH               __IFF(OVS_DATAPATH)
+#define IFF_TX_SKB_SHARING             __IFF(TX_SKB_SHARING)
+#define IFF_UNICAST_FLT                        __IFF(UNICAST_FLT)
+#define IFF_TEAM_PORT                  __IFF(TEAM_PORT)
+#define IFF_SUPP_NOFCS                 __IFF(SUPP_NOFCS)
+#define IFF_LIVE_ADDR_CHANGE           __IFF(LIVE_ADDR_CHANGE)
+#define IFF_MACVLAN                    __IFF(MACVLAN)
+#define IFF_XMIT_DST_RELEASE_PERM      __IFF(XMIT_DST_RELEASE_PERM)
+#define IFF_L3MDEV_MASTER              __IFF(L3MDEV_MASTER)
+#define IFF_NO_QUEUE                   __IFF(NO_QUEUE)
+#define IFF_OPENVSWITCH                        __IFF(OPENVSWITCH)
+#define IFF_L3MDEV_SLAVE               __IFF(L3MDEV_SLAVE)
+#define IFF_TEAM                       __IFF(TEAM)
+#define IFF_RXFH_CONFIGURED            __IFF(RXFH_CONFIGURED)
+#define IFF_PHONY_HEADROOM             __IFF(PHONY_HEADROOM)
+#define IFF_MACSEC                     __IFF(MACSEC)
+#define IFF_NO_RX_HANDLER              __IFF(NO_RX_HANDLER)
+#define IFF_FAILOVER                   __IFF(FAILOVER)
+#define IFF_FAILOVER_SLAVE             __IFF(FAILOVER_SLAVE)
+#define IFF_L3MDEV_RX_HANDLER          __IFF(L3MDEV_RX_HANDLER)
+#define IFF_LIVE_RENAME_OK             __IFF(LIVE_RENAME_OK)
 
 /**
  *     struct net_device - The DEVICE structure.
@@ -1876,7 +1887,7 @@ struct net_device {
 
        /* Read-mostly cache-line for fast-path access */
        unsigned int            flags;
-       unsigned int            priv_flags;
+       netdev_priv_flags_t     priv_flags;
        const struct net_device_ops *netdev_ops;
        int                     ifindex;
        unsigned short          gflags;
-- 
2.30.1


Reply via email to