mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:46:16 +00:00
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: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
075e3d30e4
commit
beb5a9bea8
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user