public inbox for virtualization@lists.linux-foundation.org
 help / color / mirror / Atom feed
From: Simon Schippers <simon.schippers@tu-dortmund.de>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Jason Wang <jasowang@redhat.com>,
	willemdebruijn.kernel@gmail.com, andrew+netdev@lunn.ch,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	pabeni@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: Re: [PATCH net-next v7 3/9] tun/tap: add ptr_ring consume helper with netdev queue wakeup
Date: Mon, 16 Feb 2026 14:27:51 +0100	[thread overview]
Message-ID: <4aeb991b-26e9-4a2e-81a2-85e3ecd6a8a5@tu-dortmund.de> (raw)
In-Reply-To: <20260215053411-mutt-send-email-mst@kernel.org>

On 2/15/26 11:38, Michael S. Tsirkin wrote:
> On Sat, Feb 14, 2026 at 08:51:53PM +0100, Simon Schippers wrote:
>> On 2/14/26 19:18, Michael S. Tsirkin wrote:
>>> On Sat, Feb 14, 2026 at 06:13:14PM +0100, Simon Schippers wrote:
>>>
>>> ...
>>>
>>>> Patched: Waking on __ptr_ring_produce_created_space() is too early. The
>>>>          stop/wake cycle occurs too frequently which slows down
>>>>          performance as can be seen for TAP.
>>>>
>>>> Wake on empty variant: Waking on __ptr_ring_empty() is (slightly) too
>>>>                        late. The consumer starves because the producer
>>>>                        first has to produce packets again. This slows
>>>>                        down performance aswell as can be seen for TAP
>>>> 		       and TAP+vhost-net (both down ~30-40Kpps).
>>>>
>>>> I think something inbetween should be used.
>>>> The wake should be done as late as possible to have as few
>>>> NET_TX_SOFTIRQs as possible but early enough that there are still
>>>> consumable packets remaining to not starve the consumer.
>>>>
>>>> However, I can not think of a proper way to implement this right now.
>>>>
>>>> Thanks!
>>>
>>> What is the difficulty?
>>
>> There is no way to tell how many entries are currently in the ring.
>>
>>>
>>> Your patches check __ptr_ring_consume_created_space(..., 1).
>>
>> Yes, and this returns if either 0 space or a batch size space was
>> created.
>> (In the current implementation it would be false or true, but as
>> discussed earlier this can be changed.)
>>
>>>
>>> How about __ptr_ring_consume_created_space(..., 8) then? 16?
>>>
>>
>> This would return how much space the last 8/16 consume operations
>> created. But in tap_ring_consume() we only consume a single entry.
>>
>> Maybe we could avoid __ptr_ring_consume_created_space with this:
>> 1. Wait for the queue to stop with netif_tx_queue_stopped()
>> 2. Then count the numbers of consumes we did after the queue stopped
>> 3. Wake the queue if count >= threshold with threshold >= ring->batch
>>
>> I would say that such a threshold could be something like ring->size/2.
> 
> 
> To add to what i wrote, size/2 means:
> leave half a ring for consumer, half a ring for producer.
> 
> If one of the two is more bursty, we might want a different
> balance. Offhand, the kernel is less bursty and userspace is
> more bursty.
> 
> So it's an interesting question but size/2 is a good start.
> 

I implemented this (I can post the implementation if you want)
and I got:
- 1216Kpps for TAP --> worse performance than stock (1293 Kpps) and
  also worse performance than wake on empty (1248 Kpps)
- 1408Kpps for TAP+vhost-net --> pretty much same performance as
  stock (1411 Kpps)

I also tried 7/8 for producer, 1/8 for consumer the results did not
really get better: 
- 1227Kpps for TAP --> worse performance than stock (1293 Kpps) and
  also worse performance than wake on empty (1248 Kpps); better
  performance than 1/2
- 1350Kpps for TAP+vhost-net --> worse performance than everything


So my theory of using something inbetween did not hold up here.
Judging from my benchmarking the best solution would be to use:
- Wake on empty for TAP --> 1248Kpps (1293 Kpps stock, 3% worse)
- Wake on __ptr_ring_consume_created_space() for TAP+vhost-net
  --> 1410Kpps (1411 Kpps stock, 0% worse)

This would also keep the implementation simple.


  reply	other threads:[~2026-02-16 13:28 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
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 [this message]
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=4aeb991b-26e9-4a2e-81a2-85e3ecd6a8a5@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