Thread (16 messages) 16 messages, 5 authors, 2021-12-14

Re: [PATCH net-next] net: dev: Always serialize on Qdisc::busylock in __dev_xmit_skb() on PREEMPT_RT.

flat view

From: Eric Dumazet <hidden>
Date: 2021-12-10 16:53:10

On Fri, Dec 10, 2021 at 8:46 AM Sebastian Andrzej Siewior
[off-list ref] wrote:
On 2021-12-10 17:35:21 [+0100], Paolo Abeni wrote:
quoted
On Fri, 2021-12-10 at 16:41 +0100, Sebastian Andrzej Siewior wrote:
quoted
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.
Not sure how much is relevant in the RT context, but this should impact
the xmit tput in a relevant, negative way.
Negative because everyone blocks on lock and transmits packets directly
instead of adding it to the queue and leaving for more?
quoted
If I read correctly, you use the busylock to trigger priority ceiling
on each sender. I'm wondering if there are other alternative ways (no
contended lock, just some RT specific annotation) to mark a whole
section of code for priority ceiling ?!?
priority ceiling as you call it, happens always with the help of a lock.
The root_lock is dropped in sch_direct_xmit().
qdisc_run_begin() sets only a bit with no owner association.
If I know why the busy-lock bad than I could add another one. The
important part is force the sende out of the section so the task with
the higher priority can send packets instead of queueing them only.
Problem is that if you have a qdisc, qdisc_dequeue() will not know that the
packet queued by high prio thread needs to shortcut all prior packets and
be sent right away.

Because of that, it seems just better that a high prio thread returns
immediately and let the dirty work (dequeue packets and send them to devices)
be done by other threads ?
quoted
Thanks!

Paolo
Sebastian
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help