Message ID | YbcmKeLngWW/pb1V@linutronix.de (mailing list archive) |
---|---|
State | Accepted |
Commit | 64445dda9d8384975eca54e3f01886fca61e1db6 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2,net-next] net: dev: Always serialize on Qdisc::busylock in __dev_xmit_skb() on PREEMPT_RT. | expand |
Hello: This patch was applied to netdev/net-next.git (master) by David S. Miller <davem@davemloft.net>: On Mon, 13 Dec 2021 11:53:29 +0100 you wrote: > The root-lock is dropped before dev_hard_start_xmit() is invoked and after > setting the __QDISC___STATE_RUNNING bit. If the Qdisc owner is preempted > by another sender/task with a higher priority then this new sender won't > be able to submit packets to the NIC directly instead they will be > enqueued into the Qdisc. The NIC will remain idle until the Qdisc owner > is scheduled again and finishes the job. > > [...] Here is the summary with links: - [v2,net-next] net: dev: Always serialize on Qdisc::busylock in __dev_xmit_skb() on PREEMPT_RT. https://git.kernel.org/netdev/net-next/c/64445dda9d83 You are awesome, thank you!
diff --git a/net/core/dev.c b/net/core/dev.c index 2a352e668d103..8438553c06b8e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3836,8 +3836,12 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, * separate lock before trying to get qdisc main lock. * This permits qdisc->running owner to get the lock more * often and dequeue packets faster. + * On PREEMPT_RT it is possible to preempt the qdisc owner during xmit + * and then other tasks will only enqueue packets. The packets will be + * sent after the qdisc owner is scheduled again. To prevent this + * scenario the task always serialize on the lock. */ - contended = qdisc_is_running(q); + contended = IS_ENABLED(CONFIG_PREEMPT_RT) || qdisc_is_running(q); if (unlikely(contended)) spin_lock(&q->busylock);
The root-lock is dropped before dev_hard_start_xmit() is invoked and after setting the __QDISC___STATE_RUNNING bit. If the Qdisc owner is preempted by another sender/task with a higher priority then this new sender won't be able to submit packets to the NIC directly instead they will be enqueued into the Qdisc. The NIC will remain idle until the Qdisc owner is scheduled again and finishes the job. By serializing every task on the ->busylock then the task will be preempted by a sender only after the Qdisc has no owner. Always serialize on the busylock on PREEMPT_RT. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- v1…v2: - use "x = cond1 || cond2" as suggested by Jakub. net/core/dev.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)