Skip to content

net: introduce TX H/W shaping API

Paolo Abeni intel-wired-lan netdev oe-kbuild-all 9 versions – Applied

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

  1. v9 Latest15 patches 0 repliesApplied 15/15
  2. v815 patches 6 repliesSuperseded
  3. v715 patches 7 repliesSuperseded
Earlier versions · 6
VersionPostedPatchesRepliesStatus
v615 patches16 repliesSuperseded
v512 patches16 repliesSuperseded
v412 patches18 repliesSuperseded 1 of 12 applied
v312 patches78 repliesSuperseded
v2 RFC11 patches7 repliesSuperseded
v15 patches13 repliesSuperseded

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 filesSizeRepliesApplied
1/15genetlink: extend info user-storage to match NL cb ctxdrivers/net/vxlan/vxlan_mdb.c include/linux/netlink.h include/net/genetlink.h +6 more+17 -120 repliesApplied
2/15netlink: spec: add shaper YAML specDocumentation/netlink/specs/net_shaper.yaml MAINTAINERS include/uapi/linux/net_shaper.h +6 more+579 -00 repliesApplied
3/15net-shapers: implement NL get operationDocumentation/networking/kapi.rst include/linux/netdevice.h include/net/net_shaper.h +3 more+484 -70 repliesApplied
4/15net-shapers: implement NL set and delete operationsnet/shaper/shaper.c+380 -30 repliesApplied
5/15net-shapers: implement NL group operationnet/shaper/shaper.c+350 -00 repliesApplied
6/15net-shapers: implement delete support for NODE scope shapernet/shaper/shaper.c+74 -120 repliesApplied
7/15net-shapers: implement shaper cleanup on queue deletionnet/core/dev.c net/core/dev.h net/shaper/shaper.c+54 -00 repliesApplied
8/15netlink: spec: add shaper introspection supportDocumentation/netlink/specs/net_shaper.yaml include/uapi/linux/net_shaper.h net/shaper/shaper.c +2 more+176 -00 repliesApplied
9/15net: shaper: implement introspection supportnet/shaper/shaper.c+95 -30 repliesApplied
10/15net-shapers: implement cap validation in the corenet/shaper/shaper.c+101 -00 repliesApplied
11/15testing: net-drv: add basic shaper testdrivers/net/Kconfig drivers/net/netdevsim/ethtool.c drivers/net/netdevsim/netdev.c +4 more+510 -00 repliesApplied
12/15virtchnl: support queue rate limit and quanta size configurationinclude/linux/avf/virtchnl.h+119 -00 repliesApplied
13/15ice: Support VF queue rate limit and quanta size configurationdrivers/net/ethernet/intel/ice/ice.h drivers/net/ethernet/intel/ice/ice_base.c drivers/net/ethernet/intel/ice/ice_common.c +7 more+395 -00 repliesApplied
14/15iavf: Add net_shaper_ops supportdrivers/net/ethernet/intel/Kconfig drivers/net/ethernet/intel/iavf/iavf.h drivers/net/ethernet/intel/iavf/iavf_main.c +2 more+182 -10 repliesApplied
15/15iavf: add support to exchange qos capabilitiesdrivers/net/ethernet/intel/iavf/iavf.h drivers/net/ethernet/intel/iavf/iavf_main.c drivers/net/ethernet/intel/iavf/iavf_virtchnl.c+150 -30 repliesApplied

Reviews trailers per patch

All 15 patches have a Reviewed-by or Acked-by.

PatchJakub KicinskiJiri Pirko
1/15R-b R-b
2/15R-b
3/15R-b R-b
4/15R-b
5/15R-b
6/15R-b
7/15R-b R-b
8/15R-b R-b
9/15R-b R-b
10/15R-b R-b
11/15R-b
12/15R-b
13/15R-b
14/15R-b
15/15R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v9 thread

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