Revert "tun/tap: add ptr_ring consume helper with netdev queue wakeup"

This reverts commit d4c22d70d7.

There is no netdev queue left to wake after reverting
commit 1d6e569b7d ("tun/tap & vhost-net: avoid ptr_ring tail-drop
when a qdisc is present").

Signed-off-by: Simon Schippers <simon.schippers@tu-dortmund.de>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Link: https://patch.msgid.link/20260728092240.250257-5-simon.schippers@tu-dortmund.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Simon Schippers
2026-07-29 17:12:27 -07:00
committed by Jakub Kicinski
parent 8f83be72d9
commit c3da92af07
+4 -57
View File
@@ -145,8 +145,6 @@ struct tun_file {
struct list_head next;
struct tun_struct *detached;
struct ptr_ring tx_ring;
/* Protected by tx_ring.consumer_lock */
int cons_cnt;
struct xdp_rxq_info xdp_rxq;
};
@@ -590,13 +588,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
rcu_assign_pointer(tun->tfiles[index],
tun->tfiles[tun->numqueues - 1]);
ntfile = rtnl_dereference(tun->tfiles[index]);
spin_lock(&ntfile->tx_ring.consumer_lock);
ntfile->queue_index = index;
ntfile->xdp_rxq.queue_index = index;
ntfile->cons_cnt = 0;
if (__ptr_ring_empty(&ntfile->tx_ring))
netif_wake_subqueue(tun->dev, index);
spin_unlock(&ntfile->tx_ring.consumer_lock);
rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
NULL);
@@ -737,9 +730,6 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
goto out;
}
spin_lock(&tfile->tx_ring.consumer_lock);
tfile->cons_cnt = 0;
spin_unlock(&tfile->tx_ring.consumer_lock);
tfile->queue_index = tun->numqueues;
tfile->socket.sk->sk_shutdown &= ~RCV_SHUTDOWN;
@@ -2126,46 +2116,13 @@ done:
return total;
}
/* Callers must hold ring.consumer_lock */
static void __tun_wake_queue(struct tun_struct *tun,
struct tun_file *tfile, int consumed)
{
struct netdev_queue *txq = netdev_get_tx_queue(tun->dev,
tfile->queue_index);
/* Paired with smp_mb__after_atomic() in tun_net_xmit() */
smp_mb();
if (netif_tx_queue_stopped(txq)) {
tfile->cons_cnt += consumed;
if (tfile->cons_cnt >= tfile->tx_ring.size / 2 ||
__ptr_ring_empty(&tfile->tx_ring)) {
netif_tx_wake_queue(txq);
tfile->cons_cnt = 0;
}
}
}
static void *tun_ring_consume(struct tun_struct *tun, struct tun_file *tfile)
{
void *ptr;
spin_lock(&tfile->tx_ring.consumer_lock);
ptr = __ptr_ring_consume(&tfile->tx_ring);
if (ptr)
__tun_wake_queue(tun, tfile, 1);
spin_unlock(&tfile->tx_ring.consumer_lock);
return ptr;
}
static void *tun_ring_recv(struct tun_struct *tun, struct tun_file *tfile,
int noblock, int *err)
static void *tun_ring_recv(struct tun_file *tfile, int noblock, int *err)
{
DECLARE_WAITQUEUE(wait, current);
void *ptr = NULL;
int error = 0;
ptr = tun_ring_consume(tun, tfile);
ptr = ptr_ring_consume(&tfile->tx_ring);
if (ptr)
goto out;
if (noblock) {
@@ -2177,7 +2134,7 @@ static void *tun_ring_recv(struct tun_struct *tun, struct tun_file *tfile,
while (1) {
set_current_state(TASK_INTERRUPTIBLE);
ptr = tun_ring_consume(tun, tfile);
ptr = ptr_ring_consume(&tfile->tx_ring);
if (ptr)
break;
if (signal_pending(current)) {
@@ -2214,7 +2171,7 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile,
if (!ptr) {
/* Read frames from ring */
ptr = tun_ring_recv(tun, tfile, noblock, &err);
ptr = tun_ring_recv(tfile, noblock, &err);
if (!ptr)
return err;
}
@@ -3669,16 +3626,6 @@ static int tun_queue_resize(struct tun_struct *tun)
dev->tx_queue_len, GFP_KERNEL,
tun_ptr_free);
if (!ret) {
for (i = 0; i < tun->numqueues; i++) {
tfile = rtnl_dereference(tun->tfiles[i]);
spin_lock(&tfile->tx_ring.consumer_lock);
netif_wake_subqueue(tun->dev, tfile->queue_index);
tfile->cons_cnt = 0;
spin_unlock(&tfile->tx_ring.consumer_lock);
}
}
kfree(rings);
return ret;
}