diff mbox

block/throttle-groups.c: allocate RestartData on the heap

Message ID 20170918202529.28379-1-el13635@mail.ntua.gr (mailing list archive)
State New, archived
Headers show

Commit Message

Manos Pitsidianakis Sept. 18, 2017, 8:25 p.m. UTC
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(-)

Comments

Eric Blake Sept. 18, 2017, 8:56 p.m. UTC | #1
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>
Kevin Wolf Sept. 19, 2017, 7:29 a.m. UTC | #2
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
Alberto Garcia Sept. 20, 2017, 9:25 a.m. UTC | #3
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
Michael Roth Sept. 25, 2017, 8:51 p.m. UTC | #4
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
> 
>
diff mbox

Patch

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);
 }