diff mbox series

[net-next] net: sched: move block offload unbind after all chains are flushed

Message ID 20171102140701.1485-1-jiri@resnulli.us
State Accepted, archived
Delegated to: David Miller
Headers show
Series [net-next] net: sched: move block offload unbind after all chains are flushed | expand

Commit Message

Jiri Pirko Nov. 2, 2017, 2:07 p.m. UTC
From: Jiri Pirko <jiri@mellanox.com>

Currently, the offload unbind is done before the chains are flushed.
That causes driver to unregister block callback before it can get all
the callback calls done during flush, leaving the offloaded tps inside
the HW. So fix the order to prevent this situation and restore the
original behaviour.

Reported-by: Alexander Duyck <alexander.duyck@gmail.com>
Reported-by: Jakub Kicinski <kubakici@wp.pl>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 net/sched/cls_api.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

David Miller Nov. 3, 2017, 6:47 a.m. UTC | #1
From: Jiri Pirko <jiri@resnulli.us>
Date: Thu,  2 Nov 2017 15:07:01 +0100

> From: Jiri Pirko <jiri@mellanox.com>
> 
> Currently, the offload unbind is done before the chains are flushed.
> That causes driver to unregister block callback before it can get all
> the callback calls done during flush, leaving the offloaded tps inside
> the HW. So fix the order to prevent this situation and restore the
> original behaviour.
> 
> Reported-by: Alexander Duyck <alexander.duyck@gmail.com>
> Reported-by: Jakub Kicinski <kubakici@wp.pl>
> Signed-off-by: Jiri Pirko <jiri@mellanox.com>

I'm pretty sure this was my fault during the merge, I had to pick
whether to do it before or after the offload unbind and I picked the
latter.

Applied, thank you.
Jiri Pirko Nov. 3, 2017, 6:59 a.m. UTC | #2
Fri, Nov 03, 2017 at 07:47:44AM CET, davem@davemloft.net wrote:
>From: Jiri Pirko <jiri@resnulli.us>
>Date: Thu,  2 Nov 2017 15:07:01 +0100
>
>> From: Jiri Pirko <jiri@mellanox.com>
>> 
>> Currently, the offload unbind is done before the chains are flushed.
>> That causes driver to unregister block callback before it can get all
>> the callback calls done during flush, leaving the offloaded tps inside
>> the HW. So fix the order to prevent this situation and restore the
>> original behaviour.
>> 
>> Reported-by: Alexander Duyck <alexander.duyck@gmail.com>
>> Reported-by: Jakub Kicinski <kubakici@wp.pl>
>> Signed-off-by: Jiri Pirko <jiri@mellanox.com>
>
>I'm pretty sure this was my fault during the merge, I had to pick
>whether to do it before or after the offload unbind and I picked the
>latter.

I also had it wrong in the original commit 8c4083b30e56fc71b0e94c26374b32d95d5ea461

>
>Applied, thank you.

Thanks.
diff mbox series

Patch

diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index a26c690..3364347 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -343,11 +343,11 @@  void tcf_block_put_ext(struct tcf_block *block,
 	if (!block)
 		return;
 
-	tcf_block_offload_unbind(block, q, ei);
-
 	list_for_each_entry_safe(chain, tmp, &block->chain_list, list)
 		tcf_chain_flush(chain);
 
+	tcf_block_offload_unbind(block, q, ei);
+
 	INIT_WORK(&block->work, tcf_block_put_final);
 	/* Wait for existing RCU callbacks to cool down, make sure their works
 	 * have been queued before this. We can not flush pending works here