[Cake] Fwd: [RFC PATCH] net: introduce HW Rate Limiting Driver API
Dave Taht
dave.taht at gmail.com
Mon Jun 3 20:22:04 EDT 2024
---------- Forwarded message ---------
From: Paolo Abeni <pabeni at redhat.com>
Date: Wed, May 8, 2024 at 1:27 PM
Subject: [RFC PATCH] net: introduce HW Rate Limiting Driver API
To: <netdev at vger.kernel.org>
Cc: Jakub Kicinski <kuba at kernel.org>, Jiri Pirko <jiri at resnulli.us>, Madhu
Chittim <madhu.chittim at intel.com>, Sridhar Samudrala <
sridhar.samudrala at intel.com>, Simon Horman <horms at kernel.org>, John
Fastabend <john.fastabend at gmail.com>, Sunil Kovvuri Goutham <
sgoutham at marvell.com>, Jamal Hadi Salim <jhs at mojatatu.com>
This is the first incarnation in a formal (pre-RFC) patch of the
HW TX Rate Limiting Driver API proposal shared here[1].
The goal is to outline the proposed APIs before pushing the actual
implementation.
The network devices gain a new ops struct to directly manipulate the
H/W shapers implemented by the NIC.
The shapers can be attached to a pre-defined set of 'domains' - port,
vf, etc. - and the overall shapers configuration pushed to the H/W is
maintained by the kernel.
Each shaper is identified by an unique integer id based on the domain
and additional domain-specific information - e.g. for the VF domain, the
virtual function number/identifier.
[1] https://lore.kernel.org/netdev/20240405102313.GA310894@kernel.org/
Co-developed-by: Simon Horman <horms at kernel.org>
Signed-off-by: Simon Horman <horms at kernel.org>
Signed-off-by: Paolo Abeni <pabeni at redhat.com>
---
include/linux/netdevice.h | 15 +++
include/net/net_shaper.h | 206 ++++++++++++++++++++++++++++++++++++++
net/Kconfig | 3 +
3 files changed, 224 insertions(+)
create mode 100644 include/net/net_shaper.h
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index cf261fb89d73..39f66af014be 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -79,6 +79,8 @@ struct xdp_buff;
struct xdp_frame;
struct xdp_metadata_ops;
struct xdp_md;
+struct net_shaper_ops;
+struct net_shaper_data;
typedef u32 xdp_features_t;
@@ -1596,6 +1598,13 @@ struct net_device_ops {
int (*ndo_hwtstamp_set)(struct net_device *dev,
struct
kernel_hwtstamp_config *kernel_config,
struct netlink_ext_ack
*extack);
+
+#if IS_ENABLED(CONFIG_NET_SHAPER)
+ /** @net_shaper_ops: Device shaping offload operations
+ * see include/net/net_shapers.h
+ */
+ const struct net_shaper_ops *net_shaper_ops;
+#endif
};
/**
@@ -2403,6 +2412,12 @@ struct net_device {
/** @page_pools: page pools created for this netdevice */
struct hlist_head page_pools;
#endif
+#if IS_ENABLED(CONFIG_NET_SHAPER)
+ /** @net_shaper_data: data tracking the current shaper status
+ * see include/net/net_shapers.h
+ */
+ struct net_shaper_data *net_shaper_data;
+#endif
};
#define to_net_dev(d) container_of(d, struct net_device, dev)
diff --git a/include/net/net_shaper.h b/include/net/net_shaper.h
new file mode 100644
index 000000000000..a4fbadd99870
--- /dev/null
+++ b/include/net/net_shaper.h
@@ -0,0 +1,206 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef _NET_SHAPER_H_
+#define _NET_SHAPER_H_
+
+#include <linux/types.h>
+#include <linux/netdevice.h>
+#include <linux/netlink.h>
+
+/**
+ * enum net_shaper_metric - the metric of the shaper
+ * @NET_SHAPER_METRIC_PPS: Shaper operates on a packets per second basis
+ * @NET_SHAPER_METRIC_BPS: Shaper operates on a bits per second basis
+ */
+enum net_shaper_metric {
+ NET_SHAPER_METRIC_PPS,
+ NET_SHAPER_METRIC_BPS
+};
+
+/**
+ * struct net_shaper_info - represents a shaping node on the NIC H/W
+ * @metric: Specify if the bw limits refers to PPS or BPS
+ * @bw_min: Minimum guaranteed rate for this shaper
+ * @bw_max: Maximum peak bw allowed for this shaper
+ * @burst: Maximum burst for the peek rate of this shaper
+ * @priority: Scheduling priority for this shaper
+ * @weight: Scheduling weight for this shaper
+ */
+struct net_shaper_info {
+ enum net_shaper_metric metric;
+ u64 bw_min; /* minimum guaranteed bandwidth, according to
metric */
+ u64 bw_max; /* maximum allowed bandwidth */
+ u32 burst; /* maximum burst in bytes for bw_max */
+ u32 priority; /* scheduling strict priority */
+ u32 weight; /* scheduling WRR weight*/
+};
+
+/**
+ * enum net_shaper_scope - the different scopes where a shaper could be
attached
+ * @NET_SHAPER_SCOPE_PORT: The root shaper for the whole H/W.
+ * @NET_SHAPER_SCOPE_NETDEV: The main shaper for the given network device.
+ * @NET_SHAPER_SCOPE_VF: The shaper is attached to the given virtual
+ * function.
+ * @NET_SHAPER_SCOPE_QUEUE_GROUP: The shaper groups multiple queues under
the
+ * same device.
+ * @NET_SHAPER_SCOPE_QUEUE: The shaper is attached to the given device
queue.
+ *
+ * NET_SHAPER_SCOPE_PORT and NET_SHAPER_SCOPE_VF are only available on
+ * PF devices, usually inside the host/hypervisor.
+ * NET_SHAPER_SCOPE_NETDEV, NET_SHAPER_SCOPE_QUEUE_GROUP and
+ * NET_SHAPER_SCOPE_QUEUE are available on both PFs and VFs devices.
+ */
+enum net_shaper_scope {
+ NET_SHAPER_SCOPE_PORT,
+ NET_SHAPER_SCOPE_NETDEV,
+ NET_SHAPER_SCOPE_VF,
+ NET_SHAPER_SCOPE_QUEUE_GROUP,
+ NET_SHAPER_SCOPE_QUEUE,
+};
+
+/**
+ * struct net_shaper_ops - Operations on device H/W shapers
+ * @add: Creates a new shaper in the specified scope.
+ * @set: Modify the existing shaper.
+ * @delete: Delete the specified shaper.
+ * @move: Move an existing shaper under a different parent.
+ *
+ * The initial shaping configuration ad device initialization is empty/
+ * a no-op/does not constraint the b/w in any way.
+ * The network core keeps track of the applied user-configuration in
+ * per device storage.
+ *
+ * Each shaper is uniquely identified within the device with an 'handle',
+ * dependent on the shaper scope and other data, see @shaper_make_handle()
+ */
+struct net_shaper_ops {
+ /** add - Add a shaper inside the shaper hierarchy
+ * @dev: netdevice to operate on
+ * @handle: the shaper indetifier
+ * @shaper: configuration of shaper
+ * @extack: Netlink extended ACK for reporting errors.
+ *
+ * Return:
+ * * 0 on success
+ * * %-EOPNOTSUPP - Operation is not supported by hardware, driver,
+ * or core for any reason. @extack should be set to
+ * text describing the reason.
+ * * Other negative error values on failure.
+ *
+ * Examples or reasons this operation may fail include:
+ * * H/W resources limits.
+ * * Can’t respect the requested bw limits.
+ */
+ int (*add)(struct net_device *dev, u32 handle,
+ const struct net_shaper_info *shaper,
+ struct netlink_ext_ack *extack);
+
+ /** set - Update the specified shaper, if it exists
+ * @dev: Netdevice to operate on.
+ * @handle: the shaper identifier
+ * @shaper: Configuration of shaper.
+ * @extack: Netlink extended ACK for reporting errors.
+ *
+ * Return:
+ * * %0 - Success
+ * * %-EOPNOTSUPP - Operation is not supported by hardware, driver,
+ * or core for any reason. @extack should be set to
+ * text describing the reason.
+ * * Other negative error values on failure.
+ */
+ int (*set)(struct net_device *dev, u32 handle,
+ const struct net_shaper_info *shaper,
+ struct netlink_ext_ack *extack);
+
+ /** delete - Removes a shaper from the NIC
+ * @dev: netdevice to operate on.
+ * @handle: the shaper identifier
+ * @extack: Netlink extended ACK for reporting errors.
+ *
+ * Return:
+ * * %0 - Success
+ * * %-EOPNOTSUPP - Operation is not supported by hardware, driver,
+ * or core for any reason. @extack should be set to
+ * text describing the reason.
+ * * Other negative error value on failure.
+ */
+ int (*delete)(struct net_device *dev, u32 handle,
+ struct netlink_ext_ack *extack);
+
+ /** Move - change the parent id of the specified shaper
+ * @dev: netdevice to operate on.
+ * @handle: unique identifier for the shaper
+ * @new_parent_id: identifier of the new parent for this shaper
+ * @extack: Netlink extended ACK for reporting errors.
+ *
+ * Move the specified shaper in the hierarchy replacing its
+ * current parent shaper with @new_parent_id
+ *
+ * Return:
+ * * %0 - Success
+ * * %-EOPNOTSUPP - Operation is not supported by hardware, driver,
+ * or core for any reason. @extack should be set to
+ * text describing the reason.
+ * * Other negative error values on failure.
+ */
+ int (*move)(struct net_device *dev, u32 handle,
+ u32 new_parent_handle, struct netlink_ext_ack *extack);
+};
+
+/**
+ * net_shaper_make_handle - creates an unique shaper identifier
+ * @scope: the shaper scope
+ * @vf: virtual function number
+ * @id: queue group or queue id
+ *
+ * Return: an unique identifier for the shaper
+ *
+ * Combines the specified arguments to create an unique identifier for
+ * the shaper.
+ * The virtual function number is only used within @NET_SHAPER_SCOPE_VF,
+ * @NET_SHAPER_SCOPE_QUEUE_GROUP and @NET_SHAPER_SCOPE_QUEUE.
+ * The @id number is only used for @NET_SHAPER_SCOPE_QUEUE_GROUP and
+ * @NET_SHAPER_SCOPE_QUEUE, and must be, respectively, the queue group
+ * identifier or the queue number.
+ */
+u32 net_shaper_make_handle(enum net_shaper_scope scope, int vf, int id);
+
+/*
+ * Examples:
+ * - set shaping on a given queue
+ * struct shaper_info info = { }; // fill this
+ * u32 handle = shaper_make_handle(NET_SHAPER_SCOPE_QUEUE, 0, queue_id);
+ * dev->shaper_ops->add(dev, handle, &info, NULL);
+ *
+ * - create a queue group with a queue group shaping limits.
+ * Assuming the following topology already exists:
+ * < netdev shaper >
+ * / \
+ * <queue 0 shaper> . . . <queue N shaper>
+ *
+ * struct shaper_info ginfo = { }; // fill this
+ * u32 ghandle = shaper_make_handle(NET_SHAPER_SCOPE_QUEUE_GROUP, 0, 0);
+ * dev->shaper_ops->add(dev, ghandle, &ginfo);
+ *
+ * // now topology is:
+ * // < netdev shaper >
+ * // / | \
+ * // / | < newly created
shaper >
+ * // / |
+ * // <queue 0 shaper> . . . <queue N shaper>
+ *
+ * // move a shapers for queues 3..n out of such queue group
+ * for (i = 0; i <= 2; ++i) {
+ * u32 qhandle = net_shaper_make_handle(NET_SHAPER_SCOPE_QUEUE, 0,
i);
+ * dev->netshaper_ops->move(dev, qhandle, ghandle, NULL);
+ * }
+ *
+ * // now the topology is:
+ * // < netdev shaper >
+ * // / \
+ * // < newly created shaper> <queue 3 shaper> .. <queue
n shaper>
+ * // / \
+ * // <queue 0 shaper> . . . <queue 2 shaper>
+ */
+#endif
+
diff --git a/net/Kconfig b/net/Kconfig
index f0a8692496ff..29c6fec54711 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -66,6 +66,9 @@ config SKB_DECRYPTED
config SKB_EXTENSIONS
bool
+config NET_SHAPER
+ bool
+
menu "Networking options"
source "net/packet/Kconfig"
--
2.43.2
--
https://www.linkedin.com/feed/update/urn:li:activity:7203400057172180992/
Donations Drive.
Dave Täht CSO, LibreQos
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.bufferbloat.net/pipermail/cake/attachments/20240603/f716c540/attachment-0001.html>
More information about the Cake
mailing list