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: Orr Dvory
Subject: Re: [Qemu-devel] fixing qemu busy wait
Date: Thu, 18 Apr 2013 21:47:38 +0300

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 <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> 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]