* [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext @ 2017-12-28 7:29 Peter Xu 2017-12-28 7:29 ` [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe Peter Xu ` (3 more replies) 0 siblings, 4 replies; 10+ messages in thread From: Peter Xu @ 2017-12-28 7:29 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, Stefan Hajnoczi, peterx, Marc-André Lureau There were existing work that tried to allow chardev to be run in a dedicated gcontext rather than the default main context/thread. Basically that work passed in the correct gcontext during g_source_attach(). However, I found something missing along the way, that some legacy glib APIs are used by chardev code which take the main context as default: g_timeout_add_seconds g_timeout_add g_idle_add To fully allow the chardevs to be run in dedicated gcontext, we need to convert all these legacy APIs into g_source_attach() calls as well, with the correct gcontext passed in. This series tries to clean the rest of things up. I picked up patch 1 from monitor-oob series into this series (which is a missing of chardev frontend call fix for g_source_attach()), so that this series can be a complete fix. Please review. Thanks, Peter Xu (3): chardev: use backend chr context when watch for fe chardev: let g_idle_add() be with chardev gcontext chardev: introduce qemu_chr_timeout_add() and use chardev/char-fe.c | 2 +- chardev/char-pty.c | 16 ++++++++-------- chardev/char-socket.c | 4 ++-- chardev/char.c | 20 ++++++++++++++++++++ hw/char/terminal3270.c | 7 ++++--- include/chardev/char.h | 2 ++ 6 files changed, 37 insertions(+), 14 deletions(-) -- 2.14.3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe 2017-12-28 7:29 [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Peter Xu @ 2017-12-28 7:29 ` Peter Xu 2018-01-02 16:02 ` Marc-André Lureau 2017-12-28 7:29 ` [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext Peter Xu ` (2 subsequent siblings) 3 siblings, 1 reply; 10+ messages in thread From: Peter Xu @ 2017-12-28 7:29 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, Stefan Hajnoczi, peterx, Marc-André Lureau In commit 6bbb6c0644 ("chardev: use per-dev context for io_add_watch_poll", 2017-09-22) all the chardev watches are converted to use per-chardev gcontext to support chardev to be run outside default main thread. However that's still missing one call from the frontend code. Touch that up. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> --- chardev/char-fe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chardev/char-fe.c b/chardev/char-fe.c index ee6d596100..c611b3fa3e 100644 --- a/chardev/char-fe.c +++ b/chardev/char-fe.c @@ -356,7 +356,7 @@ guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond, } g_source_set_callback(src, (GSourceFunc)func, user_data, NULL); - tag = g_source_attach(src, NULL); + tag = g_source_attach(src, s->gcontext); g_source_unref(src); return tag; -- 2.14.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe 2017-12-28 7:29 ` [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe Peter Xu @ 2018-01-02 16:02 ` Marc-André Lureau 0 siblings, 0 replies; 10+ messages in thread From: Marc-André Lureau @ 2018-01-02 16:02 UTC (permalink / raw) To: Peter Xu; +Cc: QEMU, Paolo Bonzini, Stefan Hajnoczi On Thu, Dec 28, 2017 at 8:29 AM, Peter Xu <peterx@redhat.com> wrote: > In commit 6bbb6c0644 ("chardev: use per-dev context for > io_add_watch_poll", 2017-09-22) all the chardev watches are converted to > use per-chardev gcontext to support chardev to be run outside default > main thread. However that's still missing one call from the frontend > code. Touch that up. > > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > chardev/char-fe.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/chardev/char-fe.c b/chardev/char-fe.c > index ee6d596100..c611b3fa3e 100644 > --- a/chardev/char-fe.c > +++ b/chardev/char-fe.c > @@ -356,7 +356,7 @@ guint qemu_chr_fe_add_watch(CharBackend *be, GIOCondition cond, > } > > g_source_set_callback(src, (GSourceFunc)func, user_data, NULL); > - tag = g_source_attach(src, NULL); > + tag = g_source_attach(src, s->gcontext); > g_source_unref(src); > > return tag; > -- > 2.14.3 > > -- Marc-André Lureau ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext 2017-12-28 7:29 [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Peter Xu 2017-12-28 7:29 ` [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe Peter Xu @ 2017-12-28 7:29 ` Peter Xu 2018-01-02 16:02 ` Marc-André Lureau 2017-12-28 7:29 ` [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use Peter Xu 2018-01-03 7:10 ` [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Paolo Bonzini 3 siblings, 1 reply; 10+ messages in thread From: Peter Xu @ 2017-12-28 7:29 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, Stefan Hajnoczi, peterx, Marc-André Lureau The idle task will be attached to main gcontext even if the chardev backend is running in another gcontext. Fix the only caller by extending the g_idle_add() logic into the more powerful g_source_attach(). It's basically g_idle_add_full() implementation, but with the chardev's gcontext passed in. Signed-off-by: Peter Xu <peterx@redhat.com> --- chardev/char-pty.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/chardev/char-pty.c b/chardev/char-pty.c index 761ae6dec1..dd17b1b823 100644 --- a/chardev/char-pty.c +++ b/chardev/char-pty.c @@ -210,9 +210,14 @@ static void pty_chr_state(Chardev *chr, int connected) s->timer_tag = 0; } if (!s->connected) { + GSource *source = g_idle_source_new(); + g_assert(s->open_tag == 0); s->connected = 1; - s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr); + g_source_set_callback(source, qemu_chr_be_generic_open_func, + chr, NULL); + s->open_tag = g_source_attach(source, chr->gcontext); + g_source_unref(source); } if (!chr->gsource) { chr->gsource = io_add_watch_poll(chr, s->ioc, -- 2.14.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext 2017-12-28 7:29 ` [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext Peter Xu @ 2018-01-02 16:02 ` Marc-André Lureau 0 siblings, 0 replies; 10+ messages in thread From: Marc-André Lureau @ 2018-01-02 16:02 UTC (permalink / raw) To: Peter Xu; +Cc: QEMU, Paolo Bonzini, Stefan Hajnoczi On Thu, Dec 28, 2017 at 8:29 AM, Peter Xu <peterx@redhat.com> wrote: > The idle task will be attached to main gcontext even if the chardev > backend is running in another gcontext. Fix the only caller by > extending the g_idle_add() logic into the more powerful > g_source_attach(). It's basically g_idle_add_full() implementation, but > with the chardev's gcontext passed in. > > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > chardev/char-pty.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/chardev/char-pty.c b/chardev/char-pty.c > index 761ae6dec1..dd17b1b823 100644 > --- a/chardev/char-pty.c > +++ b/chardev/char-pty.c > @@ -210,9 +210,14 @@ static void pty_chr_state(Chardev *chr, int connected) > s->timer_tag = 0; > } > if (!s->connected) { > + GSource *source = g_idle_source_new(); > + > g_assert(s->open_tag == 0); > s->connected = 1; > - s->open_tag = g_idle_add(qemu_chr_be_generic_open_func, chr); > + g_source_set_callback(source, qemu_chr_be_generic_open_func, > + chr, NULL); > + s->open_tag = g_source_attach(source, chr->gcontext); > + g_source_unref(source); > } > if (!chr->gsource) { > chr->gsource = io_add_watch_poll(chr, s->ioc, > -- > 2.14.3 > > -- Marc-André Lureau ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use 2017-12-28 7:29 [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Peter Xu 2017-12-28 7:29 ` [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe Peter Xu 2017-12-28 7:29 ` [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext Peter Xu @ 2017-12-28 7:29 ` Peter Xu 2018-01-02 16:10 ` Marc-André Lureau 2018-01-03 7:10 ` [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Paolo Bonzini 3 siblings, 1 reply; 10+ messages in thread From: Peter Xu @ 2017-12-28 7:29 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, Stefan Hajnoczi, peterx, Marc-André Lureau It's a replacement of g_timeout_add[_seconds]() for chardevs. Chardevs now can have dedicated gcontext, we should always bind chardev tasks onto those gcontext rather than the default main context. Since there are quite a few of g_timeout_add[_seconds]() callers, a new function qemu_chr_timeout_add() is introduced. One thing to mention is that, terminal3270 is still always running on main gcontext. However let's convert that as well since it's still part of chardev codes and in case one day we'll miss that when we move it out of main gcontext too. Signed-off-by: Peter Xu <peterx@redhat.com> --- chardev/char-pty.c | 9 ++------- chardev/char-socket.c | 4 ++-- chardev/char.c | 20 ++++++++++++++++++++ hw/char/terminal3270.c | 7 ++++--- include/chardev/char.h | 2 ++ 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/chardev/char-pty.c b/chardev/char-pty.c index dd17b1b823..cbd8ac5eb7 100644 --- a/chardev/char-pty.c +++ b/chardev/char-pty.c @@ -78,13 +78,8 @@ static void pty_chr_rearm_timer(Chardev *chr, int ms) s->timer_tag = 0; } - if (ms == 1000) { - name = g_strdup_printf("pty-timer-secs-%s", chr->label); - s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr); - } else { - name = g_strdup_printf("pty-timer-ms-%s", chr->label); - s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr); - } + name = g_strdup_printf("pty-timer-ms-%s", chr->label); + s->timer_tag = qemu_chr_timeout_add(chr, ms, pty_chr_timer, chr); g_source_set_name_by_id(s->timer_tag, name); g_free(name); } diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 630a7f2995..644a620599 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -73,8 +73,8 @@ static void qemu_chr_socket_restart_timer(Chardev *chr) char *name; assert(s->connected == 0); - s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time, - socket_reconnect_timeout, chr); + s->reconnect_timer = qemu_chr_timeout_add(chr, s->reconnect_time, + socket_reconnect_timeout, chr); name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label); g_source_set_name_by_id(s->reconnect_timer, name); g_free(name); diff --git a/chardev/char.c b/chardev/char.c index 8c3765ee99..a1de662fec 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -1084,6 +1084,26 @@ void qmp_chardev_send_break(const char *id, Error **errp) qemu_chr_be_event(chr, CHR_EVENT_BREAK); } +/* + * Add a timeout callback for the chardev (in milliseconds). Please + * use this to add timeout hook for chardev instead of g_timeout_add() + * and g_timeout_add_seconds(), to make sure the gcontext that the + * task bound to is correct. + */ +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, + void *private) +{ + GSource *source = g_timeout_source_new(ms); + guint id; + + assert(func); + g_source_set_callback(source, func, private, NULL); + id = g_source_attach(source, chr->gcontext); + g_source_unref(source); + + return id; +} + void qemu_chr_cleanup(void) { object_unparent(get_chardevs_root()); diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c index a109ce5987..479e4554d6 100644 --- a/hw/char/terminal3270.c +++ b/hw/char/terminal3270.c @@ -94,8 +94,8 @@ static void terminal_read(void *opaque, const uint8_t *buf, int size) g_source_remove(t->timer_tag); t->timer_tag = 0; } - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); - + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, + send_timing_mark_cb, t); memcpy(&t->inv[t->in_len], buf, size); t->in_len += size; if (t->in_len < 2) { @@ -157,7 +157,8 @@ static void chr_event(void *opaque, int event) * char-socket.c. Once qemu receives the terminal-type of the * client, mark handshake done and trigger everything rolling again. */ - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, + send_timing_mark_cb, t); break; case CHR_EVENT_CLOSED: sch->curr_status.scsw.dstat = SCSW_DSTAT_DEVICE_END; diff --git a/include/chardev/char.h b/include/chardev/char.h index 778d610295..4970e46457 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -258,5 +258,7 @@ extern int term_escape_char; /* console.c */ void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp); +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, + void *private); #endif -- 2.14.3 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use 2017-12-28 7:29 ` [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use Peter Xu @ 2018-01-02 16:10 ` Marc-André Lureau 2018-01-03 2:06 ` Peter Xu 0 siblings, 1 reply; 10+ messages in thread From: Marc-André Lureau @ 2018-01-02 16:10 UTC (permalink / raw) To: Peter Xu; +Cc: QEMU, Paolo Bonzini, Stefan Hajnoczi Hi On Thu, Dec 28, 2017 at 8:29 AM, Peter Xu <peterx@redhat.com> wrote: > It's a replacement of g_timeout_add[_seconds]() for chardevs. Chardevs > now can have dedicated gcontext, we should always bind chardev tasks > onto those gcontext rather than the default main context. Since there > are quite a few of g_timeout_add[_seconds]() callers, a new function > qemu_chr_timeout_add() is introduced. > > One thing to mention is that, terminal3270 is still always running on > main gcontext. However let's convert that as well since it's still part > of chardev codes and in case one day we'll miss that when we move it out > of main gcontext too. > > Signed-off-by: Peter Xu <peterx@redhat.com> > --- > chardev/char-pty.c | 9 ++------- > chardev/char-socket.c | 4 ++-- > chardev/char.c | 20 ++++++++++++++++++++ > hw/char/terminal3270.c | 7 ++++--- > include/chardev/char.h | 2 ++ > 5 files changed, 30 insertions(+), 12 deletions(-) > > diff --git a/chardev/char-pty.c b/chardev/char-pty.c > index dd17b1b823..cbd8ac5eb7 100644 > --- a/chardev/char-pty.c > +++ b/chardev/char-pty.c > @@ -78,13 +78,8 @@ static void pty_chr_rearm_timer(Chardev *chr, int ms) > s->timer_tag = 0; > } > > - if (ms == 1000) { > - name = g_strdup_printf("pty-timer-secs-%s", chr->label); > - s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr); > - } else { > - name = g_strdup_printf("pty-timer-ms-%s", chr->label); > - s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr); > - } > + name = g_strdup_printf("pty-timer-ms-%s", chr->label); > + s->timer_tag = qemu_chr_timeout_add(chr, ms, pty_chr_timer, chr); > g_source_set_name_by_id(s->timer_tag, name); > g_free(name); > } > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index 630a7f2995..644a620599 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -73,8 +73,8 @@ static void qemu_chr_socket_restart_timer(Chardev *chr) > char *name; > > assert(s->connected == 0); > - s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time, > - socket_reconnect_timeout, chr); > + s->reconnect_timer = qemu_chr_timeout_add(chr, s->reconnect_time, reconnect_time is in second, you should * 1000. > + socket_reconnect_timeout, chr); > name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label); > g_source_set_name_by_id(s->reconnect_timer, name); > g_free(name); > diff --git a/chardev/char.c b/chardev/char.c > index 8c3765ee99..a1de662fec 100644 > --- a/chardev/char.c > +++ b/chardev/char.c > @@ -1084,6 +1084,26 @@ void qmp_chardev_send_break(const char *id, Error **errp) > qemu_chr_be_event(chr, CHR_EVENT_BREAK); > } > > +/* > + * Add a timeout callback for the chardev (in milliseconds). Please > + * use this to add timeout hook for chardev instead of g_timeout_add() > + * and g_timeout_add_seconds(), to make sure the gcontext that the > + * task bound to is correct. > + */ > +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, > + void *private) > +{ > + GSource *source = g_timeout_source_new(ms); > + guint id; > + > + assert(func); > + g_source_set_callback(source, func, private, NULL); > + id = g_source_attach(source, chr->gcontext); > + g_source_unref(source); > + > + return id; > +} > + > void qemu_chr_cleanup(void) > { > object_unparent(get_chardevs_root()); > diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c > index a109ce5987..479e4554d6 100644 > --- a/hw/char/terminal3270.c > +++ b/hw/char/terminal3270.c > @@ -94,8 +94,8 @@ static void terminal_read(void *opaque, const uint8_t *buf, int size) > g_source_remove(t->timer_tag); > t->timer_tag = 0; > } > - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); > - > + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, same here > + send_timing_mark_cb, t); > memcpy(&t->inv[t->in_len], buf, size); > t->in_len += size; > if (t->in_len < 2) { > @@ -157,7 +157,8 @@ static void chr_event(void *opaque, int event) > * char-socket.c. Once qemu receives the terminal-type of the > * client, mark handshake done and trigger everything rolling again. > */ > - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); > + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, and again > + send_timing_mark_cb, t); > break; > case CHR_EVENT_CLOSED: > sch->curr_status.scsw.dstat = SCSW_DSTAT_DEVICE_END; > diff --git a/include/chardev/char.h b/include/chardev/char.h > index 778d610295..4970e46457 100644 > --- a/include/chardev/char.h > +++ b/include/chardev/char.h > @@ -258,5 +258,7 @@ extern int term_escape_char; > > /* console.c */ > void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp); > +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, > + void *private); > Please put the declaration before the /* console.c */ comment. > #endif > -- > 2.14.3 > > -- Marc-André Lureau ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use 2018-01-02 16:10 ` Marc-André Lureau @ 2018-01-03 2:06 ` Peter Xu 0 siblings, 0 replies; 10+ messages in thread From: Peter Xu @ 2018-01-03 2:06 UTC (permalink / raw) To: Marc-André Lureau; +Cc: QEMU, Paolo Bonzini, Stefan Hajnoczi On Tue, Jan 02, 2018 at 05:10:01PM +0100, Marc-André Lureau wrote: > Hi > > On Thu, Dec 28, 2017 at 8:29 AM, Peter Xu <peterx@redhat.com> wrote: > > It's a replacement of g_timeout_add[_seconds]() for chardevs. Chardevs > > now can have dedicated gcontext, we should always bind chardev tasks > > onto those gcontext rather than the default main context. Since there > > are quite a few of g_timeout_add[_seconds]() callers, a new function > > qemu_chr_timeout_add() is introduced. > > > > One thing to mention is that, terminal3270 is still always running on > > main gcontext. However let's convert that as well since it's still part > > of chardev codes and in case one day we'll miss that when we move it out > > of main gcontext too. > > > > Signed-off-by: Peter Xu <peterx@redhat.com> > > --- > > chardev/char-pty.c | 9 ++------- > > chardev/char-socket.c | 4 ++-- > > chardev/char.c | 20 ++++++++++++++++++++ > > hw/char/terminal3270.c | 7 ++++--- > > include/chardev/char.h | 2 ++ > > 5 files changed, 30 insertions(+), 12 deletions(-) > > > > diff --git a/chardev/char-pty.c b/chardev/char-pty.c > > index dd17b1b823..cbd8ac5eb7 100644 > > --- a/chardev/char-pty.c > > +++ b/chardev/char-pty.c > > @@ -78,13 +78,8 @@ static void pty_chr_rearm_timer(Chardev *chr, int ms) > > s->timer_tag = 0; > > } > > > > - if (ms == 1000) { > > - name = g_strdup_printf("pty-timer-secs-%s", chr->label); > > - s->timer_tag = g_timeout_add_seconds(1, pty_chr_timer, chr); > > - } else { > > - name = g_strdup_printf("pty-timer-ms-%s", chr->label); > > - s->timer_tag = g_timeout_add(ms, pty_chr_timer, chr); > > - } > > + name = g_strdup_printf("pty-timer-ms-%s", chr->label); > > + s->timer_tag = qemu_chr_timeout_add(chr, ms, pty_chr_timer, chr); > > g_source_set_name_by_id(s->timer_tag, name); > > g_free(name); > > } > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > > index 630a7f2995..644a620599 100644 > > --- a/chardev/char-socket.c > > +++ b/chardev/char-socket.c > > @@ -73,8 +73,8 @@ static void qemu_chr_socket_restart_timer(Chardev *chr) > > char *name; > > > > assert(s->connected == 0); > > - s->reconnect_timer = g_timeout_add_seconds(s->reconnect_time, > > - socket_reconnect_timeout, chr); > > + s->reconnect_timer = qemu_chr_timeout_add(chr, s->reconnect_time, > > reconnect_time is in second, you should * 1000. Yes. Will fix them all. > > > + socket_reconnect_timeout, chr); > > name = g_strdup_printf("chardev-socket-reconnect-%s", chr->label); > > g_source_set_name_by_id(s->reconnect_timer, name); > > g_free(name); > > diff --git a/chardev/char.c b/chardev/char.c > > index 8c3765ee99..a1de662fec 100644 > > --- a/chardev/char.c > > +++ b/chardev/char.c > > @@ -1084,6 +1084,26 @@ void qmp_chardev_send_break(const char *id, Error **errp) > > qemu_chr_be_event(chr, CHR_EVENT_BREAK); > > } > > > > +/* > > + * Add a timeout callback for the chardev (in milliseconds). Please > > + * use this to add timeout hook for chardev instead of g_timeout_add() > > + * and g_timeout_add_seconds(), to make sure the gcontext that the > > + * task bound to is correct. > > + */ > > +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, > > + void *private) > > +{ > > + GSource *source = g_timeout_source_new(ms); > > + guint id; > > + > > + assert(func); > > + g_source_set_callback(source, func, private, NULL); > > + id = g_source_attach(source, chr->gcontext); > > + g_source_unref(source); > > + > > + return id; > > +} > > + > > void qemu_chr_cleanup(void) > > { > > object_unparent(get_chardevs_root()); > > diff --git a/hw/char/terminal3270.c b/hw/char/terminal3270.c > > index a109ce5987..479e4554d6 100644 > > --- a/hw/char/terminal3270.c > > +++ b/hw/char/terminal3270.c > > @@ -94,8 +94,8 @@ static void terminal_read(void *opaque, const uint8_t *buf, int size) > > g_source_remove(t->timer_tag); > > t->timer_tag = 0; > > } > > - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); > > - > > + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, > > same here > > > + send_timing_mark_cb, t); > > memcpy(&t->inv[t->in_len], buf, size); > > t->in_len += size; > > if (t->in_len < 2) { > > @@ -157,7 +157,8 @@ static void chr_event(void *opaque, int event) > > * char-socket.c. Once qemu receives the terminal-type of the > > * client, mark handshake done and trigger everything rolling again. > > */ > > - t->timer_tag = g_timeout_add_seconds(600, send_timing_mark_cb, t); > > + t->timer_tag = qemu_chr_timeout_add(t->chr.chr, 600, > > and again > > > + send_timing_mark_cb, t); > > break; > > case CHR_EVENT_CLOSED: > > sch->curr_status.scsw.dstat = SCSW_DSTAT_DEVICE_END; > > diff --git a/include/chardev/char.h b/include/chardev/char.h > > index 778d610295..4970e46457 100644 > > --- a/include/chardev/char.h > > +++ b/include/chardev/char.h > > @@ -258,5 +258,7 @@ extern int term_escape_char; > > > > /* console.c */ > > void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend *backend, Error **errp); > > +guint qemu_chr_timeout_add(Chardev *chr, guint ms, GSourceFunc func, > > + void *private); > > > > Please put the declaration before the /* console.c */ comment. Sure. Thanks for review. -- Peter Xu ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext 2017-12-28 7:29 [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Peter Xu ` (2 preceding siblings ...) 2017-12-28 7:29 ` [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use Peter Xu @ 2018-01-03 7:10 ` Paolo Bonzini 2018-01-03 8:54 ` Peter Xu 3 siblings, 1 reply; 10+ messages in thread From: Paolo Bonzini @ 2018-01-03 7:10 UTC (permalink / raw) To: Peter Xu, qemu-devel; +Cc: Stefan Hajnoczi, Marc-André Lureau On 28/12/2017 08:29, Peter Xu wrote: > There were existing work that tried to allow chardev to be run in a > dedicated gcontext rather than the default main context/thread. > Basically that work passed in the correct gcontext during > g_source_attach(). However, I found something missing along the way, > that some legacy glib APIs are used by chardev code which take the > main context as default: > > g_timeout_add_seconds > g_timeout_add > g_idle_add > > To fully allow the chardevs to be run in dedicated gcontext, we need > to convert all these legacy APIs into g_source_attach() calls as well, > with the correct gcontext passed in. > > This series tries to clean the rest of things up. > > I picked up patch 1 from monitor-oob series into this series (which is > a missing of chardev frontend call fix for g_source_attach()), so that > this series can be a complete fix. > > Please review. Thanks, > > Peter Xu (3): > chardev: use backend chr context when watch for fe > chardev: let g_idle_add() be with chardev gcontext > chardev: introduce qemu_chr_timeout_add() and use > > chardev/char-fe.c | 2 +- > chardev/char-pty.c | 16 ++++++++-------- > chardev/char-socket.c | 4 ++-- > chardev/char.c | 20 ++++++++++++++++++++ > hw/char/terminal3270.c | 7 ++++--- > include/chardev/char.h | 2 ++ > 6 files changed, 37 insertions(+), 14 deletions(-) > All queued, thanks! Paolo ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext 2018-01-03 7:10 ` [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Paolo Bonzini @ 2018-01-03 8:54 ` Peter Xu 0 siblings, 0 replies; 10+ messages in thread From: Peter Xu @ 2018-01-03 8:54 UTC (permalink / raw) To: Paolo Bonzini; +Cc: qemu-devel, Stefan Hajnoczi, Marc-André Lureau On Wed, Jan 03, 2018 at 08:10:58AM +0100, Paolo Bonzini wrote: > On 28/12/2017 08:29, Peter Xu wrote: > > There were existing work that tried to allow chardev to be run in a > > dedicated gcontext rather than the default main context/thread. > > Basically that work passed in the correct gcontext during > > g_source_attach(). However, I found something missing along the way, > > that some legacy glib APIs are used by chardev code which take the > > main context as default: > > > > g_timeout_add_seconds > > g_timeout_add > > g_idle_add > > > > To fully allow the chardevs to be run in dedicated gcontext, we need > > to convert all these legacy APIs into g_source_attach() calls as well, > > with the correct gcontext passed in. > > > > This series tries to clean the rest of things up. > > > > I picked up patch 1 from monitor-oob series into this series (which is > > a missing of chardev frontend call fix for g_source_attach()), so that > > this series can be a complete fix. > > > > Please review. Thanks, > > > > Peter Xu (3): > > chardev: use backend chr context when watch for fe > > chardev: let g_idle_add() be with chardev gcontext > > chardev: introduce qemu_chr_timeout_add() and use > > > > chardev/char-fe.c | 2 +- > > chardev/char-pty.c | 16 ++++++++-------- > > chardev/char-socket.c | 4 ++-- > > chardev/char.c | 20 ++++++++++++++++++++ > > hw/char/terminal3270.c | 7 ++++--- > > include/chardev/char.h | 2 ++ > > 6 files changed, 37 insertions(+), 14 deletions(-) > > > > All queued, thanks! Paolo, Would you like to queue V2 of the series which fixed the issue that Marc-Andre has pointed out (Note that there is a v2.1 for patch 3). Thanks anyways! -- Peter Xu ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2018-01-03 8:54 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-12-28 7:29 [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Peter Xu 2017-12-28 7:29 ` [Qemu-devel] [PATCH 1/3] chardev: use backend chr context when watch for fe Peter Xu 2018-01-02 16:02 ` Marc-André Lureau 2017-12-28 7:29 ` [Qemu-devel] [PATCH 2/3] chardev: let g_idle_add() be with chardev gcontext Peter Xu 2018-01-02 16:02 ` Marc-André Lureau 2017-12-28 7:29 ` [Qemu-devel] [PATCH 3/3] chardev: introduce qemu_chr_timeout_add() and use Peter Xu 2018-01-02 16:10 ` Marc-André Lureau 2018-01-03 2:06 ` Peter Xu 2018-01-03 7:10 ` [Qemu-devel] [PATCH 0/3] chardev: convert leftover glib APIs to use dedicate gcontext Paolo Bonzini 2018-01-03 8:54 ` Peter Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).