qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks
Date: Wed, 22 Feb 2017 12:33:51 +0100	[thread overview]
Message-ID: <0dceec9d-230b-57c9-1e74-b54316e5d4ad@redhat.com> (raw)
In-Reply-To: <20170221141451.28305-7-marcandre.lureau@redhat.com>



On 21/02/2017 15:14, Marc-André Lureau wrote:
> Spotted by ASAN.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  include/hw/ptimer.h       |   1 +
>  hw/core/ptimer.c          |   8 +++
>  tests/ptimer-test-stubs.c |   5 ++
>  tests/ptimer-test.c       | 122 ++++++++++++++++++++++++++++------------------
>  4 files changed, 89 insertions(+), 47 deletions(-)
> 
> diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
> index 48cccbdb51..eafc3f0a86 100644
> --- a/include/hw/ptimer.h
> +++ b/include/hw/ptimer.h
> @@ -60,6 +60,7 @@ typedef struct ptimer_state ptimer_state;
>  typedef void (*ptimer_cb)(void *opaque);
>  
>  ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask);
> +void ptimer_free(ptimer_state *s);
>  void ptimer_set_period(ptimer_state *s, int64_t period);
>  void ptimer_set_freq(ptimer_state *s, uint32_t freq);
>  uint64_t ptimer_get_limit(ptimer_state *s);
> diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
> index 3af82afe78..59ccb00550 100644
> --- a/hw/core/ptimer.c
> +++ b/hw/core/ptimer.c
> @@ -12,6 +12,7 @@
>  #include "qemu/host-utils.h"
>  #include "sysemu/replay.h"
>  #include "sysemu/qtest.h"
> +#include "block/aio.h"
>  
>  #define DELTA_ADJUST     1
>  #define DELTA_NO_ADJUST -1
> @@ -353,3 +354,10 @@ ptimer_state *ptimer_init(QEMUBH *bh, uint8_t policy_mask)
>      s->policy_mask = policy_mask;
>      return s;
>  }
> +
> +void ptimer_free(ptimer_state *s)
> +{
> +    qemu_bh_delete(s->bh);
> +    timer_free(s->timer);
> +    g_free(s);
> +}
> diff --git a/tests/ptimer-test-stubs.c b/tests/ptimer-test-stubs.c
> index 21d4ebb0fe..8a1b0a336c 100644
> --- a/tests/ptimer-test-stubs.c
> +++ b/tests/ptimer-test-stubs.c
> @@ -108,6 +108,11 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
>      return bh;
>  }
>  
> +void qemu_bh_delete(QEMUBH *bh)
> +{
> +    g_free(bh);
> +}
> +
>  void replay_bh_schedule_event(QEMUBH *bh)
>  {
>      bh->cb(bh->opaque);
> diff --git a/tests/ptimer-test.c b/tests/ptimer-test.c
> index b36a476483..5d1a2a8188 100644
> --- a/tests/ptimer-test.c
> +++ b/tests/ptimer-test.c
> @@ -73,6 +73,7 @@ static void check_set_count(gconstpointer arg)
>      ptimer_set_count(ptimer, 1000);
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 1000);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_set_limit(gconstpointer arg)
> @@ -92,6 +93,7 @@ static void check_set_limit(gconstpointer arg)
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 2000);
>      g_assert_cmpuint(ptimer_get_limit(ptimer), ==, 2000);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_oneshot(gconstpointer arg)
> @@ -194,6 +196,7 @@ static void check_oneshot(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_periodic(gconstpointer arg)
> @@ -360,6 +363,7 @@ static void check_periodic(gconstpointer arg)
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==,
>                      (no_round_down ? 8 : 7) + (wrap_policy ? 1 : 0));
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_mode_change(gconstpointer arg)
> @@ -406,6 +410,7 @@ static void check_on_the_fly_mode_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_period_change(gconstpointer arg)
> @@ -438,6 +443,7 @@ static void check_on_the_fly_period_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_on_the_fly_freq_change(gconstpointer arg)
> @@ -470,6 +476,7 @@ static void check_on_the_fly_freq_change(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 0);
>      g_assert_true(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_run_with_period_0(gconstpointer arg)
> @@ -487,6 +494,7 @@ static void check_run_with_period_0(gconstpointer arg)
>  
>      g_assert_cmpuint(ptimer_get_count(ptimer), ==, 99);
>      g_assert_false(triggered);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_run_with_delta_0(gconstpointer arg)
> @@ -591,6 +599,7 @@ static void check_run_with_delta_0(gconstpointer arg)
>      g_assert_true(triggered);
>  
>      ptimer_stop(ptimer);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_periodic_with_load_0(gconstpointer arg)
> @@ -649,6 +658,7 @@ static void check_periodic_with_load_0(gconstpointer arg)
>      }
>  
>      ptimer_stop(ptimer);
> +    ptimer_free(ptimer);
>  }
>  
>  static void check_oneshot_with_load_0(gconstpointer arg)
> @@ -682,14 +692,14 @@ static void check_oneshot_with_load_0(gconstpointer arg)
>      } else {
>          g_assert_false(triggered);
>      }
> +
> +    ptimer_free(ptimer);
>  }
>  
>  static void add_ptimer_tests(uint8_t policy)
>  {
> -    uint8_t *ppolicy = g_malloc(1);
> -    char *policy_name = g_malloc0(256);
> -
> -    *ppolicy = policy;
> +    char policy_name[256] = "";
> +    char *tmp;
>  
>      if (policy == PTIMER_POLICY_DEFAULT) {
>          g_sprintf(policy_name, "default");
> @@ -715,49 +725,67 @@ static void add_ptimer_tests(uint8_t policy)
>          g_strlcat(policy_name, "no_counter_rounddown,", 256);
>      }
>  
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
> -        ppolicy, check_set_count);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
> -        ppolicy, check_set_limit);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
> -        ppolicy, check_oneshot);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
> -        ppolicy, check_periodic);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_mode_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_period_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s", policy_name),
> -        ppolicy, check_on_the_fly_freq_change);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/run_with_period_0 policy=%s", policy_name),
> -        ppolicy, check_run_with_period_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/run_with_delta_0 policy=%s", policy_name),
> -        ppolicy, check_run_with_delta_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s", policy_name),
> -        ppolicy, check_periodic_with_load_0);
> -
> -    g_test_add_data_func(
> -        g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s", policy_name),
> -        ppolicy, check_oneshot_with_load_0);
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/set_count policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_set_count, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/set_limit policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_set_limit, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/oneshot policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_oneshot, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/periodic policy=%s", policy_name),
> +        g_memdup(&policy, 1), check_periodic, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_mode_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_mode_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_period_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_period_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/on_the_fly_freq_change policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_on_the_fly_freq_change, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/run_with_period_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_run_with_period_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/run_with_delta_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_run_with_delta_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/periodic_with_load_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_periodic_with_load_0, g_free);
> +    g_free(tmp);
> +
> +    g_test_add_data_func_full(
> +        tmp = g_strdup_printf("/ptimer/oneshot_with_load_0 policy=%s",
> +                              policy_name),
> +        g_memdup(&policy, 1), check_oneshot_with_load_0, g_free);
> +    g_free(tmp);
>  }
>  
>  static void add_all_ptimer_policies_comb_tests(void)
> 

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

  reply	other threads:[~2017-02-22 11:33 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-21 14:14 [Qemu-devel] [PATCH v2 00/30] Various memory leak fixes Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 01/30] qtest: fix a memory leak Marc-André Lureau
2017-02-21 16:40   ` Philippe Mathieu-Daudé
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 02/30] tests: fix qmp response leak Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 03/30] tests: fix leaks in test-io-channel-command Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 04/30] timer: use an inline function for free Marc-André Lureau
2017-02-22 11:33   ` Paolo Bonzini
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 05/30] glib-compat: add g_test_add_data_func_full fallback Marc-André Lureau
2017-02-21 19:15   ` Eric Blake
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 06/30] tests: fix ptimer leaks Marc-André Lureau
2017-02-22 11:33   ` Paolo Bonzini [this message]
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 07/30] tests: fix endianness-test leaks Marc-André Lureau
2017-02-21 16:40   ` Philippe Mathieu-Daudé
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 08/30] tests: fix q35-test leaks Marc-André Lureau
2017-02-28 23:05   ` Eric Blake
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 09/30] tests: fix vhost-user-test leaks Marc-André Lureau
2017-02-28 23:09   ` Eric Blake
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 10/30] tests: fix ide-test leaks Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 11/30] tests: fix hd-geo-test leaks Marc-André Lureau
2017-02-27 13:59   ` Markus Armbruster
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 12/30] tests: fix bios-tables-test leak Marc-André Lureau
2017-02-27 14:03   ` Markus Armbruster
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 13/30] tests: fix ipmi-kcs-test leak Marc-André Lureau
2017-02-21 16:41   ` Philippe Mathieu-Daudé
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 14/30] tests: fix ipmi-bt-test leak Marc-André Lureau
2017-02-21 16:42   ` Philippe Mathieu-Daudé
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 15/30] pc: pcihp: avoid adding ACPI_PCIHP_PROP_BSEL twice Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 16/30] tests: fix eepro100-test leak Marc-André Lureau
2017-02-21 14:42   ` Stefan Weil
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 17/30] tests: fix tco-test leaks Marc-André Lureau
2017-02-28 23:10   ` Eric Blake
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 18/30] tests: fix e1000-test leak Marc-André Lureau
2017-02-21 16:42   ` Philippe Mathieu-Daudé
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 19/30] tests: fix i440fx-test leaks Marc-André Lureau
2017-02-27 14:05   ` Markus Armbruster
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 20/30] tests: fix e1000e leaks Marc-André Lureau
2017-02-27 14:12   ` Markus Armbruster
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 21/30] tests: fix virtio-scsi-test leak Marc-André Lureau
2017-02-22 11:33   ` Paolo Bonzini
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 22/30] tests: fix virtio-9p-test leaks Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 23/30] bus: do not unref hotplug handler Marc-André Lureau
2017-02-22 11:33   ` Paolo Bonzini
2017-02-22 13:03     ` Marc-André Lureau
2017-02-22 13:04       ` Paolo Bonzini
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 24/30] usb: replace handle_destroy with unrealize Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 25/30] usb: release the created buses Marc-André Lureau
2017-02-21 22:59   ` Gerd Hoffmann
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 26/30] tests: allows to run single test in usb-hcd-ehci-test Marc-André Lureau
2017-02-21 16:45   ` Philippe Mathieu-Daudé
2017-02-21 23:01   ` Gerd Hoffmann
2017-02-22  8:36     ` Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 27/30] tests: fix usb-test leaks Marc-André Lureau
2017-02-21 22:59   ` Gerd Hoffmann
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 28/30] tests: add specialized device_find function Marc-André Lureau
2017-02-28 23:21   ` Eric Blake
2017-03-01  7:59     ` Marc-André Lureau
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 29/30] tests: fix virtio-blk-test leaks Marc-André Lureau
2017-02-28 23:22   ` Eric Blake
2017-02-21 14:14 ` [Qemu-devel] [PATCH v2 30/30] migration: fix id leak regression Marc-André Lureau
2017-02-21 14:19   ` Dr. David Alan Gilbert
2017-02-21 17:04     ` Philippe Mathieu-Daudé
2017-02-22  8:41       ` Marc-André Lureau
2017-02-28  9:50   ` Dr. David Alan Gilbert
2017-02-27 11:04 ` [Qemu-devel] [PATCH v2 00/30] Various memory leak fixes Marc-André Lureau
2017-02-28 23:23   ` Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0dceec9d-230b-57c9-1e74-b54316e5d4ad@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).