Skip to content

Commit 16987b0

Browse files
committed
Merge: CNB97: net: introduce TX H/W shaping API
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/6842 JIRA: https://issues.redhat.com/browse/RHEL-89973 "net: use netdev->lock to protect NAPI" (https://issues.redhat.com/browse/RHEL-87382) will need this. It is needed by wireless and by other drivers. Tested: seltests Depends: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/6687 Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com> Approved-by: mheib <mheib@redhat.com> Approved-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: Petr Oros <poros@redhat.com> Approved-by: Davide Caratti <dcaratti@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Approved-by: Paolo Abeni <pabeni@redhat.com> Merged-by: Augusto Caringi <acaringi@redhat.com>
2 parents 5be4204 + b3d31cf commit 16987b0

File tree

30 files changed

+2796
-12
lines changed

30 files changed

+2796
-12
lines changed
Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2+
name: net-shaper
3+
4+
doc: |
5+
Networking HW rate limiting configuration.
6+
7+
This API allows configuring HW shapers available on the network
8+
devices at different levels (queues, network device) and allows
9+
arbitrary manipulation of the scheduling tree of the involved
10+
shapers.
11+
12+
Each @shaper is identified within the given device, by a @handle,
13+
comprising both a @scope and an @id.
14+
15+
Depending on the @scope value, the shapers are attached to specific
16+
HW objects (queues, devices) or, for @node scope, represent a
17+
scheduling group, that can be placed in an arbitrary location of
18+
the scheduling tree.
19+
20+
Shapers can be created with two different operations: the @set
21+
operation, to create and update a single "attached" shaper, and
22+
the @group operation, to create and update a scheduling
23+
group. Only the @group operation can create @node scope shapers.
24+
25+
Existing shapers can be deleted/reset via the @delete operation.
26+
27+
The user can query the running configuration via the @get operation.
28+
29+
Different devices can provide different feature sets, e.g. with no
30+
support for complex scheduling hierarchy, or for some shaping
31+
parameters. The user can introspect the HW capabilities via the
32+
@cap-get operation.
33+
34+
definitions:
35+
-
36+
type: enum
37+
name: scope
38+
doc: Defines the shaper @id interpretation.
39+
render-max: true
40+
entries:
41+
- name: unspec
42+
doc: The scope is not specified.
43+
-
44+
name: netdev
45+
doc: The main shaper for the given network device.
46+
-
47+
name: queue
48+
doc: |
49+
The shaper is attached to the given device queue,
50+
the @id represents the queue number.
51+
-
52+
name: node
53+
doc: |
54+
The shaper allows grouping of queues or other
55+
node shapers; can be nested in either @netdev
56+
shapers or other @node shapers, allowing placement
57+
in any location of the scheduling tree, except
58+
leaves and root.
59+
-
60+
type: enum
61+
name: metric
62+
doc: Different metric supported by the shaper.
63+
entries:
64+
-
65+
name: bps
66+
doc: Shaper operates on a bits per second basis.
67+
-
68+
name: pps
69+
doc: Shaper operates on a packets per second basis.
70+
71+
attribute-sets:
72+
-
73+
name: net-shaper
74+
attributes:
75+
-
76+
name: handle
77+
type: nest
78+
nested-attributes: handle
79+
doc: Unique identifier for the given shaper inside the owning device.
80+
-
81+
name: metric
82+
type: u32
83+
enum: metric
84+
doc: Metric used by the given shaper for bw-min, bw-max and burst.
85+
-
86+
name: bw-min
87+
type: uint
88+
doc: Guaranteed bandwidth for the given shaper.
89+
-
90+
name: bw-max
91+
type: uint
92+
doc: Maximum bandwidth for the given shaper or 0 when unlimited.
93+
-
94+
name: burst
95+
type: uint
96+
doc: |
97+
Maximum burst-size for shaping. Should not be interpreted
98+
as a quantum.
99+
-
100+
name: priority
101+
type: u32
102+
doc: |
103+
Scheduling priority for the given shaper. The priority
104+
scheduling is applied to sibling shapers.
105+
-
106+
name: weight
107+
type: u32
108+
doc: |
109+
Relative weight for round robin scheduling of the
110+
given shaper.
111+
The scheduling is applied to all sibling shapers
112+
with the same priority.
113+
-
114+
name: ifindex
115+
type: u32
116+
doc: Interface index owning the specified shaper.
117+
-
118+
name: parent
119+
type: nest
120+
nested-attributes: handle
121+
doc: |
122+
Identifier for the parent of the affected shaper.
123+
Only needed for @group operation.
124+
-
125+
name: leaves
126+
type: nest
127+
multi-attr: true
128+
nested-attributes: leaf-info
129+
doc: |
130+
Describes a set of leaves shapers for a @group operation.
131+
-
132+
name: handle
133+
attributes:
134+
-
135+
name: scope
136+
type: u32
137+
enum: scope
138+
doc: Defines the shaper @id interpretation.
139+
-
140+
name: id
141+
type: u32
142+
doc: |
143+
Numeric identifier of a shaper. The id semantic depends on
144+
the scope. For @queue scope it's the queue id and for @node
145+
scope it's the node identifier.
146+
-
147+
name: leaf-info
148+
subset-of: net-shaper
149+
attributes:
150+
-
151+
name: handle
152+
-
153+
name: priority
154+
-
155+
name: weight
156+
-
157+
name: caps
158+
attributes:
159+
-
160+
name: ifindex
161+
type: u32
162+
doc: Interface index queried for shapers capabilities.
163+
-
164+
name: scope
165+
type: u32
166+
enum: scope
167+
doc: The scope to which the queried capabilities apply.
168+
-
169+
name: support-metric-bps
170+
type: flag
171+
doc: The device accepts 'bps' metric for bw-min, bw-max and burst.
172+
-
173+
name: support-metric-pps
174+
type: flag
175+
doc: The device accepts 'pps' metric for bw-min, bw-max and burst.
176+
-
177+
name: support-nesting
178+
type: flag
179+
doc: |
180+
The device supports nesting shaper belonging to this scope
181+
below 'node' scoped shapers. Only 'queue' and 'node'
182+
scope can have flag 'support-nesting'.
183+
-
184+
name: support-bw-min
185+
type: flag
186+
doc: The device supports a minimum guaranteed B/W.
187+
-
188+
name: support-bw-max
189+
type: flag
190+
doc: The device supports maximum B/W shaping.
191+
-
192+
name: support-burst
193+
type: flag
194+
doc: The device supports a maximum burst size.
195+
-
196+
name: support-priority
197+
type: flag
198+
doc: The device supports priority scheduling.
199+
-
200+
name: support-weight
201+
type: flag
202+
doc: The device supports weighted round robin scheduling.
203+
204+
operations:
205+
list:
206+
-
207+
name: get
208+
doc: |
209+
Get information about a shaper for a given device.
210+
attribute-set: net-shaper
211+
212+
do:
213+
pre: net-shaper-nl-pre-doit
214+
post: net-shaper-nl-post-doit
215+
request:
216+
attributes: &ns-binding
217+
- ifindex
218+
- handle
219+
reply:
220+
attributes: &ns-attrs
221+
- ifindex
222+
- parent
223+
- handle
224+
- metric
225+
- bw-min
226+
- bw-max
227+
- burst
228+
- priority
229+
- weight
230+
231+
dump:
232+
pre: net-shaper-nl-pre-dumpit
233+
post: net-shaper-nl-post-dumpit
234+
request:
235+
attributes:
236+
- ifindex
237+
reply:
238+
attributes: *ns-attrs
239+
-
240+
name: set
241+
doc: |
242+
Create or update the specified shaper.
243+
The set operation can't be used to create a @node scope shaper,
244+
use the @group operation instead.
245+
attribute-set: net-shaper
246+
flags: [ admin-perm ]
247+
248+
do:
249+
pre: net-shaper-nl-pre-doit
250+
post: net-shaper-nl-post-doit
251+
request:
252+
attributes:
253+
- ifindex
254+
- handle
255+
- metric
256+
- bw-min
257+
- bw-max
258+
- burst
259+
- priority
260+
- weight
261+
262+
-
263+
name: delete
264+
doc: |
265+
Clear (remove) the specified shaper. When deleting
266+
a @node shaper, reattach all the node's leaves to the
267+
deleted node's parent.
268+
If, after the removal, the parent shaper has no more
269+
leaves and the parent shaper scope is @node, the parent
270+
node is deleted, recursively.
271+
When deleting a @queue shaper or a @netdev shaper,
272+
the shaper disappears from the hierarchy, but the
273+
queue/device can still send traffic: it has an implicit
274+
node with infinite bandwidth. The queue's implicit node
275+
feeds an implicit RR node at the root of the hierarchy.
276+
attribute-set: net-shaper
277+
flags: [ admin-perm ]
278+
279+
do:
280+
pre: net-shaper-nl-pre-doit
281+
post: net-shaper-nl-post-doit
282+
request:
283+
attributes: *ns-binding
284+
285+
-
286+
name: group
287+
doc: |
288+
Create or update a scheduling group, attaching the specified
289+
@leaves shapers under the specified node identified by @handle.
290+
The @leaves shapers scope must be @queue and the node shaper
291+
scope must be either @node or @netdev.
292+
When the node shaper has @node scope, if the @handle @id is not
293+
specified, a new shaper of such scope is created, otherwise the
294+
specified node must already exist.
295+
When updating an existing node shaper, the specified @leaves are
296+
added to the existing node; such node will also retain any preexisting
297+
leave.
298+
The @parent handle for a new node shaper defaults to the parent
299+
of all the leaves, provided all the leaves share the same parent.
300+
Otherwise @parent handle must be specified.
301+
The user can optionally provide shaping attributes for the node
302+
shaper.
303+
The operation is atomic, on failure no change is applied to
304+
the device shaping configuration, otherwise the @node shaper
305+
full identifier, comprising @binding and @handle, is provided
306+
as the reply.
307+
attribute-set: net-shaper
308+
flags: [ admin-perm ]
309+
310+
do:
311+
pre: net-shaper-nl-pre-doit
312+
post: net-shaper-nl-post-doit
313+
request:
314+
attributes:
315+
- ifindex
316+
- parent
317+
- handle
318+
- metric
319+
- bw-min
320+
- bw-max
321+
- burst
322+
- priority
323+
- weight
324+
- leaves
325+
reply:
326+
attributes: *ns-binding
327+
328+
-
329+
name: cap-get
330+
doc: |
331+
Get the shaper capabilities supported by the given device
332+
for the specified scope.
333+
attribute-set: caps
334+
335+
do:
336+
pre: net-shaper-nl-cap-pre-doit
337+
post: net-shaper-nl-cap-post-doit
338+
request:
339+
attributes:
340+
- ifindex
341+
- scope
342+
reply:
343+
attributes: &cap-attrs
344+
- ifindex
345+
- scope
346+
- support-metric-bps
347+
- support-metric-pps
348+
- support-nesting
349+
- support-bw-min
350+
- support-bw-max
351+
- support-burst
352+
- support-priority
353+
- support-weight
354+
355+
dump:
356+
pre: net-shaper-nl-cap-pre-dumpit
357+
post: net-shaper-nl-cap-post-dumpit
358+
request:
359+
attributes:
360+
- ifindex
361+
reply:
362+
attributes: *cap-attrs

Documentation/networking/kapi.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ Driver Support
104104
.. kernel-doc:: include/linux/netdevice.h
105105
:internal:
106106

107+
.. kernel-doc:: include/net/net_shaper.h
108+
:internal:
109+
107110
PHY Support
108111
-----------
109112

drivers/net/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,7 @@ config NETDEVSIM
581581
depends on PTP_1588_CLOCK_MOCK || PTP_1588_CLOCK_MOCK=n
582582
select NET_DEVLINK
583583
select PAGE_POOL
584+
select NET_SHAPER
584585
help
585586
This driver is a developer testing tool and software model that can
586587
be used to test various control path networking APIs, especially

drivers/net/netdevsim/ethtool.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,10 @@ nsim_set_channels(struct net_device *dev, struct ethtool_channels *ch)
103103
struct netdevsim *ns = netdev_priv(dev);
104104
int err;
105105

106+
mutex_lock(&dev->lock);
106107
err = netif_set_real_num_queues(dev, ch->combined_count,
107108
ch->combined_count);
109+
mutex_unlock(&dev->lock);
108110
if (err)
109111
return err;
110112

0 commit comments

Comments
 (0)