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 |
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.
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 --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