qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] fixing qemu busy wait


From: Paolo Bonzini
Subject: Re: [Qemu-devel] fixing qemu busy wait
Date: Fri, 31 May 2013 16:17:20 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6

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 <address@hidden
> <mailto:address@hidden>> 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 <address@hidden
>     <mailto:address@hidden>> 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
> 
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]