Patchwork [Bug,1179731,NEW] is networking broken on windows hosts?

login
register
mail settings
Submitter TeLeMan
Date May 16, 2013, 9:32 a.m.
Message ID <CAETRQWkNx6jujQV0b5TskWMUsTvv646SuxVboHmw+=rZDpz0Yw@mail.gmail.com>
Download mbox | patch
Permalink /patch/244255/
State New
Headers show

Comments

TeLeMan - May 16, 2013, 9:32 a.m.
On Thu, May 16, 2013 at 4:59 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 16/05/2013 07:52, TeLeMan ha scritto:
>> The patch is working on 134a03e0b3d34b01b68107104c525c3bff1211d4 and
>> is not working from cbff4b342b000a7642125dbdabf61113e05eee44.
>
> Thanks.
>
> Fabien or Stefan, can you take a look?
>
> TeLeMan, can you post the exact patches that you tested on those two
> commits?  (To recap, there are at least two bugs.  The first is fixed by
> the patch at
> http://article.gmane.org/gmane.comp.emulators.qemu/211333/raw, the
> second is introduced by patch cbff4b3, main-loop: switch to g_poll() on
> POSIX hosts, 2013-02-20).
>
> Paolo
>

The patch for cbff4b342b000a7642125dbdabf61113e05eee44:




>> --
>> SUN OF A BEACH
>>
>>
>> On Wed, May 15, 2013 at 4:37 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>> Il 15/05/2013 03:38, TeLeMan ha scritto:
>>>> On Tue, May 14, 2013 at 7:55 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>>>> Il 14/05/2013 13:48, Paolo Bonzini ha scritto:
>>>>>> Il 14/05/2013 13:39, TeLeMan ha scritto:
>>>>>>> On Tue, May 14, 2013 at 6:46 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>>>>>>> Il 14/05/2013 12:24, TeLeMan ha scritto:
>>>>>>>>> On Tue, May 14, 2013 at 3:51 PM, Stefan Hajnoczi <stefanha@gmail.com> wrote:
>>>>>>>>>> On Tue, May 14, 2013 at 12:02:24AM -0000, therock247uk wrote:
>>>>>>>>>>> just wondering as i just compiled the latest git and qemu goes into none
>>>>>>>>>>> responding mode when i try to do any networking stuff on guests (both
>>>>>>>>>>> linux and windows)
>>>>>>>>>>
>>>>>>>>>> Works for me on qemu.git/master on Linux:
>>>>>>>>>>
>>>>>>>>>>   $ git rev-parse HEAD
>>>>>>>>>>   b087143b4d010451208264b7c841436aafe1cbb1
>>>>>>>>>>   $ x86_64-softmmu/qemu-system-x86_64 -m 1024 -enable-kvm -cpu host \
>>>>>>>>>>           -drive if=virtio,cache=none,file=test.img
>>>>>>>>>>
>>>>>>>>>> Please include more information, like the QEMU command-line and commit
>>>>>>>>>> ID.
>>>>>>>>>>
>>>>>>>>>> Stefan
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> This regression occurs on the Windows host. SLIRP hangs in sorecvfrom().
>>>>>>>>
>>>>>>>> Can you bisect it?
>>>>>>>>
>>>>>>>> Paolo
>>>>>>>>
>>>>>>> The first break is the commit
>>>>>>> 5e3bc735d93dd23f074b5116fd11e1ad8cd4962f. But it need more packets
>>>>>>> than HEAD to reproduce this regression.
>>>>>>
>>>>>> Please check if this partial revert of that commit fixes it:
>>>>>
>>>>> Yeah, this should work...  WSAEventSelect is edge-triggered and the
>>>>> event will not be signaled if the socket handler does not consume all
>>>>> the data in the socket buffer.
>>>>
>>>> Unfortunately, it does not work.
>>>
>>> Ok... as you can see the patch is just moving a block of code just
>>> before g_main_context_prepare(context, &max_priority).
>>>
>>> Can you please try doing the same on top of these six commits:
>>>
>>> 134a03e0b3d34b01b68107104c525c3bff1211d4
>>> cbff4b342b000a7642125dbdabf61113e05eee44
>>> 48ce11ff972c733afaed3e2a2613a2e56081ec92
>>> 8917c3bdba37d6fe4393db0fad3fabbde9530d6b
>>> a3e4b4a8091cc4fcf7cb619570c72c54c2d6a6e9
>>> 9cbaacf999b01b27dc3a22502705178057af66de
>>>
>>> Paolo
>>
>>
>

Patch

diff --git a/main-loop.c b/main-loop.c
index 489b27c..1558e4b 100644
--- a/main-loop.c
+++ b/main-loop.c
@@ -454,6 +454,22 @@  static int os_host_main_loop_wait(uint32_t timeout)
         return ret;
     }

+    gpollfds_from_select();
+    FD_ZERO(&rfds);
+    FD_ZERO(&wfds);
+    FD_ZERO(&xfds);
+    nfds = pollfds_fill(gpollfds, &rfds, &wfds, &xfds);
+    if (nfds >= 0) {
+        select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
+        if (select_ret != 0) {
+            timeout = 0;
+        }
+        if (select_ret > 0) {
+            pollfds_poll(gpollfds, nfds, &rfds, &wfds, &xfds);
+        }
+    }
+    gpollfds_to_select(select_ret);
+
     g_main_context_prepare(context, &max_priority);
     n_poll_fds = g_main_context_query(context, max_priority, &poll_timeout,
                                       poll_fds, ARRAY_SIZE(poll_fds));
@@ -493,21 +509,6 @@  static int os_host_main_loop_wait(uint32_t timeout)
     /* This back-and-forth between GPollFDs and select(2) is temporary.  We'll
      * drop it in a couple of patches, I promise :).
      */
-    gpollfds_from_select();
-    FD_ZERO(&rfds);
-    FD_ZERO(&wfds);
-    FD_ZERO(&xfds);
-    nfds = pollfds_fill(gpollfds, &rfds, &wfds, &xfds);
-    if (nfds >= 0) {
-        select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
-        if (select_ret != 0) {
-            timeout = 0;
-        }
-        if (select_ret > 0) {
-            pollfds_poll(gpollfds, nfds, &rfds, &wfds, &xfds);
-        }
-    }
-    gpollfds_to_select(select_ret);

     return select_ret || g_poll_ret;
 }




The patch for 134a03e0b3d34b01b68107104c525c3bff1211d4 :

diff --git a/main-loop.c b/main-loop.c
index d0d8fe4..7cdd969 100644
--- a/main-loop.c
+++ b/main-loop.c
@@ -346,6 +346,13 @@  static int os_host_main_loop_wait(uint32_t timeout)
         return ret;
     }

+    if (nfds >= 0) {
+        select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
+        if (select_ret != 0) {
+            timeout = 0;
+        }
+    }
+
     g_main_context_prepare(context, &max_priority);
     n_poll_fds = g_main_context_query(context, max_priority, &poll_timeout,
                                       poll_fds, ARRAY_SIZE(poll_fds));
@@ -382,12 +389,6 @@  static int os_host_main_loop_wait(uint32_t timeout)
      * improve socket latency.
      */

-    if (nfds >= 0) {
-        select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
-        if (select_ret != 0) {
-            timeout = 0;
-        }
-    }

     return select_ret || g_poll_ret;
 }