From: "Clément Chigot" <chigot@adacore.com>
To: Bin Meng <bmeng.cn@gmail.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@gmail.com>,
"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>,
"Bin Meng" <bin.meng@windriver.com>,
"Daniel P. Berrangé" <berrange@redhat.com>
Subject: Re: [PATCH 49/51] io/channel-watch: Fix socket watch on Windows
Date: Tue, 6 Sep 2022 09:41:41 +0200 [thread overview]
Message-ID: <CAJ307EhBSg4ENykkbqsT=5oBjc34JR+d3bJAVSTaxRM-uG4LGg@mail.gmail.com> (raw)
In-Reply-To: <CAEUhbmW0v_5Ro3mY6Ztt=MmZJf=ueApmNGpT=+1RTPLrWd4=Rg@mail.gmail.com>
Hi Bin,
> On Mon, Sep 5, 2022 at 4:10 PM Clément Chigot <chigot@adacore.com> wrote:
> >
> > Hi all,
> >
> > I did reach the same issue while trying to connect a gdb to qemu on
> > Windows hosts. Some inputs send by gdb aren't getting correctly pulled,
> > they will be retrieved only once g_poll times out.
> >
> > As you explained earlier, the issue, AFAICT, is that WSAEnumNetworkEvents
> > will reset the internal events before select can detect them.
>
> No, I don't think WSAEnumNetworkEvents and select cannot be used together.
>
> MSDN says:
> https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select
>
> "The select function has no effect on the persistence of socket events
> registered with WSAAsyncSelect or WSAEventSelect."
>
> That sounds to me like current usage in QEMU codes does not have a problem.
Yes, but WSAEnumNetworkEvents has effects. Thus, it might reset the
events before
select detects them no ?
Moreover, I'm not sure what they mean by "persistence of WSAEventSelect".
Does that mean that select doesn't change the events wanted to be
notified as set
by WSAEventSelect or that select isn't resetting the events once
retrieved, as you
imply ?
Moreover, the current code is creating the event object with
CreateEvent(NULL, FALSE, FALSE, NULL). The first FALSE implies that we want
an auto-reset. The MSDN doc says:
"Boolean that specifies whether a manual-reset or auto-reset event
object is created.
If TRUE, then you must use the ResetEvent function to manually reset
the state to
nonsignaled. If FALSE, the system automatically resets the state to nonsignaled
after a single waiting thread has been released."
However, I'm not sure if I understand correctly what "after a single
waiting thread
has been released." signified. Is the reset occuring after recv() or
after select or
WSAEnumNetworkEvents calls ? AFAIR, I've tried to move to manual-reset with
the current qemu but it doesn't change anything.
> > Sadly, I didn't find any way to adjust the current code using select to
> > avoid that. As select and any cleaner (ever WSAEnumNetworkEvents or
> > WSEResetEvent) cannot be called in an atomic way, it seems that events
> > can always be received between the reset and the select. At least, all
> > my attempts failed.
>
> According to MSDN:
> https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaeventselect
>
> "Having successfully recorded the occurrence of the network event (by
> setting the corresponding bit in the internal network event record)
> and signaled the associated event object, no further actions are taken
> for that network event until the application makes the function call
> that implicitly reenables the setting of that network event and
> signaling of the associated event object."
>
> So events will be kept unsignaled after they are signaled, until the
> reenable routine is called. For example, recv() for the FD_READ event.
In my understanding, WSAEnumNetworkEvents states the opposite:
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaenumnetworkevents
"The Windows Sockets provider guarantees that the operations of copying
the network event record, clearing it and resetting any associated event
object are atomic, such that the next occurrence of a nominated network
event will cause the event object to become set."
> > The only solution I've found is to move completely to the Windows API
> > and stop calling select. This, however, needs some tricks. In Particular, we
> > need to "remove" the support of GSources having only G_IO_HUP.
> > This is already kind of done as we currently don't detect them in
> > qio_channel_socket_source_check anyway.
> > This is mandatory because of the two GSources created on the same socket.
> > IIRC, the first one (I'll call it the master GSource) is created during
> > the initialization of the channel-socket by update_ioc_handlers and will
> > have only G_IO_HUP to catch up.
> > The second one is created during the "prepare" phase of the first one,
> > in io_watch_poll_prepare. This one will have all the events we want
> > to pull (G_IO_IN here).
> > As they are referring to the same socket, the Windows API cannot know
> > on which GSources we want to catch which events. The solution is then
>
> I think Windows knows which events to catch. As WSAEventSelect() in
> channel-watch.c::qio_channel_create_socket_watch() tells Windows which
> event it should monitor.
>
> Both the "master" and "child" GSources are watching on the same socket
> with G_IO_IN condition (see qio_channel_create_socket_watch), and GLib
> is smart enough to merge these two resources into one in the event
> handle array which is passed to WaitForMultipleObjectsEx() in
> g_poll().
I've forgotten to mention it. But the current code only fails with newer glib
versions. I wasn't able to test all of them but it's working with 2.54 and
starts failing with versions after 2.60.
The qemu master isn't supporting 2.54 anymore. Thus I've tested that with
our internal qemu-6 which runs with 2.54. When upgrading glib, it starts
behaving like our issue.
Sadly, I wasn't able to test with glib-2.56/2.58 nor to find anything relevant
in glib code which would explain our issue. (But I wasn't aware of the
two GSources at that time so maybe it's worth investigating again).
> I checked your patch, what you did seems to be something one would
> naturally write, but what is currently in the QEMU sources seems to be
> written intentionally.
>
> +Paolo Bonzini , you are the one who implemented the socket watch on
> Windows. Could you please help analyze this issue?
>
> > to avoid WSAEnumNetworkEvents for the master GSource which only has
> > G_IO_HUP (or for any GSource having only that).
> > As I said above, the current code doesn't do anything with it anyway.
> > So, IMO, it's safe to do so.
> >
> > I'll send you my patch attached. I was planning to send it in the following
> > weeks anyway. I was just waiting to be sure everything looks fine on our
> > CI. Feel free to test and modify it if needed.
>
> I tested your patch. Unfortunately there is still one test case
> (migration-test.exe) throwing up the "Broken pipe" message.
I must say I didn't fully test it against qemu testsuite yet. Maybe there are
some refinements to be done. "Broken pipe" might be linked to the missing
G_IO_HUP support.
> Can you test my patch instead to see if your gdb issue can be fixed?
Yeah sure. I'll try to do it this afternoon.
next prev parent reply other threads:[~2022-09-06 7:50 UTC|newest]
Thread overview: 174+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-24 9:39 [PATCH 00/51] tests/qtest: Enable running qtest on Windows Bin Meng
2022-08-24 9:39 ` [PATCH 01/51] tests/qtest: Use g_setenv() Bin Meng
2022-08-24 11:45 ` Thomas Huth
2022-09-04 14:10 ` Philippe Mathieu-Daudé via
2022-08-24 9:39 ` [PATCH 02/51] tests/qtest: Use g_mkdtemp() Bin Meng
2022-08-24 14:42 ` Thomas Huth
2022-08-24 9:39 ` [PATCH 03/51] block: Unify the get_tmp_filename() implementation Bin Meng
2022-08-31 12:54 ` Marc-André Lureau
2022-08-31 13:19 ` Daniel P. Berrangé
2022-09-01 6:41 ` Bin Meng
2022-08-24 9:39 ` [PATCH 04/51] semihosting/arm-compat-semi: Avoid using hardcoded /tmp Bin Meng
2022-08-31 12:59 ` Marc-André Lureau
2022-09-01 7:11 ` Bin Meng
2022-09-01 9:20 ` Richard Henderson
2022-08-24 9:39 ` [PATCH 05/51] tcg: " Bin Meng
2022-08-31 13:02 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 06/51] util/qemu-sockets: Use g_get_tmp_dir() to get the directory for temporary files Bin Meng
2022-08-31 13:05 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 07/51] tests: Avoid using hardcoded /tmp in test cases Bin Meng
2022-08-24 17:51 ` Dr. David Alan Gilbert
2022-08-25 8:41 ` Thomas Huth
2022-08-24 9:39 ` [PATCH 08/51] block/vvfat: Unify the mkdir() call Bin Meng
2022-08-31 13:08 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 09/51] fsdev/virtfs-proxy-helper: Use g_mkdir_with_parents() Bin Meng
2022-08-26 10:09 ` Christian Schoenebeck
2022-08-26 10:30 ` Bin Meng
2022-08-26 11:16 ` Christian Schoenebeck
2022-08-26 12:38 ` Bin Meng
2022-08-26 13:27 ` Christian Schoenebeck
2022-08-24 9:39 ` [PATCH 10/51] hw/usb: dev-mtp: " Bin Meng
2022-08-31 13:09 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 11/51] qga/commands-posix-ssh: " Bin Meng
2022-08-24 14:41 ` Konstantin Kostiuk
2022-08-26 14:46 ` Bin Meng
2022-08-24 9:39 ` [PATCH 12/51] tests: " Bin Meng
2022-08-24 17:58 ` Dr. David Alan Gilbert
2022-08-26 14:49 ` Bin Meng
2022-08-24 9:39 ` [PATCH 13/51] tests/qtest: migration-test: Handle link() for win32 Bin Meng
2022-08-24 18:41 ` Dr. David Alan Gilbert
2022-08-24 9:39 ` [PATCH 14/51] backends/tpm: Exclude headers and macros that don't exist on win32 Bin Meng
2022-08-24 12:35 ` Stefan Berger
2022-08-31 13:20 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 15/51] tests/qtest: Adapt {m48t59,rtc}-test cases for win32 Bin Meng
2022-08-25 8:20 ` Thomas Huth
2022-08-24 9:39 ` [PATCH 16/51] tests/qtest: Build e1000e-test for posix only Bin Meng
2022-08-25 10:59 ` Thomas Huth
2022-08-24 9:39 ` [PATCH 17/51] tests/qtest: Build virtio-net-test " Bin Meng
2022-08-25 11:27 ` Thomas Huth
2022-08-31 13:25 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 18/51] tests/qtest: Build cases that use memory-backend-file " Bin Meng
2022-08-25 12:39 ` Thomas Huth
2022-08-24 9:39 ` [PATCH 19/51] tests/qtest: Build test-filter-{mirror, redirector} cases " Bin Meng
2022-08-25 11:37 ` Thomas Huth
2022-08-31 13:27 ` Marc-André Lureau
2022-08-24 9:39 ` [PATCH 20/51] tests/qtest: i440fx-test: Skip running request_{bios, pflash} for win32 Bin Meng
2022-08-25 11:40 ` [PATCH 20/51] tests/qtest: i440fx-test: Skip running request_{bios,pflash} " Thomas Huth
2022-08-31 13:40 ` [PATCH 20/51] tests/qtest: i440fx-test: Skip running request_{bios, pflash} " Marc-André Lureau
2022-09-02 8:29 ` Bin Meng
2022-08-24 9:39 ` [PATCH 21/51] tests/qtest: migration-test: Skip running test_migrate_fd_proto on win32 Bin Meng
2022-08-24 18:49 ` Dr. David Alan Gilbert
2022-09-04 14:15 ` Philippe Mathieu-Daudé via
2022-08-24 9:40 ` [PATCH 22/51] tests/qtest: qmp-test: Skip running test_qmp_oob for win32 Bin Meng
2022-08-25 11:45 ` Thomas Huth
2022-08-29 13:14 ` Markus Armbruster
2022-08-29 14:23 ` Bin Meng
2022-08-29 15:06 ` Markus Armbruster
2022-09-04 14:07 ` Philippe Mathieu-Daudé via
2022-08-24 9:40 ` [PATCH 23/51] accel/qtest: Support qtest accelerator for Windows Bin Meng
2022-08-31 13:49 ` Marc-André Lureau
2022-09-02 8:28 ` Bin Meng
2022-08-24 9:40 ` [PATCH 24/51] tests/qtest: libqos: Drop inclusion of <sys/wait.h> Bin Meng
2022-08-25 11:55 ` Thomas Huth
2022-08-31 13:50 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 25/51] tests/qtest: libqos: Rename malloc.h to libqos-malloc.h Bin Meng
2022-08-25 11:51 ` Thomas Huth
2022-08-31 13:51 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 26/51] tests/qtest: libqtest: Move global_qtest definition back to libqtest.c Bin Meng
2022-08-25 11:59 ` Thomas Huth
2022-08-24 9:40 ` [PATCH 27/51] tests/qtest: Use send/recv for socket communication Bin Meng
2022-08-25 13:04 ` Thomas Huth
2022-08-26 14:59 ` Bin Meng
2022-08-26 18:26 ` Thomas Huth
2022-08-31 14:05 ` Marc-André Lureau
2022-08-31 14:19 ` Daniel P. Berrangé
2022-09-02 14:24 ` Bin Meng
2022-08-24 9:40 ` [PATCH 28/51] tests/qtest: libqtest: Exclude the *_fds APIs for win32 Bin Meng
2022-08-31 14:10 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 29/51] tests/qtest: libqtest: Install signal handler via signal() Bin Meng
2022-08-31 14:16 ` Marc-André Lureau
2022-09-02 15:49 ` Bin Meng
2022-08-24 9:40 ` [PATCH 30/51] tests: Skip iotests and qtest when '--without-default-devices' Bin Meng
2022-08-25 12:03 ` Thomas Huth
2022-09-02 15:18 ` Bin Meng
2022-08-24 9:40 ` [PATCH 31/51] tests/qtest: Support libqtest to build and run on Windows Bin Meng
2022-08-31 16:28 ` Marc-André Lureau
2022-09-19 10:00 ` Bin Meng
2022-09-01 11:38 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 32/51] tests/qtest: Fix ERROR_SHARING_VIOLATION for win32 Bin Meng
2022-08-25 12:06 ` Thomas Huth
2022-09-02 10:59 ` Bin Meng
2022-09-01 8:42 ` Marc-André Lureau
2022-09-02 11:02 ` Bin Meng
2022-08-24 9:40 ` [PATCH 33/51] tests/qtest: {ahci, ide}-test: Use relative path for temporary files Bin Meng
2022-09-01 8:58 ` Marc-André Lureau
2022-09-03 13:30 ` Bin Meng
2022-08-24 9:40 ` [PATCH 34/51] tests/qtest: bios-tables-test: Adapt the case for win32 Bin Meng
2022-08-24 12:42 ` Ani Sinha
2022-08-26 10:38 ` Bin Meng
2022-09-01 9:05 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 35/51] tests/qtest: device-plug-test: Reverse the usage of double/single quotes Bin Meng
2022-08-25 12:20 ` Thomas Huth
2022-08-24 9:40 ` [PATCH 36/51] tests/qtest: machine-none-test: Use double quotes to pass the cpu option Bin Meng
2022-08-25 12:22 ` Thomas Huth
2022-08-24 9:40 ` [PATCH 37/51] tests/qtest: migration-test: Disable IO redirection for win32 Bin Meng
2022-08-24 18:53 ` Dr. David Alan Gilbert
2022-08-26 10:48 ` Bin Meng
2022-08-24 9:40 ` [PATCH 38/51] tests/qtest: {ahci,ide}-test: Open file in binary mode Bin Meng
2022-08-25 12:28 ` Thomas Huth
2022-09-01 9:08 ` [PATCH 38/51] tests/qtest: {ahci, ide}-test: " Marc-André Lureau
2022-08-24 9:40 ` [PATCH 39/51] tests/qtest: virtio-net-failover: Disable migration tests for win32 Bin Meng
2022-08-24 9:40 ` [PATCH 40/51] chardev/char-file: Add FILE_SHARE_WRITE when openning the file " Bin Meng
2022-08-25 7:58 ` Marc-André Lureau
2022-08-26 13:15 ` Bin Meng
2022-08-26 13:23 ` Marc-André Lureau
2022-08-27 23:19 ` Bin Meng
2022-08-30 12:30 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 41/51] tests/qtest: migration-test: Kill "to" after migration is canceled Bin Meng
2022-08-24 18:56 ` Dr. David Alan Gilbert
2022-09-01 11:35 ` Marc-André Lureau
2022-09-02 16:33 ` Bin Meng
2022-08-24 9:40 ` [PATCH 42/51] hw/ppc: spapr: Use qemu_vfree() to free spapr->htab Bin Meng
2022-08-24 17:32 ` Daniel Henrique Barboza
2022-09-01 11:40 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 43/51] tests/qtest: npcm7xx_emc-test: Skip running test_{tx, rx} on win32 Bin Meng
2022-08-25 12:32 ` [PATCH 43/51] tests/qtest: npcm7xx_emc-test: Skip running test_{tx,rx} " Thomas Huth
2022-08-25 16:40 ` [PATCH 43/51] tests/qtest: npcm7xx_emc-test: Skip running test_{tx, rx} " Hao Wu
2022-08-24 9:40 ` [PATCH 44/51] tests/qtest: microbit-test: Fix socket access for win32 Bin Meng
2022-09-01 11:44 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 45/51] tests/qtest: prom-env-test: Use double quotes to pass the prom-env option Bin Meng
2022-08-25 12:33 ` Thomas Huth
2022-08-24 9:40 ` [PATCH 46/51] tests/qtest: libqtest: Replace the call to close a socket with closesocket() Bin Meng
2022-09-01 11:46 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 47/51] tests/qtest: libqtest: Correct the timeout unit of blocking receive calls for win32 Bin Meng
2022-09-01 11:57 ` Marc-André Lureau
2022-08-24 9:40 ` [PATCH 48/51] io/channel-watch: Drop a superfluous '#ifdef WIN32' Bin Meng
2022-09-01 12:24 ` Marc-André Lureau
2022-10-17 12:34 ` Daniel P. Berrangé
2022-08-24 9:40 ` [PATCH 49/51] io/channel-watch: Fix socket watch on Windows Bin Meng
2022-09-01 12:58 ` Marc-André Lureau
2022-09-04 6:24 ` Bin Meng
2022-09-05 6:04 ` Marc-André Lureau
2022-09-05 6:13 ` Bin Meng
2022-09-05 8:10 ` Clément Chigot
2022-09-06 7:00 ` Bin Meng
2022-09-06 7:41 ` Clément Chigot [this message]
2022-09-06 8:14 ` Bin Meng
2022-09-06 12:06 ` Clément Chigot
2022-09-07 5:07 ` Bin Meng
2022-09-14 8:08 ` Bin Meng
2022-09-21 1:02 ` Bin Meng
2022-09-28 6:10 ` Bin Meng
2022-10-06 3:03 ` Bin Meng
2022-10-11 10:42 ` Bin Meng
2022-10-17 12:21 ` Bin Meng
2022-10-17 12:30 ` Daniel P. Berrangé
2022-10-17 13:03 ` Bin Meng
2022-10-17 13:29 ` Daniel P. Berrangé
2022-10-17 12:35 ` Daniel P. Berrangé
2022-08-24 9:40 ` [PATCH 50/51] .gitlab-ci.d/windows.yml: Increase the timeout to the runner limit Bin Meng
2022-08-25 8:18 ` Thomas Huth
2022-08-26 11:25 ` Bin Meng
2022-08-26 11:33 ` Daniel P. Berrangé
2022-08-24 9:40 ` [PATCH 51/51] docs/devel: testing: Document writing portable test cases Bin Meng
2022-09-01 13:02 ` Marc-André Lureau
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='CAJ307EhBSg4ENykkbqsT=5oBjc34JR+d3bJAVSTaxRM-uG4LGg@mail.gmail.com' \
--to=chigot@adacore.com \
--cc=berrange@redhat.com \
--cc=bin.meng@windriver.com \
--cc=bmeng.cn@gmail.com \
--cc=marcandre.lureau@gmail.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).