mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
iothread: add aio-max-batch parameter
The `aio-max-batch` parameter will be propagated to AIO engines and it will be used to control the maximum number of queued requests. When there are in queue a number of requests equal to `aio-max-batch`, the engine invokes the system call to forward the requests to the kernel. This parameter allows us to control the maximum batch size to reduce the latency that requests might accumulate while queued in the AIO engine queue. If `aio-max-batch` is equal to 0 (default value), the AIO engine will use its default maximum batch size value. Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> Message-id: 20210721094211.69853-3-sgarzare@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
0445409d74
commit
1793ad0247
10 changed files with 103 additions and 9 deletions
55
iothread.c
55
iothread.c
|
@ -152,6 +152,24 @@ static void iothread_init_gcontext(IOThread *iothread)
|
|||
iothread->main_loop = g_main_loop_new(iothread->worker_context, TRUE);
|
||||
}
|
||||
|
||||
static void iothread_set_aio_context_params(IOThread *iothread, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
|
||||
aio_context_set_poll_params(iothread->ctx,
|
||||
iothread->poll_max_ns,
|
||||
iothread->poll_grow,
|
||||
iothread->poll_shrink,
|
||||
errp);
|
||||
if (*errp) {
|
||||
return;
|
||||
}
|
||||
|
||||
aio_context_set_aio_params(iothread->ctx,
|
||||
iothread->aio_max_batch,
|
||||
errp);
|
||||
}
|
||||
|
||||
static void iothread_complete(UserCreatable *obj, Error **errp)
|
||||
{
|
||||
Error *local_error = NULL;
|
||||
|
@ -171,11 +189,7 @@ static void iothread_complete(UserCreatable *obj, Error **errp)
|
|||
*/
|
||||
iothread_init_gcontext(iothread);
|
||||
|
||||
aio_context_set_poll_params(iothread->ctx,
|
||||
iothread->poll_max_ns,
|
||||
iothread->poll_grow,
|
||||
iothread->poll_shrink,
|
||||
&local_error);
|
||||
iothread_set_aio_context_params(iothread, &local_error);
|
||||
if (local_error) {
|
||||
error_propagate(errp, local_error);
|
||||
aio_context_unref(iothread->ctx);
|
||||
|
@ -212,6 +226,9 @@ static PollParamInfo poll_grow_info = {
|
|||
static PollParamInfo poll_shrink_info = {
|
||||
"poll-shrink", offsetof(IOThread, poll_shrink),
|
||||
};
|
||||
static PollParamInfo aio_max_batch_info = {
|
||||
"aio-max-batch", offsetof(IOThread, aio_max_batch),
|
||||
};
|
||||
|
||||
static void iothread_get_param(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque, Error **errp)
|
||||
|
@ -271,6 +288,29 @@ 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)
|
||||
{
|
||||
|
||||
iothread_get_param(obj, v, name, opaque, errp);
|
||||
}
|
||||
|
||||
static void iothread_set_aio_param(Object *obj, Visitor *v,
|
||||
const char *name, void *opaque, Error **errp)
|
||||
{
|
||||
IOThread *iothread = IOTHREAD(obj);
|
||||
|
||||
if (!iothread_set_param(obj, v, name, opaque, 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)
|
||||
{
|
||||
UserCreatableClass *ucc = USER_CREATABLE_CLASS(klass);
|
||||
|
@ -288,6 +328,10 @@ static void iothread_class_init(ObjectClass *klass, void *class_data)
|
|||
iothread_get_poll_param,
|
||||
iothread_set_poll_param,
|
||||
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 = {
|
||||
|
@ -337,6 +381,7 @@ static int query_one_iothread(Object *object, void *opaque)
|
|||
info->poll_max_ns = iothread->poll_max_ns;
|
||||
info->poll_grow = iothread->poll_grow;
|
||||
info->poll_shrink = iothread->poll_shrink;
|
||||
info->aio_max_batch = iothread->aio_max_batch;
|
||||
|
||||
QAPI_LIST_APPEND(*tail, info);
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue