|
@@ -17,6 +17,7 @@
|
|
#include "qemu/module.h"
|
|
#include "qemu/module.h"
|
|
#include "block/aio.h"
|
|
#include "block/aio.h"
|
|
#include "block/block.h"
|
|
#include "block/block.h"
|
|
|
|
+#include "sysemu/event-loop-base.h"
|
|
#include "sysemu/iothread.h"
|
|
#include "sysemu/iothread.h"
|
|
#include "qapi/error.h"
|
|
#include "qapi/error.h"
|
|
#include "qapi/qapi-commands-misc.h"
|
|
#include "qapi/qapi-commands-misc.h"
|
|
@@ -152,10 +153,15 @@ static void iothread_init_gcontext(IOThread *iothread)
|
|
iothread->main_loop = g_main_loop_new(iothread->worker_context, TRUE);
|
|
iothread->main_loop = g_main_loop_new(iothread->worker_context, TRUE);
|
|
}
|
|
}
|
|
|
|
|
|
-static void iothread_set_aio_context_params(IOThread *iothread, Error **errp)
|
|
|
|
|
|
+static void iothread_set_aio_context_params(EventLoopBase *base, Error **errp)
|
|
{
|
|
{
|
|
|
|
+ IOThread *iothread = IOTHREAD(base);
|
|
ERRP_GUARD();
|
|
ERRP_GUARD();
|
|
|
|
|
|
|
|
+ if (!iothread->ctx) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
aio_context_set_poll_params(iothread->ctx,
|
|
aio_context_set_poll_params(iothread->ctx,
|
|
iothread->poll_max_ns,
|
|
iothread->poll_max_ns,
|
|
iothread->poll_grow,
|
|
iothread->poll_grow,
|
|
@@ -166,14 +172,15 @@ static void iothread_set_aio_context_params(IOThread *iothread, Error **errp)
|
|
}
|
|
}
|
|
|
|
|
|
aio_context_set_aio_params(iothread->ctx,
|
|
aio_context_set_aio_params(iothread->ctx,
|
|
- iothread->aio_max_batch,
|
|
|
|
|
|
+ iothread->parent_obj.aio_max_batch,
|
|
errp);
|
|
errp);
|
|
}
|
|
}
|
|
|
|
|
|
-static void iothread_complete(UserCreatable *obj, Error **errp)
|
|
|
|
|
|
+
|
|
|
|
+static void iothread_init(EventLoopBase *base, Error **errp)
|
|
{
|
|
{
|
|
Error *local_error = NULL;
|
|
Error *local_error = NULL;
|
|
- IOThread *iothread = IOTHREAD(obj);
|
|
|
|
|
|
+ IOThread *iothread = IOTHREAD(base);
|
|
char *thread_name;
|
|
char *thread_name;
|
|
|
|
|
|
iothread->stopping = false;
|
|
iothread->stopping = false;
|
|
@@ -189,7 +196,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
|
|
*/
|
|
*/
|
|
iothread_init_gcontext(iothread);
|
|
iothread_init_gcontext(iothread);
|
|
|
|
|
|
- iothread_set_aio_context_params(iothread, &local_error);
|
|
|
|
|
|
+ iothread_set_aio_context_params(base, &local_error);
|
|
if (local_error) {
|
|
if (local_error) {
|
|
error_propagate(errp, local_error);
|
|
error_propagate(errp, local_error);
|
|
aio_context_unref(iothread->ctx);
|
|
aio_context_unref(iothread->ctx);
|
|
@@ -201,7 +208,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
|
|
* to inherit.
|
|
* to inherit.
|
|
*/
|
|
*/
|
|
thread_name = g_strdup_printf("IO %s",
|
|
thread_name = g_strdup_printf("IO %s",
|
|
- object_get_canonical_path_component(OBJECT(obj)));
|
|
|
|
|
|
+ object_get_canonical_path_component(OBJECT(base)));
|
|
qemu_thread_create(&iothread->thread, thread_name, iothread_run,
|
|
qemu_thread_create(&iothread->thread, thread_name, iothread_run,
|
|
iothread, QEMU_THREAD_JOINABLE);
|
|
iothread, QEMU_THREAD_JOINABLE);
|
|
g_free(thread_name);
|
|
g_free(thread_name);
|
|
@@ -226,9 +233,6 @@ static IOThreadParamInfo poll_grow_info = {
|
|
static IOThreadParamInfo poll_shrink_info = {
|
|
static IOThreadParamInfo poll_shrink_info = {
|
|
"poll-shrink", offsetof(IOThread, poll_shrink),
|
|
"poll-shrink", offsetof(IOThread, poll_shrink),
|
|
};
|
|
};
|
|
-static IOThreadParamInfo aio_max_batch_info = {
|
|
|
|
- "aio-max-batch", offsetof(IOThread, aio_max_batch),
|
|
|
|
-};
|
|
|
|
|
|
|
|
static void iothread_get_param(Object *obj, Visitor *v,
|
|
static void iothread_get_param(Object *obj, Visitor *v,
|
|
const char *name, IOThreadParamInfo *info, Error **errp)
|
|
const char *name, IOThreadParamInfo *info, Error **errp)
|
|
@@ -288,35 +292,12 @@ static void iothread_set_poll_param(Object *obj, Visitor *v,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void iothread_get_aio_param(Object *obj, Visitor *v,
|
|
|
|
- const char *name, void *opaque, Error **errp)
|
|
|
|
-{
|
|
|
|
- IOThreadParamInfo *info = opaque;
|
|
|
|
-
|
|
|
|
- iothread_get_param(obj, v, name, info, errp);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void iothread_set_aio_param(Object *obj, Visitor *v,
|
|
|
|
- const char *name, void *opaque, Error **errp)
|
|
|
|
-{
|
|
|
|
- IOThread *iothread = IOTHREAD(obj);
|
|
|
|
- IOThreadParamInfo *info = opaque;
|
|
|
|
-
|
|
|
|
- if (!iothread_set_param(obj, v, name, info, errp)) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (iothread->ctx) {
|
|
|
|
- aio_context_set_aio_params(iothread->ctx,
|
|
|
|
- iothread->aio_max_batch,
|
|
|
|
- errp);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void iothread_class_init(ObjectClass *klass, void *class_data)
|
|
static void iothread_class_init(ObjectClass *klass, void *class_data)
|
|
{
|
|
{
|
|
- UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
|
|
|
|
- ucc->complete = iothread_complete;
|
|
|
|
|
|
+ EventLoopBaseClass *bc = EVENT_LOOP_BASE_CLASS(klass);
|
|
|
|
+
|
|
|
|
+ bc->init = iothread_init;
|
|
|
|
+ bc->update_params = iothread_set_aio_context_params;
|
|
|
|
|
|
object_class_property_add(klass, "poll-max-ns", "int",
|
|
object_class_property_add(klass, "poll-max-ns", "int",
|
|
iothread_get_poll_param,
|
|
iothread_get_poll_param,
|
|
@@ -330,23 +311,15 @@ static void iothread_class_init(ObjectClass *klass, void *class_data)
|
|
iothread_get_poll_param,
|
|
iothread_get_poll_param,
|
|
iothread_set_poll_param,
|
|
iothread_set_poll_param,
|
|
NULL, &poll_shrink_info);
|
|
NULL, &poll_shrink_info);
|
|
- object_class_property_add(klass, "aio-max-batch", "int",
|
|
|
|
- iothread_get_aio_param,
|
|
|
|
- iothread_set_aio_param,
|
|
|
|
- NULL, &aio_max_batch_info);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static const TypeInfo iothread_info = {
|
|
static const TypeInfo iothread_info = {
|
|
.name = TYPE_IOTHREAD,
|
|
.name = TYPE_IOTHREAD,
|
|
- .parent = TYPE_OBJECT,
|
|
|
|
|
|
+ .parent = TYPE_EVENT_LOOP_BASE,
|
|
.class_init = iothread_class_init,
|
|
.class_init = iothread_class_init,
|
|
.instance_size = sizeof(IOThread),
|
|
.instance_size = sizeof(IOThread),
|
|
.instance_init = iothread_instance_init,
|
|
.instance_init = iothread_instance_init,
|
|
.instance_finalize = iothread_instance_finalize,
|
|
.instance_finalize = iothread_instance_finalize,
|
|
- .interfaces = (InterfaceInfo[]) {
|
|
|
|
- {TYPE_USER_CREATABLE},
|
|
|
|
- {}
|
|
|
|
- },
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static void iothread_register_types(void)
|
|
static void iothread_register_types(void)
|
|
@@ -383,7 +356,7 @@ static int query_one_iothread(Object *object, void *opaque)
|
|
info->poll_max_ns = iothread->poll_max_ns;
|
|
info->poll_max_ns = iothread->poll_max_ns;
|
|
info->poll_grow = iothread->poll_grow;
|
|
info->poll_grow = iothread->poll_grow;
|
|
info->poll_shrink = iothread->poll_shrink;
|
|
info->poll_shrink = iothread->poll_shrink;
|
|
- info->aio_max_batch = iothread->aio_max_batch;
|
|
|
|
|
|
+ info->aio_max_batch = iothread->parent_obj.aio_max_batch;
|
|
|
|
|
|
QAPI_LIST_APPEND(*tail, info);
|
|
QAPI_LIST_APPEND(*tail, info);
|
|
return 0;
|
|
return 0;
|