08062af0a5
In commit 6f8b12d661
("net: napi: add hard irqs deferral feature")
napi_defer_irqs was added to net_device and napi_defer_irqs_count was
added to napi_struct, both as type int.
This value never goes below zero, so there is not reason for it to be a
signed int. Change the type for both from int to u32, and add an
overflow check to sysfs to limit the value to S32_MAX.
The limit of S32_MAX was chosen because the practical limit before this
patch was S32_MAX (anything larger was an overflow) and thus there are
no behavioral changes introduced. If the extra bit is needed in the
future, the limit can be raised.
Before this patch:
$ sudo bash -c 'echo 2147483649 > /sys/class/net/eth4/napi_defer_hard_irqs'
$ cat /sys/class/net/eth4/napi_defer_hard_irqs
-2147483647
After this patch:
$ sudo bash -c 'echo 2147483649 > /sys/class/net/eth4/napi_defer_hard_irqs'
bash: line 0: echo: write error: Numerical result out of range
Similarly, /sys/class/net/XXXXX/tx_queue_len is defined as unsigned:
include/linux/netdevice.h: unsigned int tx_queue_len;
And has an overflow check:
dev_change_tx_queue_len(..., unsigned long new_len):
if (new_len != (unsigned int)new_len)
return -ERANGE;
Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20240904153431.307932-1-jdamato@fastly.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
186 lines
19 KiB
ReStructuredText
186 lines
19 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
.. Copyright (C) 2023 Google LLC
|
|
|
|
===========================================
|
|
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)
|
|
unsigned_long:1 lltx read_mostly - HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx)
|
|
char name[16] - -
|
|
struct_netdev_name_node* name_node
|
|
struct_dev_ifalias* ifalias
|
|
unsigned_long mem_end
|
|
unsigned_long mem_start
|
|
unsigned_long base_addr
|
|
unsigned_long state read_mostly read_mostly netif_running(dev)
|
|
struct_list_head dev_list
|
|
struct_list_head napi_list
|
|
struct_list_head unreg_list
|
|
struct_list_head close_list
|
|
struct_list_head ptype_all read_mostly - dev_nit_active(tx)
|
|
struct_list_head ptype_specific read_mostly deliver_ptype_list_skb/__netif_receive_skb_core(rx)
|
|
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
|
|
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
|
|
unsigned_short gflags
|
|
unsigned_short hard_header_len read_mostly read_mostly ip6_xmit(tx);gro_list_prepare(rx)
|
|
unsigned_int mtu read_mostly - ip_finish_output2
|
|
unsigned_short needed_headroom read_mostly - LL_RESERVED_SPACE/ip_finish_output2
|
|
unsigned_short needed_tailroom
|
|
netdev_features_t features read_mostly read_mostly HARD_TX_LOCK,netif_skb_features,sk_setup_caps(tx);netif_elide_gro(rx)
|
|
netdev_features_t hw_features
|
|
netdev_features_t wanted_features
|
|
netdev_features_t vlan_features
|
|
netdev_features_t hw_enc_features - - netif_skb_features
|
|
netdev_features_t mpls_features
|
|
netdev_features_t gso_partial_features read_mostly gso_features_check
|
|
unsigned_int min_mtu
|
|
unsigned_int max_mtu
|
|
unsigned_short type
|
|
unsigned_char min_header_len
|
|
unsigned_char name_assign_type
|
|
int group
|
|
struct_net_device_stats stats
|
|
struct_net_device_core_stats* core_stats
|
|
atomic_t carrier_up_count
|
|
atomic_t carrier_down_count
|
|
struct_iw_handler_def* wireless_handlers
|
|
struct_iw_public_data* wireless_data
|
|
struct_ethtool_ops* ethtool_ops
|
|
struct_l3mdev_ops* l3mdev_ops
|
|
struct_ndisc_ops* ndisc_ops
|
|
struct_xfrmdev_ops* xfrmdev_ops
|
|
struct_tlsdev_ops* tlsdev_ops
|
|
struct_header_ops* header_ops read_mostly - ip_finish_output2,ip6_finish_output2(tx)
|
|
unsigned_char operstate
|
|
unsigned_char link_mode
|
|
unsigned_char if_port
|
|
unsigned_char dma
|
|
unsigned_char perm_addr[32]
|
|
unsigned_char addr_assign_type
|
|
unsigned_char addr_len
|
|
unsigned_char upper_level
|
|
unsigned_char lower_level
|
|
unsigned_short neigh_priv_len
|
|
unsigned_short padded
|
|
unsigned_short dev_id
|
|
unsigned_short dev_port
|
|
spinlock_t addr_list_lock
|
|
int irq
|
|
struct_netdev_hw_addr_list uc
|
|
struct_netdev_hw_addr_list mc
|
|
struct_netdev_hw_addr_list dev_addrs
|
|
struct_kset* queues_kset
|
|
struct_list_head unlink_list
|
|
unsigned_int promiscuity
|
|
unsigned_int allmulti
|
|
bool uc_promisc
|
|
unsigned_char nested_level
|
|
struct_in_device* ip_ptr read_mostly read_mostly __in_dev_get
|
|
struct_inet6_dev* ip6_ptr read_mostly read_mostly __in6_dev_get
|
|
struct_vlan_info* vlan_info
|
|
struct_dsa_port* dsa_ptr
|
|
struct_tipc_bearer* tipc_ptr
|
|
void* atalk_ptr
|
|
void* ax25_ptr
|
|
struct_wireless_dev* ieee80211_ptr
|
|
struct_wpan_dev* ieee802154_ptr
|
|
struct_mpls_dev* mpls_ptr
|
|
struct_mctp_dev* mctp_ptr
|
|
unsigned_char* dev_addr
|
|
struct_netdev_queue* _rx read_mostly - netdev_get_rx_queue(rx)
|
|
unsigned_int num_rx_queues
|
|
unsigned_int real_num_rx_queues - read_mostly get_rps_cpu
|
|
struct_bpf_prog* xdp_prog - read_mostly netif_elide_gro()
|
|
unsigned_long gro_flush_timeout - read_mostly napi_complete_done
|
|
u32 napi_defer_hard_irqs - read_mostly napi_complete_done
|
|
unsigned_int gro_max_size - read_mostly skb_gro_receive
|
|
unsigned_int gro_ipv4_max_size - read_mostly skb_gro_receive
|
|
rx_handler_func_t* rx_handler read_mostly - __netif_receive_skb_core
|
|
void* rx_handler_data read_mostly -
|
|
struct_netdev_queue* ingress_queue read_mostly -
|
|
struct_bpf_mprog_entry tcx_ingress - read_mostly sch_handle_ingress
|
|
struct_nf_hook_entries* nf_hooks_ingress
|
|
unsigned_char broadcast[32]
|
|
struct_cpu_rmap* rx_cpu_rmap
|
|
struct_hlist_node index_hlist
|
|
struct_netdev_queue* _tx read_mostly - netdev_get_tx_queue(tx)
|
|
unsigned_int num_tx_queues - -
|
|
unsigned_int real_num_tx_queues read_mostly - skb_tx_hash,netdev_core_pick_tx(tx)
|
|
unsigned_int tx_queue_len
|
|
spinlock_t tx_global_lock
|
|
struct_xdp_dev_bulk_queue__percpu* xdp_bulkq
|
|
struct_xps_dev_maps* xps_maps[2] read_mostly - __netif_set_xps_queue
|
|
struct_bpf_mprog_entry tcx_egress read_mostly - sch_handle_egress
|
|
struct_nf_hook_entries* nf_hooks_egress read_mostly -
|
|
struct_hlist_head qdisc_hash[16]
|
|
struct_timer_list watchdog_timer
|
|
int watchdog_timeo
|
|
u32 proto_down_reason
|
|
struct_list_head todo_list
|
|
int__percpu* pcpu_refcnt
|
|
refcount_t dev_refcnt
|
|
struct_ref_tracker_dir refcnt_tracker
|
|
struct_list_head link_watch_list
|
|
enum:8 reg_state
|
|
bool dismantle
|
|
enum:16 rtnl_link_state
|
|
bool needs_free_netdev
|
|
void*priv_destructor struct_net_device
|
|
struct_netpoll_info* npinfo - read_mostly napi_poll/napi_poll_lock
|
|
possible_net_t nd_net - read_mostly (dev_net)napi_busy_loop,tcp_v(4/6)_rcv,ip(v6)_rcv,ip(6)_input,ip(6)_input_finish
|
|
void* ml_priv
|
|
enum_netdev_ml_priv_type ml_priv_type
|
|
struct_pcpu_lstats__percpu* lstats read_mostly dev_lstats_add()
|
|
struct_pcpu_sw_netstats__percpu* tstats read_mostly dev_sw_netstats_tx_add()
|
|
struct_pcpu_dstats__percpu* dstats
|
|
struct_garp_port* garp_port
|
|
struct_mrp_port* mrp_port
|
|
struct_dm_hw_stat_delta* dm_private
|
|
struct_device dev - -
|
|
struct_attribute_group* sysfs_groups[4]
|
|
struct_attribute_group* sysfs_rx_queue_group
|
|
struct_rtnl_link_ops* rtnl_link_ops
|
|
unsigned_int gso_max_size read_mostly - sk_dst_gso_max_size
|
|
unsigned_int tso_max_size
|
|
u16 gso_max_segs read_mostly - gso_max_segs
|
|
u16 tso_max_segs
|
|
unsigned_int gso_ipv4_max_size read_mostly - sk_dst_gso_max_size
|
|
struct_dcbnl_rtnl_ops* dcbnl_ops
|
|
s16 num_tc read_mostly - skb_tx_hash
|
|
struct_netdev_tc_txq tc_to_txq[16] read_mostly - skb_tx_hash
|
|
u8 prio_tc_map[16]
|
|
unsigned_int fcoe_ddp_xid
|
|
struct_netprio_map* priomap
|
|
struct_phy_device* phydev
|
|
struct_sfp_bus* sfp_bus
|
|
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
|
|
unsigned_long:1 netns_local
|
|
unsigned_long:1 fcoe_mtu
|
|
struct_list_head net_notifier_list
|
|
struct_macsec_ops* macsec_ops
|
|
struct_udp_tunnel_nic_info* udp_tunnel_nic_info
|
|
struct_udp_tunnel_nic* udp_tunnel_nic
|
|
unsigned_int xdp_zc_max_segs
|
|
struct_bpf_xdp_entity xdp_state[3]
|
|
u8 dev_addr_shadow[32]
|
|
netdevice_tracker linkwatch_dev_tracker
|
|
netdevice_tracker watchdog_dev_tracker
|
|
netdevice_tracker dev_registered_tracker
|
|
struct_rtnl_hw_stats64* offload_xstats_l3
|
|
struct_devlink_port* devlink_port
|
|
struct_dpll_pin* dpll_pin
|
|
struct hlist_head page_pools
|
|
struct dim_irq_moder* irq_moder
|