net: introduce TX H/W shaping API
Status from this message: This series was applied to netdev/net-next.git (main)
Get series with b4
b4 am [email protected]Versions newest first · linked by author and title
- v9 Latest15 patches 0 repliesApplied 15/15
- v815 patches 6 repliesSuperseded
- v715 patches 7 repliesSuperseded
Earlier versions · 6
| Version | Posted | Patches | Replies | Status |
|---|---|---|---|---|
| v6 | 15 patches | 16 replies | Superseded | |
| v5 | 12 patches | 16 replies | Superseded | |
| v4 | 12 patches | 18 replies | Superseded 1 of 12 applied | |
| v3 | 12 patches | 78 replies | Superseded | |
| v2 RFC | 11 patches | 7 replies | Superseded | |
| v1 | 5 patches | 13 replies | Superseded |
Changes in v9 from the cover letter
- collected tags
- rabased (patch 3/15)
- improved the group operation documentation (patch 2/15)
Patches in v9 All 15 applied
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/15 | genetlink: extend info user-storage to match NL cb ctxdrivers/ include/ include/ +6 more | +17 | 0 replies | Applied |
| 2/15 | netlink: spec: add shaper YAML specDocumentation/ MAINTAINERS include/ +6 more | +579 | 0 replies | Applied |
| 3/15 | net-shapers: implement NL get operationDocumentation/ include/ include/ +3 more | +484 | 0 replies | Applied |
| 4/15 | net-shapers: implement NL set and delete operationsnet/ | +380 | 0 replies | Applied |
| 5/15 | net-shapers: implement NL group operationnet/ | +350 | 0 replies | Applied |
| 6/15 | net-shapers: implement delete support for NODE scope shapernet/ | +74 | 0 replies | Applied |
| 7/15 | net-shapers: implement shaper cleanup on queue deletionnet/ net/ net/ | +54 | 0 replies | Applied |
| 8/15 | netlink: spec: add shaper introspection supportDocumentation/ include/ net/ +2 more | +176 | 0 replies | Applied |
| 9/15 | net: shaper: implement introspection supportnet/ | +95 | 0 replies | Applied |
| 10/15 | net-shapers: implement cap validation in the corenet/ | +101 | 0 replies | Applied |
| 11/15 | testing: net-drv: add basic shaper testdrivers/ drivers/ drivers/ +4 more | +510 | 0 replies | Applied |
| 12/15 | virtchnl: support queue rate limit and quanta size configurationinclude/ | +119 | 0 replies | Applied |
| 13/15 | ice: Support VF queue rate limit and quanta size configurationdrivers/ drivers/ drivers/ +7 more | +395 | 0 replies | Applied |
| 14/15 | iavf: Add net_shaper_ops supportdrivers/ drivers/ drivers/ +2 more | +182 | 0 replies | Applied |
| 15/15 | iavf: add support to exchange qos capabilitiesdrivers/ drivers/ drivers/ | +150 | 0 replies | Applied |
Reviews trailers per patch
All 15 patches have a Reviewed-by or Acked-by.
| Patch | Jakub Kicinski | Jiri Pirko |
|---|---|---|
| 1/15 | R-b | R-b |
| 2/15 | R-b | |
| 3/15 | R-b | R-b |
| 4/15 | R-b | |
| 5/15 | R-b | |
| 6/15 | R-b | |
| 7/15 | R-b | R-b |
| 8/15 | R-b | R-b |
| 9/15 | R-b | R-b |
| 10/15 | R-b | R-b |
| 11/15 | R-b | |
| 12/15 | R-b | |
| 13/15 | R-b | |
| 14/15 | R-b | |
| 15/15 | R-b |
Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.
Cover letter [PATCH v9 net-next 00/15] 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'}[1] https://lore.kernel.org/netdev/[email protected]/
---
Changes from v8:
- collected tags
- rabased (patch 3/15)
- improved the group operation documentation (patch 2/15)
v8: https://lore.kernel.org/netdev/[email protected]/
Changes from v7:
- fixed uninit error and related ST failures
- dev lock cleanup
- fixed a bunch of typos
v7: https://lore.kernel.org/netdev/[email protected]/
Changes from v6:
- move node attributes in main NL scope for group() op
- driver must acquire dev->lock around channels update
- implemented queue id checking in the core
v6: https://lore.kernel.org/netdev/[email protected]/
Changes from v5:
- handle/shaper unsplit
- removed 'binding' from NL api
- several helper renames
- added rcu protection to shaper pointer
- implemented value checking into the core
- handle device channels reconf
- consolidate NL ctx handling
- dropped idr allocator, leverage the existing xarray
- caps names shrinking
- group() op is optional
- cap callback can't fail
- more self-tests
v5: https://lore.kernel.org/netdev/[email protected]/
Changes from v4:
- ops operate on struct binding
- 'root' -> 'node' rename
- most core function/helpers operate on 'binding'
- use NL_SET_BAD_ATTR where possible
- some code deduplication
v4: https://lore.kernel.org/netdev/[email protected]/
Changes from v3:
- rename
- locking
- delete operates on node, too
v3: https://lore.kernel.org/netdev/[email protected]/
Changes from RFC v2:
- added patch 1
- fixed deprecated API usage
RFC v2: https://lore.kernel.org/netdev/[email protected]/
Changes from RFC v1:
- set() and delete() ops operate on a single shaper
- added group() op to allow grouping and nesting
- split the NL implementation into multiple patches to help reviewing
RFC v1: https://lore.kernel.org/netdev/[email protected]/
Paolo Abeni (11):
genetlink: extend info user-storage to match NL cb ctx
netlink: spec: add shaper YAML spec
net-shapers: implement NL get operation
net-shapers: implement NL set and delete operations
net-shapers: implement NL group operation
net-shapers: implement delete support for NODE scope shaper
net-shapers: implement shaper cleanup on queue deletion
netlink: spec: add shaper introspection support
net: shaper: implement introspection support
net-shapers: implement cap validation in the core
testing: net-drv: add basic shaper test
Sudheer Mogilappagari (2):
iavf: Add net_shaper_ops support
iavf: add support to exchange qos capabilities
Wenjun Wu (2):
virtchnl: support queue rate limit and quanta size configuration
ice: Support VF queue rate limit and quanta size configuration
Documentation/netlink/specs/net_shaper.yaml | 362 +++++ Documentation/networking/kapi.rst | 3 + MAINTAINERS | 1 + drivers/net/Kconfig | 1 + drivers/net/ethernet/intel/Kconfig | 1 + drivers/net/ethernet/intel/iavf/iavf.h | 13 + drivers/net/ethernet/intel/iavf/iavf_main.c | 161 +- drivers/net/ethernet/intel/iavf/iavf_txrx.h | 2 + .../net/ethernet/intel/iavf/iavf_virtchnl.c | 157 +- drivers/net/ethernet/intel/ice/ice.h | 2 + drivers/net/ethernet/intel/ice/ice_base.c | 2 + drivers/net/ethernet/intel/ice/ice_common.c | 21 + .../net/ethernet/intel/ice/ice_hw_autogen.h | 8 + drivers/net/ethernet/intel/ice/ice_txrx.h | 1 + drivers/net/ethernet/intel/ice/ice_type.h | 1 + drivers/net/ethernet/intel/ice/ice_vf_lib.h | 8 + drivers/net/ethernet/intel/ice/ice_virtchnl.c | 335 ++++ drivers/net/ethernet/intel/ice/ice_virtchnl.h | 11 + .../intel/ice/ice_virtchnl_allowlist.c | 6 + drivers/net/netdevsim/ethtool.c | 2 + drivers/net/netdevsim/netdev.c | 39 + drivers/net/vxlan/vxlan_mdb.c | 2 +- include/linux/avf/virtchnl.h | 119 ++ include/linux/netdevice.h | 21 + include/linux/netlink.h | 5 +- include/net/genetlink.h | 8 +- include/net/net_shaper.h | 120 ++ include/uapi/linux/net_shaper.h | 95 ++ net/Kconfig | 3 + net/Makefile | 1 + net/core/dev.c | 8 + net/core/dev.h | 10 + net/core/netdev-genl.c | 2 +- net/core/rtnetlink.c | 2 +- net/devlink/devl_internal.h | 2 +- net/ethtool/rss.c | 2 +- net/netfilter/nf_conntrack_netlink.c | 2 +- net/netlink/genetlink.c | 4 +- net/shaper/Makefile | 8 + net/shaper/shaper.c | 1438 +++++++++++++++++ net/shaper/shaper_nl_gen.c | 154 ++ net/shaper/shaper_nl_gen.h | 44 + tools/testing/selftests/drivers/net/Makefile | 1 + tools/testing/selftests/drivers/net/shaper.py | 461 ++++++ .../testing/selftests/net/lib/py/__init__.py | 1 + tools/testing/selftests/net/lib/py/ynl.py | 5 + 46 files changed, 3640 insertions(+), 15 deletions(-) create mode 100644 Documentation/netlink/specs/net_shaper.yaml create mode 100644 include/net/net_shaper.h create mode 100644 include/uapi/linux/net_shaper.h create mode 100644 net/shaper/Makefile create mode 100644 net/shaper/shaper.c create mode 100644 net/shaper/shaper_nl_gen.c create mode 100644 net/shaper/shaper_nl_gen.h create mode 100755 tools/testing/selftests/drivers/net/shaper.py
Signature · 1 line
2.45.2