diff mbox series

[net-next,3/5] netdevsim: Support devlink rate limit_type police

Message ID 20220620152647.2498927-4-dchumak@nvidia.com (mailing list archive)
State Rejected
Delegated to: Netdev Maintainers
Headers show
Series devlink rate police limiter | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 5 of 5 maintainers
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch warning WARNING: line length of 82 exceeds 80 columns WARNING: line length of 84 exceeds 80 columns WARNING: line length of 89 exceeds 80 columns WARNING: line length of 94 exceeds 80 columns
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Dima Chumak June 20, 2022, 3:26 p.m. UTC
Implement devlink_ops that enable setting devlink_rate attributes for
the new DEVLINK_RATE_LIMIT_TYPE_POLICE type of rate objects via devlink
API.

The new rate values of VF ports and rate nodes are exposed to netdevsim
debugfs.

Signed-off-by: Dima Chumak <dchumak@nvidia.com>
---
 drivers/net/netdevsim/dev.c       | 211 ++++++++++++++++++++++++++++--
 drivers/net/netdevsim/netdevsim.h |  11 +-
 2 files changed, 207 insertions(+), 15 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index 57a3ac893792..9ac78ab09a58 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -406,10 +406,24 @@  static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev,
 	if (nsim_dev_port_is_vf(nsim_dev_port)) {
 		unsigned int vf_id = nsim_dev_port_index_to_vf_index(port_index);
 
-		debugfs_create_u16("tx_share", 0400, nsim_dev_port->ddir,
+		debugfs_create_u64("tx_share", 0400, nsim_dev_port->ddir,
 				   &nsim_dev->vfconfigs[vf_id].min_tx_rate);
-		debugfs_create_u16("tx_max", 0400, nsim_dev_port->ddir,
+		debugfs_create_u64("tx_max", 0400, nsim_dev_port->ddir,
 				   &nsim_dev->vfconfigs[vf_id].max_tx_rate);
+		debugfs_create_u64("tx_burst", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].tx_burst);
+		debugfs_create_u64("rx_max", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].rx_max);
+		debugfs_create_u64("rx_burst", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].rx_burst);
+		debugfs_create_u64("tx_pkts", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].tx_pkts);
+		debugfs_create_u64("tx_pkts_burst", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].tx_pkts_burst);
+		debugfs_create_u64("rx_pkts", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].rx_pkts);
+		debugfs_create_u64("rx_pkts_burst", 0400, nsim_dev_port->ddir,
+				   &nsim_dev->vfconfigs[vf_id].rx_pkts_burst);
 		nsim_dev_port->rate_parent = debugfs_create_file("rate_parent",
 								 0400,
 								 nsim_dev_port->ddir,
@@ -1192,20 +1206,106 @@  static int nsim_leaf_tx_max_set(struct devlink_rate *devlink_rate, void *priv,
 	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
 	int err;
 
-	err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack);
-	if (err)
-		return err;
+	if (devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING) {
+		err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack);
+		if (err)
+			return err;
+	}
 
 	nsim_dev->vfconfigs[vf_id].max_tx_rate = tx_max;
 	return 0;
 }
 
+static int nsim_leaf_tx_burst_set(struct devlink_rate *rate_leaf, void *priv,
+				  u64 tx_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].tx_burst = tx_burst;
+	return 0;
+}
+
+static int nsim_leaf_rx_max_set(struct devlink_rate *rate_leaf, void *priv,
+				u64 rx_max, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].rx_max = rx_max;
+	return 0;
+}
+
+static int nsim_leaf_rx_burst_set(struct devlink_rate *rate_leaf, void *priv,
+				  u64 rx_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].rx_burst = rx_burst;
+	return 0;
+}
+
+static int nsim_leaf_tx_pkts_set(struct devlink_rate *rate_leaf, void *priv,
+				 u64 tx_pkts, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].tx_pkts = tx_pkts;
+	return 0;
+}
+
+static int nsim_leaf_tx_pkts_burst_set(struct devlink_rate *rate_leaf, void *priv,
+				       u64 tx_pkts_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].tx_pkts_burst = tx_pkts_burst;
+	return 0;
+}
+
+static int nsim_leaf_rx_pkts_set(struct devlink_rate *rate_leaf, void *priv,
+				 u64 rx_pkts, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].rx_pkts = rx_pkts;
+	return 0;
+}
+
+static int nsim_leaf_rx_pkts_burst_set(struct devlink_rate *rate_leaf, void *priv,
+				       u64 rx_pkts_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_dev_port *nsim_dev_port = priv;
+	struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev;
+	int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index);
+
+	nsim_dev->vfconfigs[vf_id].rx_pkts_burst = rx_pkts_burst;
+	return 0;
+}
+
 struct nsim_rate_node {
 	struct dentry *ddir;
 	struct dentry *rate_parent;
 	char *parent_name;
-	u16 tx_share;
-	u16 tx_max;
+	u64 tx_share;
+	u64 tx_max;
+	u64 tx_burst;
+	u64 rx_max;
+	u64 rx_burst;
+	u64 tx_pkts;
+	u64 tx_pkts_burst;
+	u64 rx_pkts;
+	u64 rx_pkts_burst;
 };
 
 static int nsim_node_tx_share_set(struct devlink_rate *devlink_rate, void *priv,
@@ -1228,14 +1328,79 @@  static int nsim_node_tx_max_set(struct devlink_rate *devlink_rate, void *priv,
 	struct nsim_rate_node *nsim_node = priv;
 	int err;
 
-	err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack);
-	if (err)
-		return err;
+	if (devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING) {
+		err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack);
+		if (err)
+			return err;
+	}
 
 	nsim_node->tx_max = tx_max;
 	return 0;
 }
 
+static int nsim_node_tx_burst_set(struct devlink_rate *rate_node, void *priv,
+				  u64 tx_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->tx_burst = tx_burst;
+	return 0;
+}
+
+static int nsim_node_rx_max_set(struct devlink_rate *rate_node, void *priv,
+				u64 rx_max, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->rx_max = rx_max;
+	return 0;
+}
+
+static int nsim_node_rx_burst_set(struct devlink_rate *rate_node, void *priv,
+				  u64 rx_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->rx_burst = rx_burst;
+	return 0;
+}
+
+static int nsim_node_tx_pkts_set(struct devlink_rate *rate_node, void *priv,
+				 u64 tx_pkts, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->tx_pkts = tx_pkts;
+	return 0;
+}
+
+static int nsim_node_tx_pkts_burst_set(struct devlink_rate *rate_node, void *priv,
+				       u64 tx_pkts_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->tx_pkts_burst = tx_pkts_burst;
+	return 0;
+}
+
+static int nsim_node_rx_pkts_set(struct devlink_rate *rate_node, void *priv,
+				 u64 rx_pkts, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->rx_pkts = rx_pkts;
+	return 0;
+}
+
+static int nsim_node_rx_pkts_burst_set(struct devlink_rate *rate_node, void *priv,
+				       u64 rx_pkts_burst, struct netlink_ext_ack *extack)
+{
+	struct nsim_rate_node *nsim_node = priv;
+
+	nsim_node->rx_pkts_burst = rx_pkts_burst;
+	return 0;
+}
+
 static int nsim_rate_node_new(struct devlink_rate *node, void **priv,
 			      struct netlink_ext_ack *extack)
 {
@@ -1253,13 +1418,19 @@  static int nsim_rate_node_new(struct devlink_rate *node, void **priv,
 
 	nsim_node->ddir = debugfs_create_dir(node->name, nsim_dev->nodes_ddir);
 
-	debugfs_create_u16("tx_share", 0400, nsim_node->ddir, &nsim_node->tx_share);
-	debugfs_create_u16("tx_max", 0400, nsim_node->ddir, &nsim_node->tx_max);
+	debugfs_create_u64("tx_share", 0400, nsim_node->ddir, &nsim_node->tx_share);
+	debugfs_create_u64("tx_max", 0400, nsim_node->ddir, &nsim_node->tx_max);
+	debugfs_create_u64("tx_burst", 0400, nsim_node->ddir, &nsim_node->tx_burst);
+	debugfs_create_u64("rx_max", 0400, nsim_node->ddir, &nsim_node->rx_max);
+	debugfs_create_u64("rx_burst", 0400, nsim_node->ddir, &nsim_node->rx_burst);
+	debugfs_create_u64("tx_pkts", 0400, nsim_node->ddir, &nsim_node->tx_pkts);
+	debugfs_create_u64("tx_pkts_burst", 0400, nsim_node->ddir, &nsim_node->tx_pkts_burst);
+	debugfs_create_u64("rx_pkts", 0400, nsim_node->ddir, &nsim_node->rx_pkts);
+	debugfs_create_u64("rx_pkts_burst", 0400, nsim_node->ddir, &nsim_node->rx_pkts_burst);
 	nsim_node->rate_parent = debugfs_create_file("rate_parent", 0400,
 						     nsim_node->ddir,
 						     &nsim_node->parent_name,
 						     &nsim_dev_rate_parent_fops);
-
 	*priv = nsim_node;
 	return 0;
 }
@@ -1337,8 +1508,22 @@  static const struct devlink_ops nsim_dev_devlink_ops = {
 	.trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get,
 	.rate_leaf_tx_share_set = nsim_leaf_tx_share_set,
 	.rate_leaf_tx_max_set = nsim_leaf_tx_max_set,
+	.rate_leaf_tx_burst_set = nsim_leaf_tx_burst_set,
+	.rate_leaf_rx_max_set = nsim_leaf_rx_max_set,
+	.rate_leaf_rx_burst_set = nsim_leaf_rx_burst_set,
+	.rate_leaf_tx_pkts_set = nsim_leaf_tx_pkts_set,
+	.rate_leaf_tx_pkts_burst_set = nsim_leaf_tx_pkts_burst_set,
+	.rate_leaf_rx_pkts_set = nsim_leaf_rx_pkts_set,
+	.rate_leaf_rx_pkts_burst_set = nsim_leaf_rx_pkts_burst_set,
 	.rate_node_tx_share_set = nsim_node_tx_share_set,
 	.rate_node_tx_max_set = nsim_node_tx_max_set,
+	.rate_node_tx_burst_set = nsim_node_tx_burst_set,
+	.rate_node_rx_max_set = nsim_node_rx_max_set,
+	.rate_node_rx_burst_set = nsim_node_rx_burst_set,
+	.rate_node_tx_pkts_set = nsim_node_tx_pkts_set,
+	.rate_node_tx_pkts_burst_set = nsim_node_tx_pkts_burst_set,
+	.rate_node_rx_pkts_set = nsim_node_rx_pkts_set,
+	.rate_node_rx_pkts_burst_set = nsim_node_rx_pkts_burst_set,
 	.rate_node_new = nsim_rate_node_new,
 	.rate_node_del = nsim_rate_node_del,
 	.rate_leaf_parent_set = nsim_rate_leaf_parent_set,
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
index 0b122872b2c9..2040b95e5f93 100644
--- a/drivers/net/netdevsim/netdevsim.h
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -241,8 +241,15 @@  struct nsim_dev_port {
 
 struct nsim_vf_config {
 	int link_state;
-	u16 min_tx_rate;
-	u16 max_tx_rate;
+	u64 min_tx_rate;
+	u64 max_tx_rate;
+	u64 tx_burst;
+	u64 rx_max;
+	u64 rx_burst;
+	u64 tx_pkts;
+	u64 tx_pkts_burst;
+	u64 rx_pkts;
+	u64 rx_pkts_burst;
 	u16 vlan;
 	__be16 vlan_proto;
 	u16 qos;