diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2016-12-01 19:26:45 +0000 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2017-01-03 16:38:49 +0000 |
commit | 0d9d86fb4df4882ba4ad9968efe81eca1c7b7c90 (patch) | |
tree | acb9d4f308182b42032f2e604f4c05aa4593d0b4 /iothread.c | |
parent | ee68697551cd81186c5b12eba10c158350cf1165 (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.c | 50 |
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 = { |