All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2-next] tc/htb: Hierarchical QoS hardware offload
@ 2020-12-15  7:42 Maxim Mikityanskiy
  2020-12-15  7:42 ` [PATCH net-next v3 0/4] HTB offload Maxim Mikityanskiy
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Maxim Mikityanskiy @ 2020-12-15  7:42 UTC (permalink / raw)
  To: David S. Miller, Jamal Hadi Salim, Cong Wang, Jiri Pirko, David Ahern
  Cc: Saeed Mahameed, Jakub Kicinski, Tariq Toukan, Yossi Kuperman,
	Maxim Mikityanskiy, Dan Carpenter, netdev, Maxim Mikityanskiy

This commit adds support for configuring HTB in offload mode. HTB
offload eliminates the single qdisc lock in the datapath and offloads
the algorithm to the NIC. The new 'offload' parameter is added to
enable this mode:

    # tc qdisc replace dev eth0 root handle 1: htb offload

Classes are created as usual, but filters should be moved to clsact for
lock-free classification (filters attached to HTB itself are not
supported in the offload mode):

    # tc filter add dev eth0 egress protocol ip flower dst_port 80
    action skbedit priority 1:10

Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
---
 include/uapi/linux/pkt_sched.h | 1 +
 tc/q_htb.c                     | 9 ++++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h
index 9e7c2c60..79a699f1 100644
--- a/include/uapi/linux/pkt_sched.h
+++ b/include/uapi/linux/pkt_sched.h
@@ -434,6 +434,7 @@ enum {
 	TCA_HTB_RATE64,
 	TCA_HTB_CEIL64,
 	TCA_HTB_PAD,
+	TCA_HTB_OFFLOAD,
 	__TCA_HTB_MAX,
 };
 
diff --git a/tc/q_htb.c b/tc/q_htb.c
index c609e974..fd11dad6 100644
--- a/tc/q_htb.c
+++ b/tc/q_htb.c
@@ -30,11 +30,12 @@
 static void explain(void)
 {
 	fprintf(stderr, "Usage: ... qdisc add ... htb [default N] [r2q N]\n"
-		"                      [direct_qlen P]\n"
+		"                      [direct_qlen P] [offload]\n"
 		" default  minor id of class to which unclassified packets are sent {0}\n"
 		" r2q      DRR quantums are computed as rate in Bps/r2q {10}\n"
 		" debug    string of 16 numbers each 0-3 {0}\n\n"
 		" direct_qlen  Limit of the direct queue {in packets}\n"
+		" offload  hardware offload\n"
 		"... class add ... htb rate R1 [burst B1] [mpu B] [overhead O]\n"
 		"                      [prio P] [slot S] [pslot PS]\n"
 		"                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n"
@@ -68,6 +69,7 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc,
 	};
 	struct rtattr *tail;
 	unsigned int i; char *p;
+	bool offload = false;
 
 	while (argc > 0) {
 		if (matches(*argv, "r2q") == 0) {
@@ -91,6 +93,8 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc,
 			if (get_u32(&direct_qlen, *argv, 10)) {
 				explain1("direct_qlen"); return -1;
 			}
+		} else if (matches(*argv, "offload") == 0) {
+			offload = true;
 		} else {
 			fprintf(stderr, "What is \"%s\"?\n", *argv);
 			explain();
@@ -103,6 +107,8 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc,
 	if (direct_qlen != ~0U)
 		addattr_l(n, 2024, TCA_HTB_DIRECT_QLEN,
 			  &direct_qlen, sizeof(direct_qlen));
+	if (offload)
+		addattr(n, 2024, TCA_HTB_OFFLOAD);
 	addattr_nest_end(n, tail);
 	return 0;
 }
@@ -344,6 +350,7 @@ static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
 		print_uint(PRINT_ANY, "direct_qlen", " direct_qlen %u",
 			   direct_qlen);
 	}
+	print_uint(PRINT_ANY, "offload", " offload %d", !!tb[TCA_HTB_OFFLOAD]);
 	return 0;
 }
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 4/4] net/mlx5e: Support HTB offload
@ 2020-12-28  0:57 kernel test robot
  0 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2020-12-28  0:57 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 20653 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20201215074213.32652-6-maximmi@mellanox.com>
References: <20201215074213.32652-6-maximmi@mellanox.com>
TO: Maxim Mikityanskiy <maximmi@mellanox.com>
TO: "David S. Miller" <davem@davemloft.net>
CC: netdev(a)vger.kernel.org
TO: Jamal Hadi Salim <jhs@mojatatu.com>
TO: Cong Wang <xiyou.wangcong@gmail.com>
TO: Jiri Pirko <jiri@resnulli.us>
TO: David Ahern <dsahern@gmail.com>
CC: Saeed Mahameed <saeedm@nvidia.com>
CC: Jakub Kicinski <kuba@kernel.org>
CC: Tariq Toukan <tariqt@nvidia.com>
CC: Yossi Kuperman <yossiku@nvidia.com>

Hi Maxim,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Maxim-Mikityanskiy/net-sched-Add-multi-queue-support-to-sch_tree_lock/20201215-164306
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git efd5a1584537698220578227e6467638307c2a0b
:::::: branch date: 13 days ago
:::::: commit date: 13 days ago
config: i386-randconfig-m021-20201227 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c:474 mlx5e_htb_root_add() warn: passing a valid pointer to 'PTR_ERR'
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c:576 mlx5e_htb_leaf_alloc_queue() warn: passing a valid pointer to 'PTR_ERR'
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c:631 mlx5e_htb_leaf_to_inner() warn: passing a valid pointer to 'PTR_ERR'

vim +/PTR_ERR +474 drivers/net/ethernet/mellanox/mlx5/core/en/qos.c

d34a73d10048450 Maxim Mikityanskiy 2020-12-15  453  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  454  int mlx5e_htb_root_add(struct mlx5e_priv *priv, u16 htb_maj_id, u16 htb_defcls)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  455  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  456  	struct mlx5e_qos_node *root;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  457  	bool opened;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  458  	int err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  459  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  460  	qos_dbg(priv->mdev, "TC_HTB_CREATE handle %04x:, default :%04x\n", htb_maj_id, htb_defcls);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  461  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  462  	if (!mlx5_qos_is_supported(priv->mdev))
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  463  		return -EOPNOTSUPP;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  464  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  465  	opened = test_bit(MLX5E_STATE_OPENED, &priv->state);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  466  	if (opened) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  467  		err = mlx5e_qos_alloc_queues(priv, &priv->channels);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  468  		if (err)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  469  			return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  470  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  471  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  472  	root = mlx5e_sw_node_create_root(priv);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  473  	if (IS_ERR(root)) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15 @474  		err = PTR_ERR(root);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  475  		goto err_free_queues;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  476  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  477  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  478  	err = mlx5_qos_create_root_node(priv->mdev, &root->hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  479  	if (err)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  480  		goto err_sw_node_delete;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  481  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  482  	WRITE_ONCE(priv->htb.defcls, htb_defcls);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  483  	/* Order maj_id after defcls - pairs with
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  484  	 * mlx5e_select_queue/mlx5e_select_htb_queues.
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  485  	 */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  486  	smp_store_release(&priv->htb.maj_id, htb_maj_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  487  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  488  	return 0;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  489  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  490  err_sw_node_delete:
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  491  	mlx5e_sw_node_delete(priv, root);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  492  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  493  err_free_queues:
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  494  	if (opened)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  495  		mlx5e_qos_close_all_queues(&priv->channels);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  496  	return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  497  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  498  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  499  int mlx5e_htb_root_del(struct mlx5e_priv *priv)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  500  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  501  	struct mlx5e_qos_node *root;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  502  	int err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  503  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  504  	qos_dbg(priv->mdev, "TC_HTB_DESTROY\n");
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  505  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  506  	WRITE_ONCE(priv->htb.maj_id, 0);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  507  	synchronize_rcu(); /* Sync with mlx5e_select_htb_queue and TX data path. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  508  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  509  	root = mlx5e_sw_node_find(priv, MLX5E_HTB_CLASSID_ROOT);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  510  	if (!root) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  511  		qos_warn(priv->mdev, "Failed to find the root node in the QoS tree\n");
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  512  		return -ENOENT;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  513  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  514  	err = mlx5_qos_destroy_node(priv->mdev, root->hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  515  	if (err)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  516  		qos_warn(priv->mdev, "Failed to destroy root node %u, err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  517  			 root->hw_id, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  518  	mlx5e_sw_node_delete(priv, root);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  519  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  520  	mlx5e_qos_deactivate_all_queues(&priv->channels);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  521  	mlx5e_qos_close_all_queues(&priv->channels);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  522  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  523  	return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  524  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  525  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  526  static int mlx5e_htb_convert_rate(struct mlx5e_priv *priv, u64 rate,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  527  				  struct mlx5e_qos_node *parent, u32 *bw_share)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  528  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  529  	u64 share = 0;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  530  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  531  	while (parent->classid != MLX5E_HTB_CLASSID_ROOT && !parent->max_average_bw)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  532  		parent = parent->parent;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  533  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  534  	if (parent->max_average_bw)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  535  		share = div64_u64(div_u64(rate * 100, BYTES_IN_MBIT),
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  536  				  parent->max_average_bw);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  537  	else
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  538  		share = 101;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  539  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  540  	*bw_share = share == 0 ? 1 : share > 100 ? 0 : share;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  541  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  542  	qos_dbg(priv->mdev, "Convert: rate %llu, parent ceil %llu -> bw_share %u\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  543  		rate, (u64)parent->max_average_bw * BYTES_IN_MBIT, *bw_share);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  544  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  545  	return 0;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  546  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  547  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  548  static void mlx5e_htb_convert_ceil(struct mlx5e_priv *priv, u64 ceil, u32 *max_average_bw)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  549  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  550  	*max_average_bw = div_u64(ceil, BYTES_IN_MBIT);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  551  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  552  	qos_dbg(priv->mdev, "Convert: ceil %llu -> max_average_bw %u\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  553  		ceil, *max_average_bw);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  554  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  555  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  556  int mlx5e_htb_leaf_alloc_queue(struct mlx5e_priv *priv, u16 classid,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  557  			       u32 parent_classid, u64 rate, u64 ceil)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  558  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  559  	struct mlx5e_qos_node *node, *parent;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  560  	int qid;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  561  	int err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  562  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  563  	qos_dbg(priv->mdev, "TC_HTB_LEAF_ALLOC_QUEUE classid %04x, parent %04x, rate %llu, ceil %llu\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  564  		classid, parent_classid, rate, ceil);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  565  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  566  	qid = mlx5e_find_unused_qos_qid(priv);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  567  	if (qid < 0)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  568  		return qid;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  569  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  570  	parent = mlx5e_sw_node_find(priv, parent_classid);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  571  	if (!parent)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  572  		return -EINVAL;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  573  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  574  	node = mlx5e_sw_node_create_leaf(priv, classid, qid, parent);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  575  	if (IS_ERR(node))
d34a73d10048450 Maxim Mikityanskiy 2020-12-15 @576  		return PTR_ERR(node);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  577  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  578  	node->rate = rate;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  579  	mlx5e_htb_convert_rate(priv, rate, node->parent, &node->bw_share);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  580  	mlx5e_htb_convert_ceil(priv, ceil, &node->max_average_bw);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  581  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  582  	err = mlx5_qos_create_leaf_node(priv->mdev, node->parent->hw_id,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  583  					node->bw_share, node->max_average_bw,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  584  					&node->hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  585  	if (err) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  586  		qos_warn(priv->mdev, "Failed to create a leaf node (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  587  			 classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  588  		mlx5e_sw_node_delete(priv, node);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  589  		return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  590  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  591  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  592  	if (test_bit(MLX5E_STATE_OPENED, &priv->state)) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  593  		err = mlx5e_open_qos_sq(priv, &priv->channels, node);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  594  		if (err)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  595  			qos_warn(priv->mdev, "Failed to create a QoS SQ (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  596  				 classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  597  		else
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  598  			mlx5e_activate_qos_sq(priv, node);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  599  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  600  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  601  	return mlx5e_qid_from_qos(&priv->channels, node->qid);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  602  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  603  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  604  int mlx5e_htb_leaf_to_inner(struct mlx5e_priv *priv, u16 classid, u16 child_classid,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  605  			    u64 rate, u64 ceil)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  606  {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  607  	struct mlx5e_qos_node *node, *child;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  608  	int err, tmp_err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  609  	u32 new_hw_id;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  610  	u16 qid;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  611  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  612  	qos_dbg(priv->mdev, "TC_HTB_LEAF_TO_INNER classid %04x, upcoming child %04x, rate %llu, ceil %llu\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  613  		classid, child_classid, rate, ceil);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  614  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  615  	node = mlx5e_sw_node_find(priv, classid);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  616  	if (!node)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  617  		return -ENOENT;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  618  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  619  	err = mlx5_qos_create_inner_node(priv->mdev, node->parent->hw_id,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  620  					 node->bw_share, node->max_average_bw,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  621  					 &new_hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  622  	if (err) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  623  		qos_warn(priv->mdev, "Failed to create an inner node (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  624  			 classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  625  		return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  626  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  627  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  628  	/* Intentionally reuse the qid for the upcoming first child. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  629  	child = mlx5e_sw_node_create_leaf(priv, child_classid, node->qid, node);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  630  	if (IS_ERR(child)) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15 @631  		err = PTR_ERR(child);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  632  		goto err_destroy_hw_node;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  633  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  634  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  635  	child->rate = rate;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  636  	mlx5e_htb_convert_rate(priv, rate, node, &child->bw_share);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  637  	mlx5e_htb_convert_ceil(priv, ceil, &child->max_average_bw);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  638  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  639  	err = mlx5_qos_create_leaf_node(priv->mdev, new_hw_id, child->bw_share,
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  640  					child->max_average_bw, &child->hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  641  	if (err) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  642  		qos_warn(priv->mdev, "Failed to create a leaf node (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  643  			 classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  644  		goto err_delete_sw_node;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  645  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  646  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  647  	/* No fail point. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  648  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  649  	qid = node->qid;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  650  	/* Pairs with mlx5e_get_txq_by_classid. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  651  	WRITE_ONCE(node->qid, MLX5E_QOS_QID_INNER);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  652  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  653  	if (test_bit(MLX5E_STATE_OPENED, &priv->state)) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  654  		mlx5e_deactivate_qos_sq(priv, qid);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  655  		mlx5e_close_qos_sq(priv, qid);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  656  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  657  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  658  	err = mlx5_qos_destroy_node(priv->mdev, node->hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  659  	if (err) /* Not fatal. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  660  		qos_warn(priv->mdev, "Failed to destroy leaf node %u (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  661  			 node->hw_id, classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  662  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  663  	node->hw_id = new_hw_id;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  664  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  665  	if (test_bit(MLX5E_STATE_OPENED, &priv->state)) {
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  666  		err = mlx5e_open_qos_sq(priv, &priv->channels, child);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  667  		if (err)
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  668  			qos_warn(priv->mdev, "Failed to create a QoS SQ (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  669  				 classid, err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  670  		else
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  671  			mlx5e_activate_qos_sq(priv, child);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  672  	}
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  673  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  674  	return 0;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  675  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  676  err_delete_sw_node:
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  677  	child->qid = MLX5E_QOS_QID_INNER;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  678  	mlx5e_sw_node_delete(priv, child);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  679  
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  680  err_destroy_hw_node:
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  681  	tmp_err = mlx5_qos_destroy_node(priv->mdev, new_hw_id);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  682  	if (tmp_err) /* Not fatal. */
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  683  		qos_warn(priv->mdev, "Failed to roll back creation of an inner node %u (class %04x), err = %d\n",
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  684  			 new_hw_id, classid, tmp_err);
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  685  	return err;
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  686  }
d34a73d10048450 Maxim Mikityanskiy 2020-12-15  687  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30291 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-02-02 15:35 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-15  7:42 [PATCH iproute2-next] tc/htb: Hierarchical QoS hardware offload Maxim Mikityanskiy
2020-12-15  7:42 ` [PATCH net-next v3 0/4] HTB offload Maxim Mikityanskiy
2020-12-15  7:42 ` [PATCH net-next v3 1/4] net: sched: Add multi-queue support to sch_tree_lock Maxim Mikityanskiy
2020-12-15  7:42 ` [PATCH net-next v3 2/4] sch_htb: Hierarchical QoS hardware offload Maxim Mikityanskiy
2020-12-22  1:17   ` Jakub Kicinski
2021-01-04 21:55     ` Maxim Mikityanskiy
2020-12-15  7:42 ` [PATCH net-next v3 3/4] sch_htb: Stats for offloaded HTB Maxim Mikityanskiy
2020-12-15  7:42 ` [PATCH net-next v3 4/4] net/mlx5e: Support HTB offload Maxim Mikityanskiy
2020-12-15 22:26 ` [PATCH iproute2-next] tc/htb: Hierarchical QoS hardware offload Stephen Hemminger
     [not found] ` <8c818766-ec3f-4c0b-f737-ec558613b946@gmail.com>
2021-02-02 11:46   ` Maxim Mikityanskiy
2021-02-02 15:32     ` David Ahern
2020-12-28  0:57 [PATCH net-next v3 4/4] net/mlx5e: Support HTB offload kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.