From: "Matthew Wilcox (Oracle)" <wi...@infradead.org> Instead of iterating over every filter attached to every mark, just iterate over each filter.
Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org> --- net/sched/cls_flower.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index 54026c9e9b05..2a1999d2b507 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -575,18 +575,15 @@ static void fl_destroy(struct tcf_proto *tp, bool rtnl_held, struct netlink_ext_ack *extack) { struct cls_fl_head *head = fl_head_dereference(tp); - struct fl_flow_mask *mask, *next_mask; - struct cls_fl_filter *f, *next; + struct cls_fl_filter *f; + unsigned long handle; bool last; - list_for_each_entry_safe(mask, next_mask, &head->masks, list) { - list_for_each_entry_safe(f, next, &mask->filters, list) { - __fl_delete(tp, f, &last, rtnl_held, extack); - if (last) - break; - } + xa_for_each(&head->filters, handle, f) { + __fl_delete(tp, f, &last, rtnl_held, extack); + if (last) + break; } - xa_destroy(&head->filters); __module_get(THIS_MODULE); tcf_queue_work(&head->rwork, fl_destroy_sleepable); -- 2.23.0.rc1