Message ID | 20190321131744.19224-10-vladbu@mellanox.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | Refactor flower classifier to remove dependency on rtnl lock | expand |
Thu, Mar 21, 2019 at 02:17:41PM CET, vladbu@mellanox.com wrote: >Without rtnl lock protection tcf proto can be deleted concurrently. Check >tcf proto 'deleting' flag after taking tcf spinlock to verify that no >concurrent deletion is in progress. Return EAGAIN error if concurrent >deletion detected, which will cause caller to retry and possibly create new >instance of tcf proto. > >Retry mechanism is a result of fine-grained locking approach used in this >and previous changes in series and is necessary to allow concurrent updates >on same chain instance. Alternative approach would be to lock the whole >chain while updating filters on any of child tp's, adding and removing >classifier instances from the chain. However, since most CPU-intensive >parts of filter update code are specifically in classifier code and its >dependencies (extensions and hw offloads), such approach would negate most >of the gains introduced by this change and previous changes in the series >when updating same chain instance. > >Signed-off-by: Vlad Buslov <vladbu@mellanox.com> >Reviewed-by: Stefano Brivio <sbrivio@redhat.com> Acked-by: Jiri Pirko <jiri@mellanox.com>
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index 70b357f23391..25a4d64b82db 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -1500,6 +1500,14 @@ static int fl_change(struct net *net, struct sk_buff *in_skb, if (!tc_in_hw(fnew->flags)) fnew->flags |= TCA_CLS_FLAGS_NOT_IN_HW; + /* tp was deleted concurrently. -EAGAIN will cause caller to lookup + * proto again or create new one, if necessary. + */ + if (tp->deleting) { + err = -EAGAIN; + goto errout_hw; + } + refcount_inc(&fnew->refcnt); if (fold) { /* Fold filter was deleted concurrently. Retry lookup. */