* [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs
2017-09-26 4:52 [Qemu-devel] [PATCH v3 0/4] iothread: allow to create internal iothreads Peter Xu
@ 2017-09-26 4:52 ` Peter Xu
2017-09-26 4:58 ` Fam Zheng
2017-09-26 8:46 ` Stefan Hajnoczi
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use Peter Xu
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 4:52 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi, Fam Zheng,
peterx, Andreas Färber, Manos Pitsidianakis,
Dr . David Alan Gilbert, Markus Armbruster
We have object_get_objects_root() to keep user created objects, however
no place for objects that will be used internally. Create such a
container for internal objects.
CC: Andreas Färber <afaerber@suse.de>
CC: Markus Armbruster <armbru@redhat.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
Suggested-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/qom/object.h | 10 ++++++++++
qom/object.c | 11 +++++++++++
2 files changed, 21 insertions(+)
diff --git a/include/qom/object.h b/include/qom/object.h
index f3e5cff..f567052 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1214,6 +1214,16 @@ Object *object_get_root(void);
Object *object_get_objects_root(void);
/**
+ * object_get_internal_root:
+ *
+ * Get the container object that holds internally used object
+ * instances. This is the object at path "/internal-objects"
+ *
+ * Returns: the internal object container
+ */
+Object *object_get_internal_root(void);
+
+/**
* object_get_canonical_path_component:
*
* Returns: The final component in the object's canonical path. The canonical
diff --git a/qom/object.c b/qom/object.c
index 3e18537..6a7bd92 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1370,6 +1370,17 @@ Object *object_get_objects_root(void)
return container_get(object_get_root(), "/objects");
}
+Object *object_get_internal_root(void)
+{
+ static Object *internal_root;
+
+ if (!internal_root) {
+ internal_root = object_new("container");
+ }
+
+ return internal_root;
+}
+
static void object_get_child_property(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs Peter Xu
@ 2017-09-26 4:58 ` Fam Zheng
2017-09-26 5:12 ` Peter Xu
2017-09-26 8:46 ` Stefan Hajnoczi
1 sibling, 1 reply; 11+ messages in thread
From: Fam Zheng @ 2017-09-26 4:58 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi,
Andreas Färber, Manos Pitsidianakis, Dr . David Alan Gilbert,
Markus Armbruster
On Tue, 09/26 12:52, Peter Xu wrote:
> We have object_get_objects_root() to keep user created objects, however
> no place for objects that will be used internally. Create such a
> container for internal objects.
>
> CC: Andreas Färber <afaerber@suse.de>
> CC: Markus Armbruster <armbru@redhat.com>
> CC: Paolo Bonzini <pbonzini@redhat.com>
> Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> include/qom/object.h | 10 ++++++++++
> qom/object.c | 11 +++++++++++
> 2 files changed, 21 insertions(+)
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index f3e5cff..f567052 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1214,6 +1214,16 @@ Object *object_get_root(void);
> Object *object_get_objects_root(void);
>
> /**
> + * object_get_internal_root:
> + *
> + * Get the container object that holds internally used object
> + * instances. This is the object at path "/internal-objects"
Does this comment need update?
> + *
> + * Returns: the internal object container
> + */
> +Object *object_get_internal_root(void);
> +
> +/**
> * object_get_canonical_path_component:
> *
> * Returns: The final component in the object's canonical path. The canonical
> diff --git a/qom/object.c b/qom/object.c
> index 3e18537..6a7bd92 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1370,6 +1370,17 @@ Object *object_get_objects_root(void)
> return container_get(object_get_root(), "/objects");
> }
>
> +Object *object_get_internal_root(void)
> +{
> + static Object *internal_root;
> +
> + if (!internal_root) {
> + internal_root = object_new("container");
> + }
> +
> + return internal_root;
> +}
> +
> static void object_get_child_property(Object *obj, Visitor *v,
> const char *name, void *opaque,
> Error **errp)
> --
> 2.7.4
>
Fam
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs
2017-09-26 4:58 ` Fam Zheng
@ 2017-09-26 5:12 ` Peter Xu
0 siblings, 0 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 5:12 UTC (permalink / raw)
To: Fam Zheng
Cc: qemu-devel, Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi,
Andreas Färber, Manos Pitsidianakis, Dr . David Alan Gilbert,
Markus Armbruster
On Tue, Sep 26, 2017 at 12:58:24PM +0800, Fam Zheng wrote:
> On Tue, 09/26 12:52, Peter Xu wrote:
> > We have object_get_objects_root() to keep user created objects, however
> > no place for objects that will be used internally. Create such a
> > container for internal objects.
> >
> > CC: Andreas Färber <afaerber@suse.de>
> > CC: Markus Armbruster <armbru@redhat.com>
> > CC: Paolo Bonzini <pbonzini@redhat.com>
> > Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> > ---
> > include/qom/object.h | 10 ++++++++++
> > qom/object.c | 11 +++++++++++
> > 2 files changed, 21 insertions(+)
> >
> > diff --git a/include/qom/object.h b/include/qom/object.h
> > index f3e5cff..f567052 100644
> > --- a/include/qom/object.h
> > +++ b/include/qom/object.h
> > @@ -1214,6 +1214,16 @@ Object *object_get_root(void);
> > Object *object_get_objects_root(void);
> >
> > /**
> > + * object_get_internal_root:
> > + *
> > + * Get the container object that holds internally used object
> > + * instances. This is the object at path "/internal-objects"
>
> Does this comment need update?
Definitely. :)
--
Peter Xu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs Peter Xu
2017-09-26 4:58 ` Fam Zheng
@ 2017-09-26 8:46 ` Stefan Hajnoczi
2017-09-26 8:49 ` Peter Xu
1 sibling, 1 reply; 11+ messages in thread
From: Stefan Hajnoczi @ 2017-09-26 8:46 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Fam Zheng, Manos Pitsidianakis, Markus Armbruster,
Dr . David Alan Gilbert, Stefan Hajnoczi, Paolo Bonzini,
Andreas Färber
On Tue, Sep 26, 2017 at 12:52:09PM +0800, Peter Xu wrote:
> diff --git a/include/qom/object.h b/include/qom/object.h
> index f3e5cff..f567052 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1214,6 +1214,16 @@ Object *object_get_root(void);
> Object *object_get_objects_root(void);
>
> /**
> + * object_get_internal_root:
> + *
> + * Get the container object that holds internally used object
> + * instances. This is the object at path "/internal-objects"
When you update the comment, please mention that this root is for
objects that must not be user-visible. This root is not exposed in the
qom tree.
I think mentioning this will help others understand the purpose of the
internal root.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs
2017-09-26 8:46 ` Stefan Hajnoczi
@ 2017-09-26 8:49 ` Peter Xu
0 siblings, 0 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 8:49 UTC (permalink / raw)
To: Stefan Hajnoczi
Cc: qemu-devel, Fam Zheng, Manos Pitsidianakis, Markus Armbruster,
Dr . David Alan Gilbert, Stefan Hajnoczi, Paolo Bonzini,
Andreas Färber
On Tue, Sep 26, 2017 at 09:46:16AM +0100, Stefan Hajnoczi wrote:
> On Tue, Sep 26, 2017 at 12:52:09PM +0800, Peter Xu wrote:
> > diff --git a/include/qom/object.h b/include/qom/object.h
> > index f3e5cff..f567052 100644
> > --- a/include/qom/object.h
> > +++ b/include/qom/object.h
> > @@ -1214,6 +1214,16 @@ Object *object_get_root(void);
> > Object *object_get_objects_root(void);
> >
> > /**
> > + * object_get_internal_root:
> > + *
> > + * Get the container object that holds internally used object
> > + * instances. This is the object at path "/internal-objects"
>
> When you update the comment, please mention that this root is for
> objects that must not be user-visible. This root is not exposed in the
> qom tree.
>
> I think mentioning this will help others understand the purpose of the
> internal root.
Sure. Will do.
--
Peter Xu
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use
2017-09-26 4:52 [Qemu-devel] [PATCH v3 0/4] iothread: allow to create internal iothreads Peter Xu
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs Peter Xu
@ 2017-09-26 4:52 ` Peter Xu
2017-09-26 4:59 ` Fam Zheng
2017-09-26 8:46 ` Stefan Hajnoczi
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 3/4] iothread: export iothread_stop() Peter Xu
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 4/4] iothread: delay the context release to finalize Peter Xu
3 siblings, 2 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 4:52 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi, Fam Zheng,
peterx, Andreas Färber, Manos Pitsidianakis,
Dr . David Alan Gilbert
IOThread is a general framework that contains IO loop environment and a
real thread behind. It's also good to be used internally inside qemu.
Provide some helpers for it to create iothreads to be used internally.
Put all the internal used iothreads into the internal object container.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/sysemu/iothread.h | 8 ++++++++
iothread.c | 16 ++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
index d2985b3..b07663f 100644
--- a/include/sysemu/iothread.h
+++ b/include/sysemu/iothread.h
@@ -46,4 +46,12 @@ AioContext *iothread_get_aio_context(IOThread *iothread);
void iothread_stop_all(void);
GMainContext *iothread_get_g_main_context(IOThread *iothread);
+/*
+ * Helpers used to allocate iothreads for internal use. These
+ * iothreads will not be seen by monitor clients when query using
+ * "query-iothreads".
+ */
+IOThread *iothread_create(const char *id, Error **errp);
+void iothread_destroy(IOThread *iothread);
+
#endif /* IOTHREAD_H */
diff --git a/iothread.c b/iothread.c
index 44c8944..33f996e 100644
--- a/iothread.c
+++ b/iothread.c
@@ -354,3 +354,19 @@ GMainContext *iothread_get_g_main_context(IOThread *iothread)
return iothread->worker_context;
}
+
+IOThread *iothread_create(const char *id, Error **errp)
+{
+ Object *obj;
+
+ obj = object_new_with_props(TYPE_IOTHREAD,
+ object_get_internal_root(),
+ id, errp, NULL);
+
+ return IOTHREAD(obj);
+}
+
+void iothread_destroy(IOThread *iothread)
+{
+ object_unparent(OBJECT(iothread));
+}
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use Peter Xu
@ 2017-09-26 4:59 ` Fam Zheng
2017-09-26 8:46 ` Stefan Hajnoczi
1 sibling, 0 replies; 11+ messages in thread
From: Fam Zheng @ 2017-09-26 4:59 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi,
Andreas Färber, Manos Pitsidianakis, Dr . David Alan Gilbert
On Tue, 09/26 12:52, Peter Xu wrote:
> IOThread is a general framework that contains IO loop environment and a
> real thread behind. It's also good to be used internally inside qemu.
> Provide some helpers for it to create iothreads to be used internally.
>
> Put all the internal used iothreads into the internal object container.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> include/sysemu/iothread.h | 8 ++++++++
> iothread.c | 16 ++++++++++++++++
> 2 files changed, 24 insertions(+)
>
> diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
> index d2985b3..b07663f 100644
> --- a/include/sysemu/iothread.h
> +++ b/include/sysemu/iothread.h
> @@ -46,4 +46,12 @@ AioContext *iothread_get_aio_context(IOThread *iothread);
> void iothread_stop_all(void);
> GMainContext *iothread_get_g_main_context(IOThread *iothread);
>
> +/*
> + * Helpers used to allocate iothreads for internal use. These
> + * iothreads will not be seen by monitor clients when query using
> + * "query-iothreads".
> + */
> +IOThread *iothread_create(const char *id, Error **errp);
> +void iothread_destroy(IOThread *iothread);
> +
> #endif /* IOTHREAD_H */
> diff --git a/iothread.c b/iothread.c
> index 44c8944..33f996e 100644
> --- a/iothread.c
> +++ b/iothread.c
> @@ -354,3 +354,19 @@ GMainContext *iothread_get_g_main_context(IOThread *iothread)
>
> return iothread->worker_context;
> }
> +
> +IOThread *iothread_create(const char *id, Error **errp)
> +{
> + Object *obj;
> +
> + obj = object_new_with_props(TYPE_IOTHREAD,
> + object_get_internal_root(),
> + id, errp, NULL);
> +
> + return IOTHREAD(obj);
> +}
> +
> +void iothread_destroy(IOThread *iothread)
> +{
> + object_unparent(OBJECT(iothread));
> +}
> --
> 2.7.4
>
Reviewed-by: Fam Zheng <famz@redhat.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use Peter Xu
2017-09-26 4:59 ` Fam Zheng
@ 2017-09-26 8:46 ` Stefan Hajnoczi
1 sibling, 0 replies; 11+ messages in thread
From: Stefan Hajnoczi @ 2017-09-26 8:46 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Fam Zheng, Manos Pitsidianakis,
Dr . David Alan Gilbert, Stefan Hajnoczi, Paolo Bonzini,
Andreas Färber
On Tue, Sep 26, 2017 at 12:52:10PM +0800, Peter Xu wrote:
> IOThread is a general framework that contains IO loop environment and a
> real thread behind. It's also good to be used internally inside qemu.
> Provide some helpers for it to create iothreads to be used internally.
>
> Put all the internal used iothreads into the internal object container.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> include/sysemu/iothread.h | 8 ++++++++
> iothread.c | 16 ++++++++++++++++
> 2 files changed, 24 insertions(+)
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH v3 3/4] iothread: export iothread_stop()
2017-09-26 4:52 [Qemu-devel] [PATCH v3 0/4] iothread: allow to create internal iothreads Peter Xu
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 1/4] qom: provide root container for internal objs Peter Xu
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 2/4] iothread: provide helpers for internal use Peter Xu
@ 2017-09-26 4:52 ` Peter Xu
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 4/4] iothread: delay the context release to finalize Peter Xu
3 siblings, 0 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 4:52 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi, Fam Zheng,
peterx, Andreas Färber, Manos Pitsidianakis,
Dr . David Alan Gilbert
So that internal iothread users can explicitly stop one iothread without
destroying it.
Since at it, fix iothread_stop() to allow it to be called multiple
times. Before this patch we may call iothread_stop() more than once on
single iothread, while that may not be correct since qemu_thread_join()
is not allowed to run twice. From manual of pthread_join():
Joining with a thread that has previously been joined results in
undefined behavior.
Reviewed-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/sysemu/iothread.h | 1 +
iothread.c | 24 ++++++++++++++++--------
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h
index b07663f..110329b 100644
--- a/include/sysemu/iothread.h
+++ b/include/sysemu/iothread.h
@@ -52,6 +52,7 @@ GMainContext *iothread_get_g_main_context(IOThread *iothread);
* "query-iothreads".
*/
IOThread *iothread_create(const char *id, Error **errp);
+void iothread_stop(IOThread *iothread);
void iothread_destroy(IOThread *iothread);
#endif /* IOTHREAD_H */
diff --git a/iothread.c b/iothread.c
index 33f996e..b3c092b 100644
--- a/iothread.c
+++ b/iothread.c
@@ -80,13 +80,10 @@ static void *iothread_run(void *opaque)
return NULL;
}
-static int iothread_stop(Object *object, void *opaque)
+void iothread_stop(IOThread *iothread)
{
- IOThread *iothread;
-
- iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD);
- if (!iothread || !iothread->ctx) {
- return 0;
+ if (!iothread->ctx || iothread->stopping) {
+ return;
}
iothread->stopping = true;
aio_notify(iothread->ctx);
@@ -94,6 +91,17 @@ static int iothread_stop(Object *object, void *opaque)
g_main_loop_quit(iothread->main_loop);
}
qemu_thread_join(&iothread->thread);
+}
+
+static int iothread_stop_iter(Object *object, void *opaque)
+{
+ IOThread *iothread;
+
+ iothread = (IOThread *)object_dynamic_cast(object, TYPE_IOTHREAD);
+ if (!iothread) {
+ return 0;
+ }
+ iothread_stop(iothread);
return 0;
}
@@ -108,7 +116,7 @@ static void iothread_instance_finalize(Object *obj)
{
IOThread *iothread = IOTHREAD(obj);
- iothread_stop(obj, NULL);
+ iothread_stop(iothread);
qemu_cond_destroy(&iothread->init_done_cond);
qemu_mutex_destroy(&iothread->init_done_lock);
if (!iothread->ctx) {
@@ -328,7 +336,7 @@ void iothread_stop_all(void)
aio_context_release(ctx);
}
- object_child_foreach(container, iothread_stop, NULL);
+ object_child_foreach(container, iothread_stop_iter, NULL);
}
static gpointer iothread_g_main_context_init(gpointer opaque)
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [Qemu-devel] [PATCH v3 4/4] iothread: delay the context release to finalize
2017-09-26 4:52 [Qemu-devel] [PATCH v3 0/4] iothread: allow to create internal iothreads Peter Xu
` (2 preceding siblings ...)
2017-09-26 4:52 ` [Qemu-devel] [PATCH v3 3/4] iothread: export iothread_stop() Peter Xu
@ 2017-09-26 4:52 ` Peter Xu
3 siblings, 0 replies; 11+ messages in thread
From: Peter Xu @ 2017-09-26 4:52 UTC (permalink / raw)
To: qemu-devel
Cc: Paolo Bonzini, Daniel P . Berrange, Stefan Hajnoczi, Fam Zheng,
peterx, Andreas Färber, Manos Pitsidianakis,
Dr . David Alan Gilbert
When gcontext is used with iothread, the context will be destroyed
during iothread_stop(). That's not good since sometimes we would like
to keep the resources until iothread is destroyed, but we may want to
stop the thread before that point.
Delay the destruction of gcontext to iothread finalize. Then we can do:
iothread_stop(thread);
some_cleanup_on_resources();
iothread_destroy(thread);
We may need this patch if we want to run chardev IOs in iothreads and
hopefully clean them up correctly. For more specific information,
please see 2b316774f6 ("qemu-char: do not operate on sources from
finalize callbacks").
Reviewed-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
iothread.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/iothread.c b/iothread.c
index b3c092b..27a4288 100644
--- a/iothread.c
+++ b/iothread.c
@@ -71,8 +71,6 @@ static void *iothread_run(void *opaque)
g_main_loop_unref(loop);
g_main_context_pop_thread_default(iothread->worker_context);
- g_main_context_unref(iothread->worker_context);
- iothread->worker_context = NULL;
}
}
@@ -117,6 +115,10 @@ static void iothread_instance_finalize(Object *obj)
IOThread *iothread = IOTHREAD(obj);
iothread_stop(iothread);
+ if (iothread->worker_context) {
+ g_main_context_unref(iothread->worker_context);
+ iothread->worker_context = NULL;
+ }
qemu_cond_destroy(&iothread->init_done_cond);
qemu_mutex_destroy(&iothread->init_done_lock);
if (!iothread->ctx) {
--
2.7.4
^ permalink raw reply related [flat|nested] 11+ messages in thread