Re: "Dead loop on virtual device" error without softirq-BKL on PREEMPT_RT

From: Sebastian Andrzej Siewior

Date: Wed Mar 18 2026 - 07:19:01 EST


On 2026-03-18 11:30:09 [+0100], Daniel Vacek wrote:
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -4821,7 +4821,7 @@ int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev)
> > /* Other cpus might concurrently change txq->xmit_lock_owner
> > * to -1 or to their cpu id, but not to our id.
> > */
> > - if (READ_ONCE(txq->xmit_lock_owner) != cpu) {
> > + if (rt_mutex_owner(&txq->_xmit_lock.lock) != current) {
>
> Ain't this changing the behavior for !RT case? Previously, if it was the same thread
> which has already locked the queue (and hence the same CPU) evaluating this condition,
> the condition was skipped, which is no longer the case with this change.

The above was me thinking and does not even compile for !RT. Commit
b824c3e16c190 ("net: Provide a PREEMPT_RT specific check for
netdev_queue::_xmit_lock") is what was merged in the end.

Sebastian