mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 21:03:32 +00:00
net: sched: avoid unnecessary seqcount operation for lockless qdisc
qdisc->running seqcount operation is mainly used to do heuristic locking on q->busylock for locked qdisc, see qdisc_is_running() and __dev_xmit_skb(). So avoid doing seqcount operation for qdisc with TCQ_F_NOLOCK flag. Acked-by: Jakub Kicinski <kuba@kernel.org> Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> # flexcan Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
38f75922a6
commit
dd25296afa
1 changed files with 3 additions and 1 deletions
|
@ -188,6 +188,7 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc)
|
|||
|
||||
nolock_empty:
|
||||
WRITE_ONCE(qdisc->empty, false);
|
||||
return true;
|
||||
} else if (qdisc_is_running(qdisc)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -201,7 +202,6 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc)
|
|||
|
||||
static inline void qdisc_run_end(struct Qdisc *qdisc)
|
||||
{
|
||||
write_seqcount_end(&qdisc->running);
|
||||
if (qdisc->flags & TCQ_F_NOLOCK) {
|
||||
spin_unlock(&qdisc->seqlock);
|
||||
|
||||
|
@ -210,6 +210,8 @@ static inline void qdisc_run_end(struct Qdisc *qdisc)
|
|||
clear_bit(__QDISC_STATE_MISSED, &qdisc->state);
|
||||
__netif_schedule(qdisc);
|
||||
}
|
||||
} else {
|
||||
write_seqcount_end(&qdisc->running);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue