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>
This commit is contained in:
Stefan Hajnoczi 2016-12-01 19:26:45 +00:00
parent ee68697551
commit 0d9d86fb4d
2 changed files with 53 additions and 0 deletions

View File

@ -28,6 +28,9 @@ typedef struct {
QemuCond init_done_cond; /* is thread initialization done? */ QemuCond init_done_cond; /* is thread initialization done? */
bool stopping; bool stopping;
int thread_id; int thread_id;
/* AioContext poll parameters */
int64_t poll_max_ns;
} IOThread; } IOThread;
#define IOTHREAD(obj) \ #define IOTHREAD(obj) \

View File

@ -98,6 +98,15 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
return; 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_mutex_init(&iothread->init_done_lock);
qemu_cond_init(&iothread->init_done_cond); 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); 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) static void iothread_class_init(ObjectClass *klass, void *class_data)
{ {
UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass); UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
ucc->complete = iothread_complete; 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 = { static const TypeInfo iothread_info = {