| From 51c08aecf1f751c45198da63e8982e6bc0675362 Mon Sep 17 00:00:00 2001 |
| From: Petr Machata <petrm@mellanox.com> |
| Date: Mon, 6 Jan 2020 18:01:55 +0000 |
| Subject: [PATCH] mlxsw: spectrum_qdisc: Ignore grafting of invisible FIFO |
| |
| commit 3971a535b839489e4ea31796cc086e6ce616318c upstream. |
| |
| The following patch will change PRIO to replace a removed Qdisc with an |
| invisible FIFO, instead of NOOP. mlxsw will see this replacement due to the |
| graft message that is generated. But because FIFO does not issue its own |
| REPLACE message, when the graft operation takes place, the Qdisc that mlxsw |
| tracks under the indicated band is still the old one. The child |
| handle (0:0) therefore does not match, and mlxsw rejects the graft |
| operation, which leads to an extack message: |
| |
| Warning: Offloading graft operation failed. |
| |
| Fix by ignoring the invisible children in the PRIO graft handler. The |
| DESTROY message of the removed Qdisc is going to follow shortly and handle |
| the removal. |
| |
| Fixes: 32dc5efc6cb4 ("mlxsw: spectrum: qdiscs: prio: Handle graft command") |
| Signed-off-by: Petr Machata <petrm@mellanox.com> |
| Acked-by: Jiri Pirko <jiri@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c |
| index bdf53cf350f6..720514b5c006 100644 |
| --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c |
| +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c |
| @@ -650,6 +650,13 @@ mlxsw_sp_qdisc_prio_graft(struct mlxsw_sp_port *mlxsw_sp_port, |
| mlxsw_sp_port->tclass_qdiscs[tclass_num].handle == p->child_handle) |
| return 0; |
| |
| + if (!p->child_handle) { |
| + /* This is an invisible FIFO replacing the original Qdisc. |
| + * Ignore it--the original Qdisc's destroy will follow. |
| + */ |
| + return 0; |
| + } |
| + |
| /* See if the grafted qdisc is already offloaded on any tclass. If so, |
| * unoffload it. |
| */ |
| -- |
| 2.7.4 |
| |