Skip to content

Commit 4b623f9

Browse files
Paolo Abenikuba-moo
authored andcommitted
net-shapers: implement NL get operation
Introduce the basic infrastructure to implement the net-shaper core functionality. Each network devices carries a net-shaper cache, the NL get() operation fetches the data from such cache. The cache is initially empty, will be fill by the set()/group() operation implemented later and is destroyed at device cleanup time. The net_shaper_fill_handle(), net_shaper_ctx_init(), and net_shaper_generic_pre() implementations handle generic index type attributes, despite the current caller always pass a constant value to avoid more noise in later patches using them with different attributes. Reviewed-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Link: https://patch.msgid.link/ddd10fd645a9367803ad02fca4a5664ea5ace170.1728460186.git.pabeni@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 04e65df commit 4b623f9

File tree

6 files changed

+484
-7
lines changed

6 files changed

+484
-7
lines changed

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

include/linux/netdevice.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,6 +1603,14 @@ struct net_device_ops {
16031603
int (*ndo_hwtstamp_set)(struct net_device *dev,
16041604
struct kernel_hwtstamp_config *kernel_config,
16051605
struct netlink_ext_ack *extack);
1606+
1607+
#if IS_ENABLED(CONFIG_NET_SHAPER)
1608+
/**
1609+
* @net_shaper_ops: Device shaping offload operations
1610+
* see include/net/net_shapers.h
1611+
*/
1612+
const struct net_shaper_ops *net_shaper_ops;
1613+
#endif
16061614
};
16071615

16081616
/**
@@ -2406,6 +2414,19 @@ struct net_device {
24062414

24072415
u64 max_pacing_offload_horizon;
24082416

2417+
/**
2418+
* @lock: protects @net_shaper_hierarchy, feel free to use for other
2419+
* netdev-scope protection. Ordering: take after rtnl_lock.
2420+
*/
2421+
struct mutex lock;
2422+
2423+
#if IS_ENABLED(CONFIG_NET_SHAPER)
2424+
/**
2425+
* @net_shaper_hierarchy: data tracking the current shaper status
2426+
* see include/net/net_shapers.h
2427+
*/
2428+
struct net_shaper_hierarchy *net_shaper_hierarchy;
2429+
#endif
24092430
u8 priv[] ____cacheline_aligned
24102431
__counted_by(priv_len);
24112432
} ____cacheline_aligned;

include/net/net_shaper.h

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/* SPDX-License-Identifier: GPL-2.0-or-later */
2+
3+
#ifndef _NET_SHAPER_H_
4+
#define _NET_SHAPER_H_
5+
6+
#include <linux/types.h>
7+
8+
#include <uapi/linux/net_shaper.h>
9+
10+
struct net_device;
11+
struct devlink;
12+
struct netlink_ext_ack;
13+
14+
enum net_shaper_binding_type {
15+
NET_SHAPER_BINDING_TYPE_NETDEV,
16+
/* NET_SHAPER_BINDING_TYPE_DEVLINK_PORT */
17+
};
18+
19+
struct net_shaper_binding {
20+
enum net_shaper_binding_type type;
21+
union {
22+
struct net_device *netdev;
23+
struct devlink *devlink;
24+
};
25+
};
26+
27+
struct net_shaper_handle {
28+
enum net_shaper_scope scope;
29+
u32 id;
30+
};
31+
32+
/**
33+
* struct net_shaper - represents a shaping node on the NIC H/W
34+
* zeroed field are considered not set.
35+
* @parent: Unique identifier for the shaper parent, usually implied
36+
* @handle: Unique identifier for this shaper
37+
* @metric: Specify if the rate limits refers to PPS or BPS
38+
* @bw_min: Minimum guaranteed rate for this shaper
39+
* @bw_max: Maximum peak rate allowed for this shaper
40+
* @burst: Maximum burst for the peek rate of this shaper
41+
* @priority: Scheduling priority for this shaper
42+
* @weight: Scheduling weight for this shaper
43+
*/
44+
struct net_shaper {
45+
struct net_shaper_handle parent;
46+
struct net_shaper_handle handle;
47+
enum net_shaper_metric metric;
48+
u64 bw_min;
49+
u64 bw_max;
50+
u64 burst;
51+
u32 priority;
52+
u32 weight;
53+
54+
/* private: */
55+
u32 leaves; /* accounted only for NODE scope */
56+
struct rcu_head rcu;
57+
};
58+
59+
/**
60+
* struct net_shaper_ops - Operations on device H/W shapers
61+
*
62+
* The operations applies to either net_device and devlink objects.
63+
* The initial shaping configuration at device initialization is empty:
64+
* does not constraint the rate in any way.
65+
* The network core keeps track of the applied user-configuration in
66+
* the net_device or devlink structure.
67+
* The operations are serialized via a per device lock.
68+
*
69+
* Device not supporting any kind of nesting should not provide the
70+
* group operation.
71+
*
72+
* Each shaper is uniquely identified within the device with a 'handle'
73+
* comprising the shaper scope and a scope-specific id.
74+
*/
75+
struct net_shaper_ops {
76+
/**
77+
* @group: create the specified shapers scheduling group
78+
*
79+
* Nest the @leaves shapers identified under the * @node shaper.
80+
* All the shapers belong to the device specified by @binding.
81+
* The @leaves arrays size is specified by @leaves_count.
82+
* Create either the @leaves and the @node shaper; or if they already
83+
* exists, links them together in the desired way.
84+
* @leaves scope must be NET_SHAPER_SCOPE_QUEUE.
85+
*/
86+
int (*group)(struct net_shaper_binding *binding, int leaves_count,
87+
const struct net_shaper *leaves,
88+
const struct net_shaper *node,
89+
struct netlink_ext_ack *extack);
90+
91+
/**
92+
* @set: Updates the specified shaper
93+
*
94+
* Updates or creates the @shaper on the device specified by @binding.
95+
*/
96+
int (*set)(struct net_shaper_binding *binding,
97+
const struct net_shaper *shaper,
98+
struct netlink_ext_ack *extack);
99+
100+
/**
101+
* @delete: Removes the specified shaper
102+
*
103+
* Removes the shaper configuration as identified by the given @handle
104+
* on the device specified by @binding, restoring the default behavior.
105+
*/
106+
int (*delete)(struct net_shaper_binding *binding,
107+
const struct net_shaper_handle *handle,
108+
struct netlink_ext_ack *extack);
109+
110+
/**
111+
* @capabilities: get the shaper features supported by the device
112+
*
113+
* Fills the bitmask @cap with the supported capabilities for the
114+
* specified @scope and device specified by @binding.
115+
*/
116+
void (*capabilities)(struct net_shaper_binding *binding,
117+
enum net_shaper_scope scope, unsigned long *cap);
118+
};
119+
120+
#endif

net/core/dev.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11147,6 +11147,8 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
1114711147
hash_init(dev->qdisc_hash);
1114811148
#endif
1114911149

11150+
mutex_init(&dev->lock);
11151+
1115011152
dev->priv_flags = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM;
1115111153
setup(dev);
1115211154

@@ -11217,6 +11219,8 @@ void free_netdev(struct net_device *dev)
1121711219
return;
1121811220
}
1121911221

11222+
mutex_destroy(&dev->lock);
11223+
1122011224
kfree(dev->ethtool);
1122111225
netif_free_tx_queues(dev);
1122211226
netif_free_rx_queues(dev);
@@ -11426,6 +11430,8 @@ void unregister_netdevice_many_notify(struct list_head *head,
1142611430

1142711431
mutex_destroy(&dev->ethtool->rss_lock);
1142811432

11433+
net_shaper_flush_netdev(dev);
11434+
1142911435
if (skb)
1143011436
rtmsg_ifinfo_send(skb, dev, GFP_KERNEL, portid, nlh);
1143111437

net/core/dev.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ void dev_addr_flush(struct net_device *dev);
3535
int dev_addr_init(struct net_device *dev);
3636
void dev_addr_check(struct net_device *dev);
3737

38+
#if IS_ENABLED(CONFIG_NET_SHAPER)
39+
void net_shaper_flush_netdev(struct net_device *dev);
40+
#else
41+
static inline void net_shaper_flush_netdev(struct net_device *dev) {}
42+
#endif
43+
3844
/* sysctls not referred to from outside net/core/ */
3945
extern int netdev_unregister_timeout_secs;
4046
extern int weight_p;

0 commit comments

Comments
 (0)