Commit beb5a9be authored by Alexander Lobakin's avatar Alexander Lobakin Committed by Paolo Abeni
Browse files

netdevice: convert private flags > BIT(31) to bitfields



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: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarAlexander Lobakin <aleksander.lobakin@intel.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 075e3d30
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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                                             
+1 −1
Original line number Diff line number Diff line
@@ -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);
+2 −1
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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;
+18 −10
Original line number Diff line number Diff line
@@ -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)
Loading