mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 05:02:31 +00:00
bdb5d2481a
Paolo Abeni says: ==================== net: introduce TX H/W shaping API We have a plurality of shaping-related drivers API, but none flexible enough to meet existing demand from vendors[1]. This series introduces new device APIs to configure in a flexible way TX H/W shaping. The new functionalities are exposed via a newly defined generic netlink interface and include introspection capabilities. Some self-tests are included, on top of a dummy netdevsim implementation. Finally a basic implementation for the iavf driver is provided. Some usage examples: * Configure shaping on a given queue: ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/shaper.yaml \ --do set --json '{"ifindex": '$IFINDEX', "shaper": {"handle": {"scope": "queue", "id":'$QUEUEID'}, "bw-max": 2000000}}' * Container B/W sharing The orchestration infrastructure wants to group the container-related queues under a RR scheduling and limit the aggregate bandwidth: ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/shaper.yaml \ --do group --json '{"ifindex": '$IFINDEX', "leaves": [ {"handle": {"scope": "queue", "id":'$QID1'}, "weight": '$W1'}, {"handle": {"scope": "queue", "id":'$QID2'}, "weight": '$W2'}], {"handle": {"scope": "queue", "id":'$QID3'}, "weight": '$W3'}], "handle": {"scope":"node"}, "bw-max": 10000000}' {'ifindex': $IFINDEX, 'handle': {'scope': 'node', 'id': 0}} Q1 \ \ Q2 -- node 0 ------- netdev / (bw-max: 10M) Q3 / * Delegation A containers wants to limit the aggregate B/W bandwidth of 2 of the 3 queues it owns - the starting configuration is the one from the previous point: SPEC=Documentation/netlink/specs/net_shaper.yaml ./tools/net/ynl/cli.py --spec $SPEC \ --do group --json '{"ifindex": '$IFINDEX', "leaves": [ {"handle": {"scope": "queue", "id":'$QID1'}, "weight": '$W1'}, {"handle": {"scope": "queue", "id":'$QID2'}, "weight": '$W2'}], "handle": {"scope": "node"}, "bw-max": 5000000 }' {'ifindex': $IFINDEX, 'handle': {'scope': 'node', 'id': 1}} Q1 -- node 1 --------\ / (bw-max: 5M) \ Q2 / node 0 ------- netdev /(bw-max: 10M) Q3 ------------------/ In a group operation, when prior to the op itself, the leaves have different parents, the user must specify the parent handle for the group. I.e., starting from the previous config: ./tools/net/ynl/cli.py --spec $SPEC \ --do group --json '{"ifindex": '$IFINDEX', "leaves": [ {"handle": {"scope": "queue", "id":'$QID1'}, "weight": '$W1'}, {"handle": {"scope": "queue", "id":'$QID3'}, "weight": '$W3'}], "handle": {"scope": "node"}, "bw-max": 3000000 }' Netlink error: Invalid argument nl_len = 96 (80) nl_flags = 0x300 nl_type = 2 error: -22 extack: {'msg': 'All the leaves shapers must have the same old parent'} ./tools/net/ynl/cli.py --spec $SPEC \ --do group --json '{"ifindex": '$IFINDEX', "leaves": [ {"handle": {"scope": "queue", "id":'$QID1'}, "weight": '$W1'}, {"handle": {"scope": "queue", "id":'$QID3'}, "weight": '$W3'}], "handle": {"scope": "node"}, "parent": {"scope": "node", "id": 1}, "bw-max": 3000000 } {'ifindex': $IFINDEX, 'handle': {'scope': 'node', 'id': 2}} Q1 -- node 2 --- /(bw-max:3M)\ Q3 / \ ---- node 1 \ / (bw-max: 5M)\ Q2 node 0 ------- netdev (bw-max: 10M) * Cleanup: Still starting from config 1To delete a single queue shaper ./tools/net/ynl/cli.py --spec $SPEC --do delete --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "queue", "id":'$QID3'}}' Q1 -- node 2 --- (bw-max:3M)\ \ ---- node 1 \ / (bw-max: 5M)\ Q2 node 0 ------- netdev (bw-max: 10M) Deleting a node shaper relinks all its leaves to the node's parent: ./tools/net/ynl/cli.py --spec $SPEC --do delete --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "node", "id":2}}' Q1 ---\ \ node 1----- \ / (bw-max: 5M)\ Q2----/ node 0 ------- netdev (bw-max: 10M) Deleting the last shaper under a node shaper deletes the node, too: ./tools/net/ynl/cli.py --spec $SPEC --do delete --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "queue", "id":'$QID1'}}' ./tools/net/ynl/cli.py --spec $SPEC --do delete --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "queue", "id":'$QID2'}}' ./tools/net/ynl/cli.py --spec $SPEC --do get --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "node", "id": 1}}' Netlink error: No such file or directory nl_len = 44 (28) nl_flags = 0x300 nl_type = 2 error: -2 extack: {'bad-attr': '.handle'} Such delete recurses on parents that are left over with no leaves: ./tools/net/ynl/cli.py --spec $SPEC --do get --json \ '{"ifindex": '$IFINDEX', "handle": {"scope": "node", "id": 0}}' Netlink error: No such file or directory nl_len = 44 (28) nl_flags = 0x300 nl_type = 2 error: -2 extack: {'bad-attr': '.handle'} v8: https://lore.kernel.org/cover.1727704215.git.pabeni@redhat.com v7: https://lore.kernel.org/cover.1725919039.git.pabeni@redhat.com v6: https://lore.kernel.org/cover.1725457317.git.pabeni@redhat.com v5: https://lore.kernel.org/cover.1724944116.git.pabeni@redhat.com v4: https://lore.kernel.org/cover.1724165948.git.pabeni@redhat.com v3: https://lore.kernel.org/cover.1722357745.git.pabeni@redhat.com RFC v2: https://lore.kernel.org/cover.1721851988.git.pabeni@redhat.com RFC v1: https://lore.kernel.org/cover.1719518113.git.pabeni@redhat.com ==================== Link: https://patch.msgid.link/cover.1728460186.git.pabeni@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
||
---|---|---|
.. | ||
caif | ||
device_drivers | ||
devlink | ||
diagnostic | ||
dsa | ||
mac80211_hwsim | ||
net_cachelines | ||
netlink_spec | ||
pse-pd | ||
6lowpan.rst | ||
6pack.rst | ||
af_xdp.rst | ||
alias.rst | ||
arcnet-hardware.rst | ||
arcnet.rst | ||
atm.rst | ||
ax25.rst | ||
bareudp.rst | ||
batman-adv.rst | ||
bonding.rst | ||
bridge.rst | ||
can_ucan_protocol.rst | ||
can.rst | ||
cdc_mbim.rst | ||
checksum-offloads.rst | ||
dccp.rst | ||
dctcp.rst | ||
devmem.rst | ||
dns_resolver.rst | ||
driver.rst | ||
eql.rst | ||
ethtool-netlink.rst | ||
failover.rst | ||
fib_trie.rst | ||
filter.rst | ||
gen_stats.rst | ||
generic_netlink.rst | ||
generic-hdlc.rst | ||
gtp.rst | ||
ieee802154.rst | ||
ila.rst | ||
index.rst | ||
ioam6-sysctl.rst | ||
ip_dynaddr.rst | ||
ip-sysctl.rst | ||
ipsec.rst | ||
ipv6.rst | ||
ipvlan.rst | ||
ipvs-sysctl.rst | ||
iso15765-2.rst | ||
j1939.rst | ||
kapi.rst | ||
kcm.rst | ||
l2tp.rst | ||
lapb-module.rst | ||
mac80211-auth-assoc-deauth.txt | ||
mac80211-injection.rst | ||
mctp.rst | ||
mpls-sysctl.rst | ||
mptcp-sysctl.rst | ||
mptcp.rst | ||
msg_zerocopy.rst | ||
multi-pf-netdev.rst | ||
multiqueue.rst | ||
napi.rst | ||
net_dim.rst | ||
net_failover.rst | ||
netconsole.rst | ||
netdev-features.rst | ||
netdevices.rst | ||
netfilter-sysctl.rst | ||
netif-msg.rst | ||
nexthop-group-resilient.rst | ||
nf_conntrack-sysctl.rst | ||
nf_flowtable.rst | ||
nfc.rst | ||
oa-tc6-framework.rst | ||
openvswitch.rst | ||
operstates.rst | ||
packet_mmap.rst | ||
page_pool.rst | ||
phonet.rst | ||
phy-link-topology.rst | ||
phy.rst | ||
pktgen.rst | ||
plip.rst | ||
ppp_generic.rst | ||
proc_net_tcp.rst | ||
radiotap-headers.rst | ||
rds.rst | ||
regulatory.rst | ||
representors.rst | ||
rxrpc.rst | ||
scaling.rst | ||
sctp.rst | ||
secid.rst | ||
seg6-sysctl.rst | ||
segmentation-offloads.rst | ||
sfp-phylink.rst | ||
skbuff.rst | ||
smc-sysctl.rst | ||
snmp_counter.rst | ||
sriov.rst | ||
statistics.rst | ||
strparser.rst | ||
switchdev.rst | ||
sysfs-tagging.rst | ||
tc-actions-env-rules.rst | ||
tc-queue-filters.rst | ||
tcp_ao.rst | ||
tcp-thin.rst | ||
team.rst | ||
timestamping.rst | ||
tipc.rst | ||
tls-handshake.rst | ||
tls-offload-layers.svg | ||
tls-offload-reorder-bad.svg | ||
tls-offload-reorder-good.svg | ||
tls-offload.rst | ||
tls.rst | ||
tproxy.rst | ||
tuntap.rst | ||
udplite.rst | ||
vrf.rst | ||
vxlan.rst | ||
x25-iface.rst | ||
x25.rst | ||
xdp-rx-metadata.rst | ||
xfrm_device.rst | ||
xfrm_proc.rst | ||
xfrm_sync.rst | ||
xfrm_sysctl.rst | ||
xsk-tx-metadata.rst |