RestartData is the opaque data of the throttle_group_restart_queue_entry
coroutine. By being stack allocated, it isn't available anymore if
aio_co_enter schedules the coroutine with a bottom halve and runs after
throttle_group_restart_queue returns.
Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr>
---
block/throttle-groups.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 6ba992c8d7..b291a88481 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -403,17 +403,19 @@ static void coroutine_fn throttle_group_restart_queue_entry(void *opaque)
schedule_next_request(tgm, is_write);
qemu_mutex_unlock(&tg->lock);
}
+
+ g_free(data);
}
static void throttle_group_restart_queue(ThrottleGroupMember *tgm, bool is_write)
{
Coroutine *co;
- RestartData rd = {
- .tgm = tgm,
- .is_write = is_write
- };
+ RestartData *rd = g_new0(RestartData, 1);
- co = qemu_coroutine_create(throttle_group_restart_queue_entry, &rd);
+ rd->tgm = tgm;
+ rd->is_write = is_write;
+
+ co = qemu_coroutine_create(throttle_group_restart_queue_entry, rd);
aio_co_enter(tgm->aio_context, co);
}
--
2.11.0
On 09/18/2017 03:25 PM, Manos Pitsidianakis wrote: > RestartData is the opaque data of the throttle_group_restart_queue_entry > coroutine. By being stack allocated, it isn't available anymore if > aio_co_enter schedules the coroutine with a bottom halve and runs after s/halve/half/ > throttle_group_restart_queue returns. > > Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr> > --- > block/throttle-groups.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > Reviewed-by: Eric Blake <eblake@redhat.com> -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
Am 18.09.2017 um 22:25 hat Manos Pitsidianakis geschrieben: > RestartData is the opaque data of the throttle_group_restart_queue_entry > coroutine. By being stack allocated, it isn't available anymore if > aio_co_enter schedules the coroutine with a bottom halve and runs after > throttle_group_restart_queue returns. Cc: qemu-stable@nongnu.org (It should be mentioned explicitly in the commit message so you can filter for it in the commit history. I routinely add this while applying patches if I'm aware of the qemu-stable CC, but it makes my life easier if it's already there.) > Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr> Thanks, applied to the block branch. Kevin
On Mon 18 Sep 2017 10:25:29 PM CEST, Manos Pitsidianakis wrote: > RestartData is the opaque data of the throttle_group_restart_queue_entry > coroutine. By being stack allocated, it isn't available anymore if > aio_co_enter schedules the coroutine with a bottom halve and runs after > throttle_group_restart_queue returns. > > Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr> Reviewed-by: Alberto Garcia <berto@igalia.com> Berto
Quoting Manos Pitsidianakis (2017-09-18 15:25:29)
> RestartData is the opaque data of the throttle_group_restart_queue_entry
> coroutine. By being stack allocated, it isn't available anymore if
> aio_co_enter schedules the coroutine with a bottom halve and runs after
> throttle_group_restart_queue returns.
>
> Signed-off-by: Manos Pitsidianakis <el13635@mail.ntua.gr>
FYI: this patch has been tagged for stable 2.10.1, but is not yet
upstream. Patch freeze for 2.10.1 is September 27th.
> ---
> block/throttle-groups.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/block/throttle-groups.c b/block/throttle-groups.c
> index 6ba992c8d7..b291a88481 100644
> --- a/block/throttle-groups.c
> +++ b/block/throttle-groups.c
> @@ -403,17 +403,19 @@ static void coroutine_fn throttle_group_restart_queue_entry(void *opaque)
> schedule_next_request(tgm, is_write);
> qemu_mutex_unlock(&tg->lock);
> }
> +
> + g_free(data);
> }
>
> static void throttle_group_restart_queue(ThrottleGroupMember *tgm, bool is_write)
> {
> Coroutine *co;
> - RestartData rd = {
> - .tgm = tgm,
> - .is_write = is_write
> - };
> + RestartData *rd = g_new0(RestartData, 1);
>
> - co = qemu_coroutine_create(throttle_group_restart_queue_entry, &rd);
> + rd->tgm = tgm;
> + rd->is_write = is_write;
> +
> + co = qemu_coroutine_create(throttle_group_restart_queue_entry, rd);
> aio_co_enter(tgm->aio_context, co);
> }
>
> --
> 2.11.0
>
>
© 2016 - 2025 Red Hat, Inc.