aboutsummaryrefslogtreecommitdiff
path: root/iothread.c
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@redhat.com>2016-12-01 19:26:45 +0000
committerStefan Hajnoczi <stefanha@redhat.com>2017-01-03 16:38:49 +0000
commit0d9d86fb4df4882ba4ad9968efe81eca1c7b7c90 (patch)
treeacb9d4f308182b42032f2e604f4c05aa4593d0b4 /iothread.c
parentee68697551cd81186c5b12eba10c158350cf1165 (diff)
iothread: add polling parameters
Poll mode can be configured with -object iothread,poll-max-ns=NUM. Polling is disabled with a value of 0 nanoseconds. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-id: 20161201192652.9509-7-stefanha@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'iothread.c')
-rw-r--r--iothread.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/iothread.c b/iothread.c
index bd70344811..8dfd10dee6 100644
--- a/iothread.c
+++ b/iothread.c
@@ -98,6 +98,15 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
return;
}
+ aio_context_set_poll_params(iothread->ctx, iothread->poll_max_ns,
+ &local_error);
+ if (local_error) {
+ error_propagate(errp, local_error);
+ aio_context_unref(iothread->ctx);
+ iothread->ctx = NULL;
+ return;
+ }
+
qemu_mutex_init(&iothread->init_done_lock);
qemu_cond_init(&iothread->init_done_cond);
@@ -120,10 +129,51 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
qemu_mutex_unlock(&iothread->init_done_lock);
}
+static void iothread_get_poll_max_ns(Object *obj, Visitor *v,
+ const char *name, void *opaque, Error **errp)
+{
+ IOThread *iothread = IOTHREAD(obj);
+
+ visit_type_int64(v, name, &iothread->poll_max_ns, errp);
+}
+
+static void iothread_set_poll_max_ns(Object *obj, Visitor *v,
+ const char *name, void *opaque, Error **errp)
+{
+ IOThread *iothread = IOTHREAD(obj);
+ Error *local_err = NULL;
+ int64_t value;
+
+ visit_type_int64(v, name, &value, &local_err);
+ if (local_err) {
+ goto out;
+ }
+
+ if (value < 0) {
+ error_setg(&local_err, "poll_max_ns value must be in range "
+ "[0, %"PRId64"]", INT64_MAX);
+ goto out;
+ }
+
+ iothread->poll_max_ns = value;
+
+ if (iothread->ctx) {
+ aio_context_set_poll_params(iothread->ctx, value, &local_err);
+ }
+
+out:
+ error_propagate(errp, local_err);
+}
+
static void iothread_class_init(ObjectClass *klass, void *class_data)
{
UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
ucc->complete = iothread_complete;
+
+ object_class_property_add(klass, "poll-max-ns", "int",
+ iothread_get_poll_max_ns,
+ iothread_set_poll_max_ns,
+ NULL, NULL, &error_abort);
}
static const TypeInfo iothread_info = {