All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [Qemu-devel] fixing qemu busy wait
       [not found]         ` <CAHXCByTwZN6oLPFQM50u5srL-f94TsnwMuCtvZO75L+=V9=Vow@mail.gmail.com>
@ 2013-04-18 18:47           ` Orr Dvory
  2013-05-31 14:17             ` Paolo Bonzini
  0 siblings, 1 reply; 2+ messages in thread
From: Orr Dvory @ 2013-04-18 18:47 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3923 bytes --]

is this better?

diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
--- qemu-1.4.1/gdbstub.c    2013-04-15 23:25:18.000000000 +0300
+++ qemu-1.4.1-fix/gdbstub.c    2013-04-18 21:35:00.000000000 +0300
@@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
 {
 #ifdef CONFIG_USER_ONLY
     int ret;
-
+    int fd_flags = fcntl (s->fd, F_GETFL, 0);
+    fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
     while (len > 0) {
         ret = send(s->fd, buf, len, 0);
         if (ret < 0) {

             if (errno != EINTR && errno != EAGAIN)
+            {
+                fcntl (s->fd, F_SETFL, fd_flags);
                 return;
+            }
         } else {
             buf += ret;
             len -= ret;
         }
     }
+    fcntl (s->fd, F_SETFL, fd_flags);
 #else
     qemu_chr_fe_write(s->chr, buf, len);
 #endif
@@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
   GDBState *s;
   char buf[256];
   int n;
+  int fd_flags;

   s = gdbserver_state;
   if (gdbserver_fd < 0 || s->fd < 0)
@@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
      connection.  */
   if (s->fd < 0)
       return sig;
-
+  fd_flags = fcntl (s->fd, F_GETFL, 0);
+  fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
   sig = 0;
   s->state = RS_IDLE;
   s->running_state = 0;
@@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
         {
           /* XXX: Connection closed.  Should probably wait for another
              connection before continuing.  */
+          fcntl (s->fd, F_SETFL, fd_flags);
           return sig;
         }
   }
+  fcntl (s->fd, F_SETFL, fd_flags);
   sig = s->signal;
   s->signal = 0;
   return sig;


On Thu, Apr 18, 2013 at 9:46 PM, Orr Dvory <gidesa@gmail.com> wrote:

> is this better?
>
> diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
> --- qemu-1.4.1/gdbstub.c    2013-04-15 23:25:18.000000000 +0300
> +++ qemu-1.4.1-fix/gdbstub.c    2013-04-18 21:35:00.000000000 +0300
> @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
>  {
>  #ifdef CONFIG_USER_ONLY
>      int ret;
> -
> +    int fd_flags = fcntl (s->fd, F_GETFL, 0);
> +    fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>      while (len > 0) {
>          ret = send(s->fd, buf, len, 0);
>          if (ret < 0) {
>
>              if (errno != EINTR && errno != EAGAIN)
> +            {
> +                fcntl (s->fd, F_SETFL, fd_flags);
>                  return;
> +            }
>          } else {
>              buf += ret;
>              len -= ret;
>          }
>      }
> +    fcntl (s->fd, F_SETFL, fd_flags);
>  #else
>      qemu_chr_fe_write(s->chr, buf, len);
>  #endif
> @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
>    GDBState *s;
>    char buf[256];
>    int n;
> +  int fd_flags;
>
>    s = gdbserver_state;
>    if (gdbserver_fd < 0 || s->fd < 0)
> @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
>       connection.  */
>    if (s->fd < 0)
>        return sig;
> -
> +  fd_flags = fcntl (s->fd, F_GETFL, 0);
> +  fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>    sig = 0;
>    s->state = RS_IDLE;
>    s->running_state = 0;
> @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
>          {
>            /* XXX: Connection closed.  Should probably wait for another
>               connection before continuing.  */
> +          fcntl (s->fd, F_SETFL, fd_flags);
>            return sig;
>          }
>    }
> +  fcntl (s->fd, F_SETFL, fd_flags);
>    sig = s->signal;
>    s->signal = 0;
>    return sig;
>
>
> On Wed, Feb 20, 2013 at 10:38 PM, Paolo Bonzini <pbonzini@redhat.com>wrote:
>
>> Il 20/02/2013 20:39, Orr Dvory ha scritto:
>> >              if (errno != EINTR && errno != EAGAIN)
>> > +                /* there's no need to restore the
>> > +                O_NONBLOCK option. */
>> >                  return;
>> > +
>>
>> But it's cleaner to do it anyway. :)
>>
>> Paolo
>>
>
>

[-- Attachment #2: Type: text/html, Size: 5153 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] fixing qemu busy wait
  2013-04-18 18:47           ` [Qemu-devel] fixing qemu busy wait Orr Dvory
@ 2013-05-31 14:17             ` Paolo Bonzini
  0 siblings, 0 replies; 2+ messages in thread
From: Paolo Bonzini @ 2013-05-31 14:17 UTC (permalink / raw)
  To: Orr Dvory; +Cc: qemu-devel

Il 18/04/2013 20:47, Orr Dvory ha scritto:
> is this better?

Yes -- but I don't remember if this was fixed elsewhere.  Can you
reproduce the problem in 1.5.0?  If so, please send the patch according
to the guidelines at http://wiki.qemu.org/Contribute/SubmitAPatch.

Paolo

> diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
> --- qemu-1.4.1/gdbstub.c    2013-04-15 23:25:18.000000000 +0300
> +++ qemu-1.4.1-fix/gdbstub.c    2013-04-18 21:35:00.000000000 +0300
> @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
>  {
>  #ifdef CONFIG_USER_ONLY
>      int ret;
> -
> +    int fd_flags = fcntl (s->fd, F_GETFL, 0);
> +    fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>      while (len > 0) {
>          ret = send(s->fd, buf, len, 0);
>          if (ret < 0) {
> 
>              if (errno != EINTR && errno != EAGAIN)
> +            {
> +                fcntl (s->fd, F_SETFL, fd_flags);
>                  return;
> +            }
>          } else {
>              buf += ret;
>              len -= ret;
>          }
>      }
> +    fcntl (s->fd, F_SETFL, fd_flags);
>  #else
>      qemu_chr_fe_write(s->chr, buf, len);
>  #endif
> @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
>    GDBState *s;
>    char buf[256];
>    int n;
> +  int fd_flags;
>  
>    s = gdbserver_state;
>    if (gdbserver_fd < 0 || s->fd < 0)
> @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
>       connection.  */
>    if (s->fd < 0)
>        return sig;
> -
> +  fd_flags = fcntl (s->fd, F_GETFL, 0);
> +  fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>    sig = 0;
>    s->state = RS_IDLE;
>    s->running_state = 0;
> @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
>          {
>            /* XXX: Connection closed.  Should probably wait for another
>               connection before continuing.  */
> +          fcntl (s->fd, F_SETFL, fd_flags);
>            return sig;
>          }
>    }
> +  fcntl (s->fd, F_SETFL, fd_flags);
>    sig = s->signal;
>    s->signal = 0;
>    return sig;
> 
> 
> On Thu, Apr 18, 2013 at 9:46 PM, Orr Dvory <gidesa@gmail.com
> <mailto:gidesa@gmail.com>> wrote:
> 
>     is this better?
> 
>     diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
>     --- qemu-1.4.1/gdbstub.c    2013-04-15 23:25:18.000000000 +0300
>     +++ qemu-1.4.1-fix/gdbstub.c    2013-04-18 21:35:00.000000000 +0300
>     @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
>      {
>      #ifdef CONFIG_USER_ONLY
>          int ret;
>     -
>     +    int fd_flags = fcntl (s->fd, F_GETFL, 0);
>     +    fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>          while (len > 0) {
>              ret = send(s->fd, buf, len, 0);
>              if (ret < 0) {
> 
>                  if (errno != EINTR && errno != EAGAIN)
>     +            {
>     +                fcntl (s->fd, F_SETFL, fd_flags);
>                      return;
>     +            }
>              } else {
>                  buf += ret;
>                  len -= ret;
>              }
>          }
>     +    fcntl (s->fd, F_SETFL, fd_flags);
>      #else
>          qemu_chr_fe_write(s->chr, buf, len);
>      #endif
>     @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
>        GDBState *s;
>        char buf[256];
>        int n;
>     +  int fd_flags;
>      
>        s = gdbserver_state;
>        if (gdbserver_fd < 0 || s->fd < 0)
>     @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
>           connection.  */
>        if (s->fd < 0)
>            return sig;
>     -
>     +  fd_flags = fcntl (s->fd, F_GETFL, 0);
>     +  fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
>        sig = 0;
>        s->state = RS_IDLE;
>        s->running_state = 0;
>     @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
>              {
>                /* XXX: Connection closed.  Should probably wait for another
>                   connection before continuing.  */
>     +          fcntl (s->fd, F_SETFL, fd_flags);
>                return sig;
>              }
>        }
>     +  fcntl (s->fd, F_SETFL, fd_flags);
>        sig = s->signal;
>        s->signal = 0;
>        return sig;
> 
> 
>     On Wed, Feb 20, 2013 at 10:38 PM, Paolo Bonzini <pbonzini@redhat.com
>     <mailto:pbonzini@redhat.com>> wrote:
> 
>         Il 20/02/2013 20:39, Orr Dvory ha scritto:
>         >              if (errno != EINTR && errno != EAGAIN)
>         > +                /* there's no need to restore the
>         > +                O_NONBLOCK option. */
>         >                  return;
>         > +
> 
>         But it's cleaner to do it anyway. :)
> 
>         Paolo
> 
> 
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-05-31 14:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CAHXCByREfdGsVntX4ojv9BAEVD5TA0-8eiya5ky2onVBcuEv+Q@mail.gmail.com>
     [not found] ` <512002D7.4090906@twiddle.net>
     [not found]   ` <CAHXCByQQ2Yd7yCiXzfH=5iw4UAAYCxyorawmy8ZnDCHe-6zjYA@mail.gmail.com>
     [not found]     ` <CAHXCByRaXWMpyuOAixm+PzVoM4DfoK+HaLDkofd1j3h3Wo3Bng@mail.gmail.com>
     [not found]       ` <5125343F.9090302@redhat.com>
     [not found]         ` <CAHXCByTwZN6oLPFQM50u5srL-f94TsnwMuCtvZO75L+=V9=Vow@mail.gmail.com>
2013-04-18 18:47           ` [Qemu-devel] fixing qemu busy wait Orr Dvory
2013-05-31 14:17             ` Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.