From: Akihiko Odaki <akihiko.odaki@gmail.com>
To: Vladislav Yaroshchuk <vladislav.yaroshchuk@jetbrains.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Jason Wang" <jasowang@redhat.com>,
phillip.ennen@gmail.com,
"qemu Developers" <qemu-devel@nongnu.org>,
"Cameron Esfahani" <dirty@apple.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Roman Bolshakov" <r.bolshakov@yadro.com>,
"Alexander Graf" <agraf@csgraf.de>,
"Phillip Tennen" <phillip@axleos.com>,
"Roman Bolshakov" <roman@roolebo.dev>,
"Howard Spoelstra" <hsp.cat7@gmail.com>,
"Alessio Dionisi" <hello@adns.io>,
"Christian Schoenebeck" <qemu_oss@crudebyte.com>,
"Eric Blake" <eblake@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: Re: [PATCH v15 3/8] net/vmnet: implement shared mode (vmnet-shared)
Date: Fri, 4 Mar 2022 03:34:51 +0900 [thread overview]
Message-ID: <CAMVc7JWASjc5BCZEyDyS44wPXFGk+Lw78fVNPPT4PL7ac_pJKg@mail.gmail.com> (raw)
In-Reply-To: <CAGmdLqRCSYzjWBT7OhfP-hZHYwP8F3=4hpwQ+E76ShxjmRTO5Q@mail.gmail.com>
On Fri, Mar 4, 2022 at 12:43 AM Vladislav Yaroshchuk
<vladislav.yaroshchuk@jetbrains.com> wrote:
>
>
>
> On Tue, Mar 1, 2022 at 11:21 AM Akihiko Odaki <akihiko.odaki@gmail.com> wrote:
>>
>> On 2022/03/01 17:09, Vladislav Yaroshchuk wrote:
>> > > Not sure that only one field is enough, cause
>> > > we may have two states on bh execution start:
>> > > 1. There are packets in vmnet buffer s->packets_buf
>> > > that were rejected by qemu_send_async and waiting
>> > > to be sent. If this happens, we should complete sending
>> > > these waiting packets with qemu_send_async firstly,
>> > > and after that we should call vmnet_read to get
>> > > new ones and send them to QEMU;
>> > > 2. There are no packets in s->packets_buf to be sent to
>> > > qemu, we only need to get new packets from vmnet
>> > > with vmnet_read and send them to QEMU
>> >
>> > In case 1, you should just keep calling qemu_send_packet_async.
>> > Actually
>> > qemu_send_packet_async adds the packet to its internal queue and calls
>> > the callback when it is consumed.
>> >
>> >
>> > I'm not sure we can keep calling qemu_send_packet_async,
>> > because as docs from net/queue.c says:
>> >
>> > /* [...]
>> > * If a sent callback is provided to send(), the caller must handle a
>> > * zero return from the delivery handler by not sending any more packets
>> > * until we have invoked the callback. Only in that case will we queue
>> > * the packet.
>> > *
>> > * If a sent callback isn't provided, we just drop the packet to avoid
>> > * unbounded queueing.
>> > */
>> >
>> > So after we did vmnet_read and read N packets
>> > into temporary s->packets_buf, we begin calling
>> > qemu_send_packet_async. If it returns 0 - it says
>> > "no more packets until sent_cb called please".
>> > At this moment we have N packets in s->packets_buf
>> > and already queued K < N of them. But, packets K..N
>> > are not queued and keep waiting for sent_cb to be sent
>> > with qemu_send_packet_async.
>> > Thus when sent_cb called, we should finish
>> > our transfer of packets K..N from s->packets_buf
>> > to qemu calling qemu_send_packet_async.
>> > I meant this.
>>
>> I missed the comment. The description is contradicting with the actual
>> code; qemu_net_queue_send_iov appends the packet to the queue whenever
>> it cannot send one immediately.
>>
>
> Yes, it appends, but (net/queue.c):
> * qemu_net_queue_send tries to deliver the packet
> immediately. If the packet cannot be delivered, the
> qemu_net_queue_append is called and 0 is returned
> to say the caller "the receiver is not ready, hold on";
> * qemu_net_queue_append does a probe before adding
> the packet to the queue:
> if (queue->nq_count >= queue->nq_maxlen && !sent_cb) {
> return; /* drop if queue full and no callback */
> }
>
> The queue is not infinite, so we have three cases:
> 1. The queue is not full -> append the packet, no
> problems here
> 2. The queue is full, no callback -> we cannot notify
> a caller when we're ready, so just drop the packet
> if we can't append it.
> 3. The queue is full, callback present -> we can notify
> a caller when we are ready, so "let's queue this packet,
> but expect no more (!) packets is sent until I call
> sent_cb when the queue is ready"
>
> Therefore if we provide a callback and keep sending
> packets if 0 is returned, this may cause unlimited(!)
> queue growth. To prevent this, we should stop sending
> packets and wait for notification callback to continue.
>
> I don't see any contradiction with that comment.
>
>> Jason Wang, I saw you are in the MAINTAINERS for net/. Can you tell if
>> calling qemu_send_packet_async is allowed after it returns 0?
>>
>
> It may be wrong, but I think it's not allowed to send
> packets after qemu_send_packet_async returns 0.
>
> Jason Wang, can you confirm please?
>
> Best Regards,
>
> Vladislav Yaroshchuk
>
>>
>> Regards,
>> Akihiko Odaki
>
>
>
The unlimited queue growth would not happen if you stop calling
vmnet_read after qemu_send_packet_async returns 0. So I think the
comment should be amended to say something like:
"Once qemu_send_packet_async returns 0, the client should stop reading
more packets from the underlying NIC to prevent infinite growth of the
queue until the last callback gets called."
The unique feature of vmnet is that it can read multiple packets at
once, and I guess it is the reason why the comment in net/queue.c
missed the case. But this is all my guess so I need confirmation from
the maintainer.
Regards,
Akihiko Odaki
next prev parent reply other threads:[~2022-03-03 18:36 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-25 17:13 [PATCH v15 0/8] Add vmnet.framework based network backend Vladislav Yaroshchuk
2022-02-25 17:13 ` [PATCH v15 1/8] net/vmnet: add vmnet dependency and customizable option Vladislav Yaroshchuk
2022-02-25 17:13 ` [PATCH v15 2/8] net/vmnet: add vmnet backends to qapi/net Vladislav Yaroshchuk
2022-02-28 10:07 ` Markus Armbruster
2022-02-28 10:47 ` Vladislav Yaroshchuk
2022-02-25 17:13 ` [PATCH v15 3/8] net/vmnet: implement shared mode (vmnet-shared) Vladislav Yaroshchuk
2022-02-25 17:46 ` Akihiko Odaki
2022-02-26 8:37 ` Vladislav Yaroshchuk
2022-02-26 9:16 ` Akihiko Odaki
2022-02-26 11:33 ` Vladislav Yaroshchuk
2022-02-26 12:26 ` Akihiko Odaki
2022-02-28 11:59 ` Vladislav Yaroshchuk
2022-03-01 5:52 ` Akihiko Odaki
2022-03-01 8:09 ` Vladislav Yaroshchuk
2022-03-01 8:21 ` Akihiko Odaki
2022-03-03 15:43 ` Vladislav Yaroshchuk
2022-03-03 18:34 ` Akihiko Odaki [this message]
2022-03-04 4:39 ` Akihiko Odaki
2022-03-04 1:37 ` Jason Wang
2022-03-04 4:37 ` Akihiko Odaki
2022-03-07 3:59 ` Jason Wang
2022-03-07 4:25 ` Akihiko Odaki
2022-03-07 4:51 ` Jason Wang
2022-03-07 6:54 ` Akihiko Odaki
2022-02-25 17:13 ` [PATCH v15 4/8] net/vmnet: implement host mode (vmnet-host) Vladislav Yaroshchuk
2022-02-25 17:13 ` [PATCH v15 5/8] net/vmnet: implement bridged mode (vmnet-bridged) Vladislav Yaroshchuk
2022-02-25 17:50 ` Akihiko Odaki
2022-02-25 17:14 ` [PATCH v15 6/8] net/vmnet: update qemu-options.hx Vladislav Yaroshchuk
2022-02-25 17:14 ` [PATCH v15 7/8] net/vmnet: update hmp-commands.hx Vladislav Yaroshchuk
2022-02-25 17:14 ` [PATCH v15 8/8] net/vmnet: update MAINTAINERS list Vladislav Yaroshchuk
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=CAMVc7JWASjc5BCZEyDyS44wPXFGk+Lw78fVNPPT4PL7ac_pJKg@mail.gmail.com \
--to=akihiko.odaki@gmail.com \
--cc=agraf@csgraf.de \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=dirty@apple.com \
--cc=eblake@redhat.com \
--cc=f4bug@amsat.org \
--cc=hello@adns.io \
--cc=hsp.cat7@gmail.com \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=phillip.ennen@gmail.com \
--cc=phillip@axleos.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu_oss@crudebyte.com \
--cc=r.bolshakov@yadro.com \
--cc=roman@roolebo.dev \
--cc=vladislav.yaroshchuk@jetbrains.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;
as well as URLs for NNTP newsgroup(s).