From: Simon Schippers <simon.schippers@tu-dortmund.de>
To: Jason Wang <jasowang@redhat.com>
Cc: willemdebruijn.kernel@gmail.com, andrew+netdev@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, mst@redhat.com, eperezma@redhat.com,
leiyang@redhat.com, stephen@networkplumber.org, jon@nutanix.com,
tim.gebauer@tu-dortmund.de, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
virtualization@lists.linux.dev
Subject: [PATCH net-next v7 3/9] tun/tap: add ptr_ring consume helper with netdev queue wakeup
Date: Thu, 8 Jan 2026 08:40:51 +0100 [thread overview]
Message-ID: <1e30464c-99ae-441e-bb46-6d0485d494dc@tu-dortmund.de> (raw)
In-Reply-To: <CACGkMEuSiEcyaeFeZd0=RgNpviJgNvUDq_ctjeMLT5jZTgRkwQ@mail.gmail.com>
On 1/8/26 04:38, Jason Wang wrote:
> On Thu, Jan 8, 2026 at 5:06 AM Simon Schippers
> <simon.schippers@tu-dortmund.de> wrote:
>>
>> Introduce {tun,tap}_ring_consume() helpers that wrap __ptr_ring_consume()
>> and wake the corresponding netdev subqueue when consuming an entry frees
>> space in the underlying ptr_ring.
>>
>> Stopping of the netdev queue when the ptr_ring is full will be introduced
>> in an upcoming commit.
>>
>> Co-developed-by: Tim Gebauer <tim.gebauer@tu-dortmund.de>
>> Signed-off-by: Tim Gebauer <tim.gebauer@tu-dortmund.de>
>> Signed-off-by: Simon Schippers <simon.schippers@tu-dortmund.de>
>> ---
>> drivers/net/tap.c | 23 ++++++++++++++++++++++-
>> drivers/net/tun.c | 25 +++++++++++++++++++++++--
>> 2 files changed, 45 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/tap.c b/drivers/net/tap.c
>> index 1197f245e873..2442cf7ac385 100644
>> --- a/drivers/net/tap.c
>> +++ b/drivers/net/tap.c
>> @@ -753,6 +753,27 @@ static ssize_t tap_put_user(struct tap_queue *q,
>> return ret ? ret : total;
>> }
>>
>> +static void *tap_ring_consume(struct tap_queue *q)
>> +{
>> + struct ptr_ring *ring = &q->ring;
>> + struct net_device *dev;
>> + void *ptr;
>> +
>> + spin_lock(&ring->consumer_lock);
>> +
>> + ptr = __ptr_ring_consume(ring);
>> + if (unlikely(ptr && __ptr_ring_consume_created_space(ring, 1))) {
>> + rcu_read_lock();
>> + dev = rcu_dereference(q->tap)->dev;
>> + netif_wake_subqueue(dev, q->queue_index);
>> + rcu_read_unlock();
>> + }
>> +
>> + spin_unlock(&ring->consumer_lock);
>> +
>> + return ptr;
>> +}
>> +
>> static ssize_t tap_do_read(struct tap_queue *q,
>> struct iov_iter *to,
>> int noblock, struct sk_buff *skb)
>> @@ -774,7 +795,7 @@ static ssize_t tap_do_read(struct tap_queue *q,
>> TASK_INTERRUPTIBLE);
>>
>> /* Read frames from the queue */
>> - skb = ptr_ring_consume(&q->ring);
>> + skb = tap_ring_consume(q);
>> if (skb)
>> break;
>> if (noblock) {
>> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
>> index 8192740357a0..7148f9a844a4 100644
>> --- a/drivers/net/tun.c
>> +++ b/drivers/net/tun.c
>> @@ -2113,13 +2113,34 @@ static ssize_t tun_put_user(struct tun_struct *tun,
>> return total;
>> }
>>
>> +static void *tun_ring_consume(struct tun_file *tfile)
>> +{
>> + struct ptr_ring *ring = &tfile->tx_ring;
>> + struct net_device *dev;
>> + void *ptr;
>> +
>> + spin_lock(&ring->consumer_lock);
>> +
>> + ptr = __ptr_ring_consume(ring);
>> + if (unlikely(ptr && __ptr_ring_consume_created_space(ring, 1))) {
>
> I guess it's the "bug" I mentioned in the previous patch that leads to
> the check of __ptr_ring_consume_created_space() here. If it's true,
> another call to tweak the current API.
>
>> + rcu_read_lock();
>> + dev = rcu_dereference(tfile->tun)->dev;
>> + netif_wake_subqueue(dev, tfile->queue_index);
>
> This would cause the producer TX_SOFTIRQ to run on the same cpu which
> I'm not sure is what we want.
What else would you suggest calling to wake the queue?
>
>> + rcu_read_unlock();
>> + }
>
> Btw, this function duplicates a lot of logic of tap_ring_consume() we
> should consider to merge the logic.
Yes, it is largely the same approach, but it would require accessing the
net_device each time.
>
>> +
>> + spin_unlock(&ring->consumer_lock);
>> +
>> + return ptr;
>> +}
>> +
>> static void *tun_ring_recv(struct tun_file *tfile, int noblock, int *err)
>> {
>> DECLARE_WAITQUEUE(wait, current);
>> void *ptr = NULL;
>> int error = 0;
>>
>> - ptr = ptr_ring_consume(&tfile->tx_ring);
>> + ptr = tun_ring_consume(tfile);
>
> I'm not sure having a separate patch like this may help. For example,
> it will introduce performance regression.
I ran benchmarks for the whole patch set with noqueue (where the queue is
not stopped to preserve the old behavior), as described in the cover
letter, and observed no performance regression. This leads me to conclude
that there is no performance impact because of this patch when the queue
is not stopped.
>
>> if (ptr)
>> goto out;
>> if (noblock) {
>> @@ -2131,7 +2152,7 @@ static void *tun_ring_recv(struct tun_file *tfile, int noblock, int *err)
>>
>> while (1) {
>> set_current_state(TASK_INTERRUPTIBLE);
>> - ptr = ptr_ring_consume(&tfile->tx_ring);
>> + ptr = tun_ring_consume(tfile);
>> if (ptr)
>> break;
>> if (signal_pending(current)) {
>> --
>> 2.43.0
>>
>
> Thanks
>
next prev parent reply other threads:[~2026-01-08 7:41 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-07 21:04 [PATCH net-next v7 0/9] tun/tap & vhost-net: apply qdisc backpressure on full ptr_ring to reduce TX drops Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 1/9] ptr_ring: move free-space check into separate helper Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 2/9] ptr_ring: add helper to detect newly freed space on consume Simon Schippers
2026-01-08 3:23 ` Jason Wang
2026-01-08 7:20 ` Simon Schippers
2026-01-09 6:01 ` Jason Wang
2026-01-09 6:47 ` Michael S. Tsirkin
2026-01-09 7:22 ` Michael S. Tsirkin
2026-01-09 7:35 ` Simon Schippers
2026-01-09 8:31 ` Michael S. Tsirkin
2026-01-09 9:06 ` Simon Schippers
2026-01-12 16:29 ` Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 3/9] tun/tap: add ptr_ring consume helper with netdev queue wakeup Simon Schippers
2026-01-08 3:38 ` Jason Wang
2026-01-08 7:40 ` Simon Schippers [this message]
2026-01-09 6:02 ` Jason Wang
2026-01-09 9:31 ` Simon Schippers
2026-01-21 9:32 ` Simon Schippers
2026-01-22 5:35 ` Jason Wang
2026-01-23 3:05 ` Jason Wang
2026-01-23 9:54 ` Simon Schippers
2026-01-27 16:47 ` Simon Schippers
2026-01-28 7:03 ` Jason Wang
2026-01-28 7:53 ` Simon Schippers
2026-01-29 1:14 ` Jason Wang
2026-01-29 9:24 ` Simon Schippers
2026-01-30 1:51 ` Jason Wang
2026-02-01 20:19 ` Simon Schippers
2026-02-03 3:48 ` Jason Wang
2026-02-04 15:43 ` Simon Schippers
2026-02-05 3:59 ` Jason Wang
2026-02-05 22:28 ` Simon Schippers
2026-02-06 3:21 ` Jason Wang
2026-02-08 18:18 ` Simon Schippers
2026-02-12 0:12 ` Simon Schippers
2026-02-12 7:06 ` Michael S. Tsirkin
2026-02-12 8:03 ` Simon Schippers
2026-02-12 8:14 ` Jason Wang
2026-02-14 17:13 ` Simon Schippers
2026-02-14 18:18 ` Michael S. Tsirkin
2026-02-14 19:51 ` Simon Schippers
2026-02-14 23:49 ` Michael S. Tsirkin
2026-02-15 10:38 ` Michael S. Tsirkin
2026-02-16 13:27 ` Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 4/9] tun/tap: add batched ptr_ring consume functions " Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 5/9] tun/tap: add unconsume function for returning entries to ptr_ring Simon Schippers
2026-01-08 3:40 ` Jason Wang
2026-01-07 21:04 ` [PATCH net-next v7 6/9] tun/tap: add helper functions to check file type Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 7/9] vhost-net: vhost-net: replace rx_ring with tun/tap ring wrappers Simon Schippers
2026-01-08 4:38 ` Jason Wang
2026-01-08 7:47 ` Simon Schippers
2026-01-09 6:04 ` Jason Wang
2026-01-09 9:57 ` Simon Schippers
2026-01-12 2:54 ` Jason Wang
2026-01-12 4:42 ` Michael S. Tsirkin
2026-01-07 21:04 ` [PATCH net-next v7 8/9] tun/tap: drop get ring exports Simon Schippers
2026-01-07 21:04 ` [PATCH net-next v7 9/9] tun/tap & vhost-net: avoid ptr_ring tail-drop when qdisc is present Simon Schippers
2026-01-08 4:37 ` Jason Wang
2026-01-08 8:01 ` Simon Schippers
2026-01-09 6:09 ` Jason Wang
2026-01-09 10:14 ` Simon Schippers
2026-01-12 2:22 ` Jason Wang
2026-01-12 11:08 ` Simon Schippers
2026-01-12 11:18 ` Michael S. Tsirkin
2026-01-13 6:26 ` Jason Wang
2026-01-12 4:33 ` Michael S. Tsirkin
2026-01-12 11:17 ` Simon Schippers
2026-01-12 11:19 ` Michael S. Tsirkin
2026-01-12 11:28 ` Simon Schippers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1e30464c-99ae-441e-bb46-6d0485d494dc@tu-dortmund.de \
--to=simon.schippers@tu-dortmund.de \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eperezma@redhat.com \
--cc=jasowang@redhat.com \
--cc=jon@nutanix.com \
--cc=kuba@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=leiyang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=stephen@networkplumber.org \
--cc=tim.gebauer@tu-dortmund.de \
--cc=virtualization@lists.linux.dev \
--cc=willemdebruijn.kernel@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox