Patchwork [14/17] main-loop: use GSource to poll AIO file descriptors

login
register
mail settings
Submitter Paolo Bonzini
Date Sept. 25, 2012, 12:56 p.m.
Message ID <1348577763-12920-15-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/186812/
State New
Headers show

Comments

Paolo Bonzini - Sept. 25, 2012, 12:56 p.m.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 main-loop.c | 23 ++++++-----------------
 main-loop.h |  2 --
 2 file modificati, 6 inserzioni(+), 19 rimozioni(-)
Anthony Liguori - Sept. 25, 2012, 10:09 p.m.
Paolo Bonzini <pbonzini@redhat.com> writes:

> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  main-loop.c | 23 ++++++-----------------
>  main-loop.h |  2 --
>  2 file modificati, 6 inserzioni(+), 19 rimozioni(-)
>
> diff --git a/main-loop.c b/main-loop.c
> index b290c79..209f699 100644
> --- a/main-loop.c
> +++ b/main-loop.c
> @@ -205,6 +205,7 @@ static AioContext *qemu_aio_context;
>  int main_loop_init(void)
>  {
>      int ret;
> +    GSource *src;
>  
>      qemu_mutex_lock_iothread();
>      ret = qemu_signal_init();
> @@ -219,6 +220,9 @@ int main_loop_init(void)
>      }
>  
>      qemu_aio_context = aio_context_new();
> +    src = aio_get_g_source(qemu_aio_context);
> +    g_source_attach(src, NULL);
> +    g_source_unref(src);
>      return 0;
>  }
>  
> @@ -481,8 +485,6 @@ int main_loop_wait(int nonblocking)
>  
>      if (nonblocking) {
>          timeout = 0;
> -    } else {
> -        aio_bh_update_timeout(qemu_aio_context, &timeout);
>      }
>  
>      /* poll any events */
> @@ -505,10 +507,6 @@ int main_loop_wait(int nonblocking)
>  
>      qemu_run_all_timers();
>  
> -    /* Check bottom-halves last in case any of the earlier events triggered
> -       them.  */
> -    qemu_bh_poll();
> -

This is an awesome cleanup!

What do you think about deprecating bottom halves in the !block code in
favor of idle functions?  I don't see any reason to keep using bottom
halves...

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

>      return ret;
>  }
>  
> @@ -519,11 +517,6 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
>      return aio_bh_new(qemu_aio_context, cb, opaque);
>  }
>  
> -int qemu_bh_poll(void)
> -{
> -    return aio_bh_poll(qemu_aio_context);
> -}
> -
>  void qemu_aio_flush(void)
>  {
>      aio_flush(qemu_aio_context);
> @@ -543,16 +536,12 @@ void qemu_aio_set_fd_handler(int fd,
>  {
>      aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, io_flush,
>                         opaque);
> -
> -    qemu_set_fd_handler2(fd, NULL, io_read, io_write, opaque);
>  }
> +#endif
>  
>  void qemu_aio_set_event_notifier(EventNotifier *notifier,
>                                   EventNotifierHandler *io_read,
>                                   AioFlushEventNotifierHandler *io_flush)
>  {
> -    qemu_aio_set_fd_handler(event_notifier_get_fd(notifier),
> -                            (IOHandler *)io_read, NULL,
> -                            (AioFlushHandler *)io_flush, notifier);
> +    aio_set_event_notifier(qemu_aio_context, notifier, io_read, io_flush);
>  }
> -#endif
> diff --git a/main-loop.h b/main-loop.h
> index 47644ce..c58f38b 100644
> --- a/main-loop.h
> +++ b/main-loop.h
> @@ -312,7 +312,5 @@ void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc
>  
>  QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
>  void qemu_bh_schedule_idle(QEMUBH *bh);
> -int qemu_bh_poll(void);
> -void qemu_bh_update_timeout(uint32_t *timeout);
>  
>  #endif
> -- 
> 1.7.12
Paolo Bonzini - Sept. 26, 2012, 6:38 a.m.
Il 26/09/2012 00:09, Anthony Liguori ha scritto:
> What do you think about deprecating bottom halves in the !block code in
> favor of idle functions?  I don't see any reason to keep using bottom
> halves...

The ptimer.c code uses bottom halves internally.  Otherwise I'd agree.

Paolo

> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Patch

diff --git a/main-loop.c b/main-loop.c
index b290c79..209f699 100644
--- a/main-loop.c
+++ b/main-loop.c
@@ -205,6 +205,7 @@  static AioContext *qemu_aio_context;
 int main_loop_init(void)
 {
     int ret;
+    GSource *src;
 
     qemu_mutex_lock_iothread();
     ret = qemu_signal_init();
@@ -219,6 +220,9 @@  int main_loop_init(void)
     }
 
     qemu_aio_context = aio_context_new();
+    src = aio_get_g_source(qemu_aio_context);
+    g_source_attach(src, NULL);
+    g_source_unref(src);
     return 0;
 }
 
@@ -481,8 +485,6 @@  int main_loop_wait(int nonblocking)
 
     if (nonblocking) {
         timeout = 0;
-    } else {
-        aio_bh_update_timeout(qemu_aio_context, &timeout);
     }
 
     /* poll any events */
@@ -505,10 +507,6 @@  int main_loop_wait(int nonblocking)
 
     qemu_run_all_timers();
 
-    /* Check bottom-halves last in case any of the earlier events triggered
-       them.  */
-    qemu_bh_poll();
-
     return ret;
 }
 
@@ -519,11 +517,6 @@  QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
     return aio_bh_new(qemu_aio_context, cb, opaque);
 }
 
-int qemu_bh_poll(void)
-{
-    return aio_bh_poll(qemu_aio_context);
-}
-
 void qemu_aio_flush(void)
 {
     aio_flush(qemu_aio_context);
@@ -543,16 +536,12 @@  void qemu_aio_set_fd_handler(int fd,
 {
     aio_set_fd_handler(qemu_aio_context, fd, io_read, io_write, io_flush,
                        opaque);
-
-    qemu_set_fd_handler2(fd, NULL, io_read, io_write, opaque);
 }
+#endif
 
 void qemu_aio_set_event_notifier(EventNotifier *notifier,
                                  EventNotifierHandler *io_read,
                                  AioFlushEventNotifierHandler *io_flush)
 {
-    qemu_aio_set_fd_handler(event_notifier_get_fd(notifier),
-                            (IOHandler *)io_read, NULL,
-                            (AioFlushHandler *)io_flush, notifier);
+    aio_set_event_notifier(qemu_aio_context, notifier, io_read, io_flush);
 }
-#endif
diff --git a/main-loop.h b/main-loop.h
index 47644ce..c58f38b 100644
--- a/main-loop.h
+++ b/main-loop.h
@@ -312,7 +312,5 @@  void qemu_iohandler_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds, int rc
 
 QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
 void qemu_bh_schedule_idle(QEMUBH *bh);
-int qemu_bh_poll(void);
-void qemu_bh_update_timeout(uint32_t *timeout);
 
 #endif