mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Revert "tun/tap: add ptr_ring consume helper with netdev queue wakeup"
This reverts commitd4c22d70d7. There is no netdev queue left to wake after reverting commit1d6e569b7d("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:
committed by
Jakub Kicinski
parent
8f83be72d9
commit
c3da92af07
+4
-57
@@ -145,8 +145,6 @@ struct tun_file {
|
|||||||
struct list_head next;
|
struct list_head next;
|
||||||
struct tun_struct *detached;
|
struct tun_struct *detached;
|
||||||
struct ptr_ring tx_ring;
|
struct ptr_ring tx_ring;
|
||||||
/* Protected by tx_ring.consumer_lock */
|
|
||||||
int cons_cnt;
|
|
||||||
struct xdp_rxq_info xdp_rxq;
|
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],
|
rcu_assign_pointer(tun->tfiles[index],
|
||||||
tun->tfiles[tun->numqueues - 1]);
|
tun->tfiles[tun->numqueues - 1]);
|
||||||
ntfile = rtnl_dereference(tun->tfiles[index]);
|
ntfile = rtnl_dereference(tun->tfiles[index]);
|
||||||
spin_lock(&ntfile->tx_ring.consumer_lock);
|
|
||||||
ntfile->queue_index = index;
|
ntfile->queue_index = index;
|
||||||
ntfile->xdp_rxq.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],
|
rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
@@ -737,9 +730,6 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
|
|||||||
goto out;
|
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->queue_index = tun->numqueues;
|
||||||
tfile->socket.sk->sk_shutdown &= ~RCV_SHUTDOWN;
|
tfile->socket.sk->sk_shutdown &= ~RCV_SHUTDOWN;
|
||||||
|
|
||||||
@@ -2126,46 +2116,13 @@ done:
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callers must hold ring.consumer_lock */
|
static void *tun_ring_recv(struct tun_file *tfile, int noblock, int *err)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
DECLARE_WAITQUEUE(wait, current);
|
DECLARE_WAITQUEUE(wait, current);
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
ptr = tun_ring_consume(tun, tfile);
|
ptr = ptr_ring_consume(&tfile->tx_ring);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
goto out;
|
goto out;
|
||||||
if (noblock) {
|
if (noblock) {
|
||||||
@@ -2177,7 +2134,7 @@ static void *tun_ring_recv(struct tun_struct *tun, struct tun_file *tfile,
|
|||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
set_current_state(TASK_INTERRUPTIBLE);
|
set_current_state(TASK_INTERRUPTIBLE);
|
||||||
ptr = tun_ring_consume(tun, tfile);
|
ptr = ptr_ring_consume(&tfile->tx_ring);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
break;
|
break;
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current)) {
|
||||||
@@ -2214,7 +2171,7 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile,
|
|||||||
|
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
/* Read frames from ring */
|
/* Read frames from ring */
|
||||||
ptr = tun_ring_recv(tun, tfile, noblock, &err);
|
ptr = tun_ring_recv(tfile, noblock, &err);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -3669,16 +3626,6 @@ static int tun_queue_resize(struct tun_struct *tun)
|
|||||||
dev->tx_queue_len, GFP_KERNEL,
|
dev->tx_queue_len, GFP_KERNEL,
|
||||||
tun_ptr_free);
|
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);
|
kfree(rings);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user