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 | |
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>
-rw-r--r-- | include/sysemu/iothread.h | 3 | ||||
-rw-r--r-- | iothread.c | 50 |
2 files changed, 53 insertions, 0 deletions
diff --git a/include/sysemu/iothread.h b/include/sysemu/iothread.h index 68ac2de83a..314e163377 100644 --- a/include/sysemu/iothread.h +++ b/include/sysemu/iothread.h @@ -28,6 +28,9 @@ typedef struct { QemuCond init_done_cond; /* is thread initialization done? */ bool stopping; int thread_id; + + /* AioContext poll parameters */ + int64_t poll_max_ns; } IOThread; #define IOTHREAD(obj) \ 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 = { |