* [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes
@ 2018-12-04 13:29 Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
I ran 'make check' with the clang sanitizers enabled, which
it turns out these days includes LeakSanitizer. That points
out a fair number of memory leaks, most of which are not
terribly significant. This patchset fixes five of them (there
are plenty more to do).
The "device does timer_new() in its instance_init function"
leak seems to be a common one with multiple other devices
showing up as having the same problem. Switching timer_init()
is probably a nicer fix than just moving timer_new() to realize,
but I wasn't sure if going from VMSTATE_TIMER_PTR to
VMSTATE_TIMER would be a migration compat break.
thanks
-- PMM
Peter Maydell (5):
target/arm: Free name string in ARMCPRegInfo hashtable entries
hw/arm/mps2-tz.c: Free mscname string in make_dma()
hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize()
tests/test-arm-mptimer: Don't leak string memory
target/arm: Create timers in realize, not init
hw/arm/mps2-tz.c | 1 +
hw/sd/sdhci.c | 5 +-
target/arm/cpu.c | 33 ++++++---
tests/test-arm-mptimer.c | 153 ++++++++++++++++++---------------------
4 files changed, 95 insertions(+), 97 deletions(-)
--
2.19.2
^ permalink raw reply [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
@ 2018-12-04 13:29 ` Peter Maydell
2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:25 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma() Peter Maydell
` (3 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
When we add a new entry to the ARMCPRegInfo hash table in
add_cpreg_to_hashtable(), we allocate memory for tehe
ARMCPRegInfo struct itself, and we also g_strdup() the
name string. So the hashtable's value destructor function
must free the name string as well as the struct.
Spotted by clang's leak sanitizer. The leak here is a
small one-off leak at startup, because we don't support
CPU hotplug, and so the only time when we destroy
hash table entries is for the case where ARM_CP_OVERRIDE
means we register a wildcard entry and then override it later.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/cpu.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 60411f6bfe0..b84a6c0e678 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -642,6 +642,20 @@ uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz)
return (Aff1 << ARM_AFF1_SHIFT) | Aff0;
}
+static void cpreg_hashtable_data_destroy(gpointer data)
+{
+ /*
+ * Destroy function for cpu->cp_regs hashtable data entries.
+ * We must free the name string because it was g_strdup()ed in
+ * add_cpreg_to_hashtable(). It's OK to cast away the 'const'
+ * from r->name because we know we definitely allocated it.
+ */
+ ARMCPRegInfo *r = data;
+
+ g_free((void *)r->name);
+ g_free(r);
+}
+
static void arm_cpu_initfn(Object *obj)
{
CPUState *cs = CPU(obj);
@@ -649,7 +663,7 @@ static void arm_cpu_initfn(Object *obj)
cs->env_ptr = &cpu->env;
cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
- g_free, g_free);
+ g_free, cpreg_hashtable_data_destroy);
QLIST_INIT(&cpu->pre_el_change_hooks);
QLIST_INIT(&cpu->el_change_hooks);
--
2.19.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma()
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
@ 2018-12-04 13:29 ` Peter Maydell
2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:26 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() Peter Maydell
` (2 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
The clang leak sanitizer spots a (one-off, trivial) memory
leak in make_dma() due to a missing free.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
hw/arm/mps2-tz.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 6dd02ae47e8..82b1d020a58 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -322,6 +322,7 @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
sysbus_connect_irq(s, 2, qdev_get_gpio_in_named(iotkitdev,
"EXP_IRQ", 57 + i * 3));
+ g_free(mscname);
return sysbus_mmio_get_region(s, 0);
}
--
2.19.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize()
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma() Peter Maydell
@ 2018-12-04 13:29 ` Peter Maydell
2018-12-04 13:58 ` Richard Henderson
2018-12-04 14:29 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init Peter Maydell
4 siblings, 2 replies; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
In sdhci_sysbus_realize() we override the initialization of
s->iomem that sdhci_common_realize() performs. However we
don't destroy the old memory region before reinitializing
it, which means that the memory allocated for mr->name in
memory_region_do_init() is leaked.
Since sdhci_initfn() already initializes s->io_ops to
&sdhci_mmio_ops, always use that in sdhci_common_realize()
and remove the now-unnecessary reinitialization of the
MMIO region from sdhci_sysbus_realize().
Spotted by clang's leak sanitizer.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
hw/sd/sdhci.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 81bbf032794..83f1574ffdc 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1371,7 +1371,7 @@ static void sdhci_common_realize(SDHCIState *s, Error **errp)
s->buf_maxsz = sdhci_get_fifolen(s);
s->fifo_buffer = g_malloc0(s->buf_maxsz);
- memory_region_init_io(&s->iomem, OBJECT(s), &sdhci_mmio_ops, s, "sdhci",
+ memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
SDHC_REGISTERS_MAP_SIZE);
}
@@ -1565,9 +1565,6 @@ static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
sysbus_init_irq(sbd, &s->irq);
- memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
- SDHC_REGISTERS_MAP_SIZE);
-
sysbus_init_mmio(sbd, &s->iomem);
}
--
2.19.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
` (2 preceding siblings ...)
2018-12-04 13:29 ` [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() Peter Maydell
@ 2018-12-04 13:29 ` Peter Maydell
2018-12-04 14:00 ` Richard Henderson
2018-12-04 17:08 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init Peter Maydell
4 siblings, 2 replies; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
The test-arm-mptimer setup creates a lot of test names using
g_strdup_printf() and never frees them. This is entirely
harmless since it's one-shot test code, but it clutters
up the output from clang's LeakSanitizer. Refactor to
use a helper function so we can free the memory.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
tests/test-arm-mptimer.c | 153 ++++++++++++++++++---------------------
1 file changed, 69 insertions(+), 84 deletions(-)
diff --git a/tests/test-arm-mptimer.c b/tests/test-arm-mptimer.c
index cb8f2df9141..156a39f50dd 100644
--- a/tests/test-arm-mptimer.c
+++ b/tests/test-arm-mptimer.c
@@ -991,10 +991,25 @@ static void test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot(void)
g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
}
+/*
+ * Add a qtest test that comes in two versions: one with
+ * a timer scaler setting, and one with the timer nonscaled.
+ */
+static void add_scaler_test(const char *str, bool scale,
+ void (*fn)(const void *))
+{
+ char *name;
+ int *scaler = scale ? &scaled : &nonscaled;
+
+ name = g_strdup_printf("%s=%d", str, *scaler);
+ qtest_add_data_func(name, scaler, fn);
+ g_free(name);
+}
+
int main(int argc, char **argv)
{
- int *scaler = &nonscaled;
int ret;
+ int scale;
g_test_init(&argc, &argv, NULL);
@@ -1012,89 +1027,59 @@ int main(int argc, char **argv)
qtest_add_func("mptimer/prescaler", test_timer_prescaler);
qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly);
-tests_with_prescaler_arg:
- qtest_add_data_func(
- g_strdup_printf("mptimer/oneshot scaler=%d", *scaler),
- scaler, test_timer_oneshot);
- qtest_add_data_func(
- g_strdup_printf("mptimer/pause scaler=%d", *scaler),
- scaler, test_timer_pause);
- qtest_add_data_func(
- g_strdup_printf("mptimer/reload scaler=%d", *scaler),
- scaler, test_timer_reload);
- qtest_add_data_func(
- g_strdup_printf("mptimer/periodic scaler=%d", *scaler),
- scaler, test_timer_periodic);
- qtest_add_data_func(
- g_strdup_printf("mptimer/oneshot_to_periodic scaler=%d", *scaler),
- scaler, test_timer_oneshot_to_periodic);
- qtest_add_data_func(
- g_strdup_printf("mptimer/periodic_to_oneshot scaler=%d", *scaler),
- scaler, test_timer_periodic_to_oneshot);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_oneshot_counter_to_0 scaler=%d", *scaler),
- scaler, test_timer_set_oneshot_counter_to_0);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_periodic_counter_to_0 scaler=%d", *scaler),
- scaler, test_timer_set_periodic_counter_to_0);
- qtest_add_data_func(
- g_strdup_printf("mptimer/noload_oneshot scaler=%d", *scaler),
- scaler, test_timer_noload_oneshot);
- qtest_add_data_func(
- g_strdup_printf("mptimer/noload_periodic scaler=%d", *scaler),
- scaler, test_timer_noload_periodic);
- qtest_add_data_func(
- g_strdup_printf("mptimer/zero_load_oneshot scaler=%d", *scaler),
- scaler, test_timer_zero_load_oneshot);
- qtest_add_data_func(
- g_strdup_printf("mptimer/zero_load_periodic scaler=%d", *scaler),
- scaler, test_timer_zero_load_periodic);
- qtest_add_data_func(
- g_strdup_printf("mptimer/zero_load_oneshot_to_nonzero scaler=%d", *scaler),
- scaler, test_timer_zero_load_oneshot_to_nonzero);
- qtest_add_data_func(
- g_strdup_printf("mptimer/zero_load_periodic_to_nonzero scaler=%d", *scaler),
- scaler, test_timer_zero_load_periodic_to_nonzero);
- qtest_add_data_func(
- g_strdup_printf("mptimer/nonzero_load_oneshot_to_zero scaler=%d", *scaler),
- scaler, test_timer_nonzero_load_oneshot_to_zero);
- qtest_add_data_func(
- g_strdup_printf("mptimer/nonzero_load_periodic_to_zero scaler=%d", *scaler),
- scaler, test_timer_nonzero_load_periodic_to_zero);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_periodic_counter_on_the_fly scaler=%d", *scaler),
- scaler, test_timer_set_periodic_counter_on_the_fly);
- qtest_add_data_func(
- g_strdup_printf("mptimer/enable_and_set_counter scaler=%d", *scaler),
- scaler, test_timer_enable_and_set_counter);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_counter_and_enable scaler=%d", *scaler),
- scaler, test_timer_set_counter_and_enable);
- qtest_add_data_func(
- g_strdup_printf("mptimer/oneshot_with_counter_0_on_start scaler=%d", *scaler),
- scaler, test_timer_oneshot_with_counter_0_on_start);
- qtest_add_data_func(
- g_strdup_printf("mptimer/periodic_with_counter_0_on_start scaler=%d", *scaler),
- scaler, test_timer_periodic_with_counter_0_on_start);
- qtest_add_data_func(
- g_strdup_printf("mptimer/periodic_counter scaler=%d", *scaler),
- scaler, test_periodic_counter);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_counter_periodic_with_zero_load scaler=%d", *scaler),
- scaler, test_timer_set_counter_periodic_with_zero_load);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_oneshot_load_to_0 scaler=%d", *scaler),
- scaler, test_timer_set_oneshot_load_to_0);
- qtest_add_data_func(
- g_strdup_printf("mptimer/set_periodic_load_to_0 scaler=%d", *scaler),
- scaler, test_timer_set_periodic_load_to_0);
- qtest_add_data_func(
- g_strdup_printf("mptimer/zero_load_mode_switch scaler=%d", *scaler),
- scaler, test_timer_zero_load_mode_switch);
-
- if (scaler == &nonscaled) {
- scaler = &scaled;
- goto tests_with_prescaler_arg;
+ for (scale = 0; scale < 2; scale++) {
+ add_scaler_test("mptimer/oneshot scaler",
+ scale, test_timer_oneshot);
+ add_scaler_test("mptimer/pause scaler",
+ scale, test_timer_pause);
+ add_scaler_test("mptimer/reload scaler",
+ scale, test_timer_reload);
+ add_scaler_test("mptimer/periodic scaler",
+ scale, test_timer_periodic);
+ add_scaler_test("mptimer/oneshot_to_periodic scaler",
+ scale, test_timer_oneshot_to_periodic);
+ add_scaler_test("mptimer/periodic_to_oneshot scaler",
+ scale, test_timer_periodic_to_oneshot);
+ add_scaler_test("mptimer/set_oneshot_counter_to_0 scaler",
+ scale, test_timer_set_oneshot_counter_to_0);
+ add_scaler_test("mptimer/set_periodic_counter_to_0 scaler",
+ scale, test_timer_set_periodic_counter_to_0);
+ add_scaler_test("mptimer/noload_oneshot scaler",
+ scale, test_timer_noload_oneshot);
+ add_scaler_test("mptimer/noload_periodic scaler",
+ scale, test_timer_noload_periodic);
+ add_scaler_test("mptimer/zero_load_oneshot scaler",
+ scale, test_timer_zero_load_oneshot);
+ add_scaler_test("mptimer/zero_load_periodic scaler",
+ scale, test_timer_zero_load_periodic);
+ add_scaler_test("mptimer/zero_load_oneshot_to_nonzero scaler",
+ scale, test_timer_zero_load_oneshot_to_nonzero);
+ add_scaler_test("mptimer/zero_load_periodic_to_nonzero scaler",
+ scale, test_timer_zero_load_periodic_to_nonzero);
+ add_scaler_test("mptimer/nonzero_load_oneshot_to_zero scaler",
+ scale, test_timer_nonzero_load_oneshot_to_zero);
+ add_scaler_test("mptimer/nonzero_load_periodic_to_zero scaler",
+ scale, test_timer_nonzero_load_periodic_to_zero);
+ add_scaler_test("mptimer/set_periodic_counter_on_the_fly scaler",
+ scale, test_timer_set_periodic_counter_on_the_fly);
+ add_scaler_test("mptimer/enable_and_set_counter scaler",
+ scale, test_timer_enable_and_set_counter);
+ add_scaler_test("mptimer/set_counter_and_enable scaler",
+ scale, test_timer_set_counter_and_enable);
+ add_scaler_test("mptimer/oneshot_with_counter_0_on_start scaler",
+ scale, test_timer_oneshot_with_counter_0_on_start);
+ add_scaler_test("mptimer/periodic_with_counter_0_on_start scaler",
+ scale, test_timer_periodic_with_counter_0_on_start);
+ add_scaler_test("mptimer/periodic_counter scaler",
+ scale, test_periodic_counter);
+ add_scaler_test("mptimer/set_counter_periodic_with_zero_load scaler",
+ scale, test_timer_set_counter_periodic_with_zero_load);
+ add_scaler_test("mptimer/set_oneshot_load_to_0 scaler",
+ scale, test_timer_set_oneshot_load_to_0);
+ add_scaler_test("mptimer/set_periodic_load_to_0 scaler",
+ scale, test_timer_set_periodic_load_to_0);
+ add_scaler_test("mptimer/zero_load_mode_switch scaler",
+ scale, test_timer_zero_load_mode_switch);
}
qtest_start("-machine vexpress-a9");
--
2.19.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
` (3 preceding siblings ...)
2018-12-04 13:29 ` [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory Peter Maydell
@ 2018-12-04 13:29 ` Peter Maydell
2018-12-04 14:01 ` Richard Henderson
4 siblings, 1 reply; 15+ messages in thread
From: Peter Maydell @ 2018-12-04 13:29 UTC (permalink / raw)
To: qemu-arm, qemu-devel; +Cc: patches
The timer_new() function allocates memory; this means that
if we call it in the CPU's init method we would need
to provide an instance_finalize method to free it. Defer
the timer creation to the realize function instead.
This fixes a memory leak spotted by clang LeakSanitizer
when a CPU object is created for introspection.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target/arm/cpu.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index b84a6c0e678..0e7138c9bfb 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -679,14 +679,6 @@ static void arm_cpu_initfn(Object *obj)
qdev_init_gpio_in(DEVICE(cpu), arm_cpu_set_irq, 4);
}
- cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
- arm_gt_ptimer_cb, cpu);
- cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
- arm_gt_vtimer_cb, cpu);
- cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
- arm_gt_htimer_cb, cpu);
- cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
- arm_gt_stimer_cb, cpu);
qdev_init_gpio_out(DEVICE(cpu), cpu->gt_timer_outputs,
ARRAY_SIZE(cpu->gt_timer_outputs));
@@ -882,6 +874,15 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
return;
}
}
+
+ cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
+ arm_gt_ptimer_cb, cpu);
+ cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
+ arm_gt_vtimer_cb, cpu);
+ cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
+ arm_gt_htimer_cb, cpu);
+ cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
+ arm_gt_stimer_cb, cpu);
#endif
cpu_exec_realizefn(cs, &local_err);
--
2.19.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
@ 2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:25 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2018-12-04 13:57 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 12/4/18 7:29 AM, Peter Maydell wrote:
> When we add a new entry to the ARMCPRegInfo hash table in
> add_cpreg_to_hashtable(), we allocate memory for tehe
> ARMCPRegInfo struct itself, and we also g_strdup() the
> name string. So the hashtable's value destructor function
> must free the name string as well as the struct.
>
> Spotted by clang's leak sanitizer. The leak here is a
> small one-off leak at startup, because we don't support
> CPU hotplug, and so the only time when we destroy
> hash table entries is for the case where ARM_CP_OVERRIDE
> means we register a wildcard entry and then override it later.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> target/arm/cpu.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma()
2018-12-04 13:29 ` [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma() Peter Maydell
@ 2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:26 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2018-12-04 13:57 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 12/4/18 7:29 AM, Peter Maydell wrote:
> The clang leak sanitizer spots a (one-off, trivial) memory
> leak in make_dma() due to a missing free.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> hw/arm/mps2-tz.c | 1 +
> 1 file changed, 1 insertion(+)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize()
2018-12-04 13:29 ` [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() Peter Maydell
@ 2018-12-04 13:58 ` Richard Henderson
2018-12-04 14:29 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2018-12-04 13:58 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 12/4/18 7:29 AM, Peter Maydell wrote:
> In sdhci_sysbus_realize() we override the initialization of
> s->iomem that sdhci_common_realize() performs. However we
> don't destroy the old memory region before reinitializing
> it, which means that the memory allocated for mr->name in
> memory_region_do_init() is leaked.
>
> Since sdhci_initfn() already initializes s->io_ops to
> &sdhci_mmio_ops, always use that in sdhci_common_realize()
> and remove the now-unnecessary reinitialization of the
> MMIO region from sdhci_sysbus_realize().
>
> Spotted by clang's leak sanitizer.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> hw/sd/sdhci.c | 5 +----
> 1 file changed, 1 insertion(+), 4 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory
2018-12-04 13:29 ` [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory Peter Maydell
@ 2018-12-04 14:00 ` Richard Henderson
2018-12-04 17:08 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2018-12-04 14:00 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 12/4/18 7:29 AM, Peter Maydell wrote:
> The test-arm-mptimer setup creates a lot of test names using
> g_strdup_printf() and never frees them. This is entirely
> harmless since it's one-shot test code, but it clutters
> up the output from clang's LeakSanitizer. Refactor to
> use a helper function so we can free the memory.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> tests/test-arm-mptimer.c | 153 ++++++++++++++++++---------------------
> 1 file changed, 69 insertions(+), 84 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init
2018-12-04 13:29 ` [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init Peter Maydell
@ 2018-12-04 14:01 ` Richard Henderson
0 siblings, 0 replies; 15+ messages in thread
From: Richard Henderson @ 2018-12-04 14:01 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 12/4/18 7:29 AM, Peter Maydell wrote:
> The timer_new() function allocates memory; this means that
> if we call it in the CPU's init method we would need
> to provide an instance_finalize method to free it. Defer
> the timer creation to the realize function instead.
>
> This fixes a memory leak spotted by clang LeakSanitizer
> when a CPU object is created for introspection.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> target/arm/cpu.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
2018-12-04 13:57 ` Richard Henderson
@ 2018-12-04 14:25 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-12-04 14:25 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 4/12/18 14:29, Peter Maydell wrote:
> When we add a new entry to the ARMCPRegInfo hash table in
> add_cpreg_to_hashtable(), we allocate memory for tehe
"for the"?
> ARMCPRegInfo struct itself, and we also g_strdup() the
> name string. So the hashtable's value destructor function
> must free the name string as well as the struct.
>
> Spotted by clang's leak sanitizer. The leak here is a
> small one-off leak at startup, because we don't support
> CPU hotplug, and so the only time when we destroy
> hash table entries is for the case where ARM_CP_OVERRIDE
> means we register a wildcard entry and then override it later.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> target/arm/cpu.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/target/arm/cpu.c b/target/arm/cpu.c
> index 60411f6bfe0..b84a6c0e678 100644
> --- a/target/arm/cpu.c
> +++ b/target/arm/cpu.c
> @@ -642,6 +642,20 @@ uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz)
> return (Aff1 << ARM_AFF1_SHIFT) | Aff0;
> }
>
> +static void cpreg_hashtable_data_destroy(gpointer data)
> +{
> + /*
> + * Destroy function for cpu->cp_regs hashtable data entries.
> + * We must free the name string because it was g_strdup()ed in
> + * add_cpreg_to_hashtable(). It's OK to cast away the 'const'
> + * from r->name because we know we definitely allocated it.
> + */
> + ARMCPRegInfo *r = data;
> +
> + g_free((void *)r->name);
> + g_free(r);
> +}
> +
> static void arm_cpu_initfn(Object *obj)
> {
> CPUState *cs = CPU(obj);
> @@ -649,7 +663,7 @@ static void arm_cpu_initfn(Object *obj)
>
> cs->env_ptr = &cpu->env;
> cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
> - g_free, g_free);
> + g_free, cpreg_hashtable_data_destroy);
>
> QLIST_INIT(&cpu->pre_el_change_hooks);
> QLIST_INIT(&cpu->el_change_hooks);
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma()
2018-12-04 13:29 ` [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma() Peter Maydell
2018-12-04 13:57 ` Richard Henderson
@ 2018-12-04 14:26 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-12-04 14:26 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 4/12/18 14:29, Peter Maydell wrote:
> The clang leak sanitizer spots a (one-off, trivial) memory
> leak in make_dma() due to a missing free.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> hw/arm/mps2-tz.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
> index 6dd02ae47e8..82b1d020a58 100644
> --- a/hw/arm/mps2-tz.c
> +++ b/hw/arm/mps2-tz.c
> @@ -322,6 +322,7 @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
> sysbus_connect_irq(s, 2, qdev_get_gpio_in_named(iotkitdev,
> "EXP_IRQ", 57 + i * 3));
>
> + g_free(mscname);
> return sysbus_mmio_get_region(s, 0);
> }
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize()
2018-12-04 13:29 ` [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() Peter Maydell
2018-12-04 13:58 ` Richard Henderson
@ 2018-12-04 14:29 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-12-04 14:29 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 4/12/18 14:29, Peter Maydell wrote:
> In sdhci_sysbus_realize() we override the initialization of
> s->iomem that sdhci_common_realize() performs. However we
> don't destroy the old memory region before reinitializing
> it, which means that the memory allocated for mr->name in
> memory_region_do_init() is leaked.
Oops
>
> Since sdhci_initfn() already initializes s->io_ops to
> &sdhci_mmio_ops, always use that in sdhci_common_realize()
> and remove the now-unnecessary reinitialization of the
> MMIO region from sdhci_sysbus_realize().
Thanks for the cleanup!
>
> Spotted by clang's leak sanitizer.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> hw/sd/sdhci.c | 5 +----
> 1 file changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 81bbf032794..83f1574ffdc 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -1371,7 +1371,7 @@ static void sdhci_common_realize(SDHCIState *s, Error **errp)
> s->buf_maxsz = sdhci_get_fifolen(s);
> s->fifo_buffer = g_malloc0(s->buf_maxsz);
>
> - memory_region_init_io(&s->iomem, OBJECT(s), &sdhci_mmio_ops, s, "sdhci",
> + memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
> SDHC_REGISTERS_MAP_SIZE);
> }
>
> @@ -1565,9 +1565,6 @@ static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
>
> sysbus_init_irq(sbd, &s->irq);
>
> - memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
> - SDHC_REGISTERS_MAP_SIZE);
> -
> sysbus_init_mmio(sbd, &s->iomem);
> }
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory
2018-12-04 13:29 ` [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory Peter Maydell
2018-12-04 14:00 ` Richard Henderson
@ 2018-12-04 17:08 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-12-04 17:08 UTC (permalink / raw)
To: Peter Maydell, qemu-arm, qemu-devel; +Cc: patches
On 4/12/18 14:29, Peter Maydell wrote:
> The test-arm-mptimer setup creates a lot of test names using
> g_strdup_printf() and never frees them. This is entirely
> harmless since it's one-shot test code, but it clutters
> up the output from clang's LeakSanitizer. Refactor to
> use a helper function so we can free the memory.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> tests/test-arm-mptimer.c | 153 ++++++++++++++++++---------------------
> 1 file changed, 69 insertions(+), 84 deletions(-)
>
> diff --git a/tests/test-arm-mptimer.c b/tests/test-arm-mptimer.c
> index cb8f2df9141..156a39f50dd 100644
> --- a/tests/test-arm-mptimer.c
> +++ b/tests/test-arm-mptimer.c
> @@ -991,10 +991,25 @@ static void test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot(void)
> g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
> }
>
> +/*
> + * Add a qtest test that comes in two versions: one with
> + * a timer scaler setting, and one with the timer nonscaled.
> + */
> +static void add_scaler_test(const char *str, bool scale,
> + void (*fn)(const void *))
> +{
> + char *name;
> + int *scaler = scale ? &scaled : &nonscaled;
> +
> + name = g_strdup_printf("%s=%d", str, *scaler);
> + qtest_add_data_func(name, scaler, fn);
> + g_free(name);
> +}
> +
> int main(int argc, char **argv)
> {
> - int *scaler = &nonscaled;
> int ret;
> + int scale;
>
> g_test_init(&argc, &argv, NULL);
>
> @@ -1012,89 +1027,59 @@ int main(int argc, char **argv)
> qtest_add_func("mptimer/prescaler", test_timer_prescaler);
> qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly);
>
> -tests_with_prescaler_arg:
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/oneshot scaler=%d", *scaler),
> - scaler, test_timer_oneshot);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/pause scaler=%d", *scaler),
> - scaler, test_timer_pause);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/reload scaler=%d", *scaler),
> - scaler, test_timer_reload);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/periodic scaler=%d", *scaler),
> - scaler, test_timer_periodic);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/oneshot_to_periodic scaler=%d", *scaler),
> - scaler, test_timer_oneshot_to_periodic);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/periodic_to_oneshot scaler=%d", *scaler),
> - scaler, test_timer_periodic_to_oneshot);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_oneshot_counter_to_0 scaler=%d", *scaler),
> - scaler, test_timer_set_oneshot_counter_to_0);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_periodic_counter_to_0 scaler=%d", *scaler),
> - scaler, test_timer_set_periodic_counter_to_0);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/noload_oneshot scaler=%d", *scaler),
> - scaler, test_timer_noload_oneshot);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/noload_periodic scaler=%d", *scaler),
> - scaler, test_timer_noload_periodic);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/zero_load_oneshot scaler=%d", *scaler),
> - scaler, test_timer_zero_load_oneshot);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/zero_load_periodic scaler=%d", *scaler),
> - scaler, test_timer_zero_load_periodic);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/zero_load_oneshot_to_nonzero scaler=%d", *scaler),
> - scaler, test_timer_zero_load_oneshot_to_nonzero);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/zero_load_periodic_to_nonzero scaler=%d", *scaler),
> - scaler, test_timer_zero_load_periodic_to_nonzero);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/nonzero_load_oneshot_to_zero scaler=%d", *scaler),
> - scaler, test_timer_nonzero_load_oneshot_to_zero);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/nonzero_load_periodic_to_zero scaler=%d", *scaler),
> - scaler, test_timer_nonzero_load_periodic_to_zero);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_periodic_counter_on_the_fly scaler=%d", *scaler),
> - scaler, test_timer_set_periodic_counter_on_the_fly);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/enable_and_set_counter scaler=%d", *scaler),
> - scaler, test_timer_enable_and_set_counter);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_counter_and_enable scaler=%d", *scaler),
> - scaler, test_timer_set_counter_and_enable);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/oneshot_with_counter_0_on_start scaler=%d", *scaler),
> - scaler, test_timer_oneshot_with_counter_0_on_start);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/periodic_with_counter_0_on_start scaler=%d", *scaler),
> - scaler, test_timer_periodic_with_counter_0_on_start);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/periodic_counter scaler=%d", *scaler),
> - scaler, test_periodic_counter);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_counter_periodic_with_zero_load scaler=%d", *scaler),
> - scaler, test_timer_set_counter_periodic_with_zero_load);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_oneshot_load_to_0 scaler=%d", *scaler),
> - scaler, test_timer_set_oneshot_load_to_0);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/set_periodic_load_to_0 scaler=%d", *scaler),
> - scaler, test_timer_set_periodic_load_to_0);
> - qtest_add_data_func(
> - g_strdup_printf("mptimer/zero_load_mode_switch scaler=%d", *scaler),
> - scaler, test_timer_zero_load_mode_switch);
> -
> - if (scaler == &nonscaled) {
> - scaler = &scaled;
> - goto tests_with_prescaler_arg;
> + for (scale = 0; scale < 2; scale++) {
> + add_scaler_test("mptimer/oneshot scaler",
> + scale, test_timer_oneshot);
> + add_scaler_test("mptimer/pause scaler",
> + scale, test_timer_pause);
> + add_scaler_test("mptimer/reload scaler",
> + scale, test_timer_reload);
> + add_scaler_test("mptimer/periodic scaler",
> + scale, test_timer_periodic);
> + add_scaler_test("mptimer/oneshot_to_periodic scaler",
> + scale, test_timer_oneshot_to_periodic);
> + add_scaler_test("mptimer/periodic_to_oneshot scaler",
> + scale, test_timer_periodic_to_oneshot);
> + add_scaler_test("mptimer/set_oneshot_counter_to_0 scaler",
> + scale, test_timer_set_oneshot_counter_to_0);
> + add_scaler_test("mptimer/set_periodic_counter_to_0 scaler",
> + scale, test_timer_set_periodic_counter_to_0);
> + add_scaler_test("mptimer/noload_oneshot scaler",
> + scale, test_timer_noload_oneshot);
> + add_scaler_test("mptimer/noload_periodic scaler",
> + scale, test_timer_noload_periodic);
> + add_scaler_test("mptimer/zero_load_oneshot scaler",
> + scale, test_timer_zero_load_oneshot);
> + add_scaler_test("mptimer/zero_load_periodic scaler",
> + scale, test_timer_zero_load_periodic);
> + add_scaler_test("mptimer/zero_load_oneshot_to_nonzero scaler",
> + scale, test_timer_zero_load_oneshot_to_nonzero);
> + add_scaler_test("mptimer/zero_load_periodic_to_nonzero scaler",
> + scale, test_timer_zero_load_periodic_to_nonzero);
> + add_scaler_test("mptimer/nonzero_load_oneshot_to_zero scaler",
> + scale, test_timer_nonzero_load_oneshot_to_zero);
> + add_scaler_test("mptimer/nonzero_load_periodic_to_zero scaler",
> + scale, test_timer_nonzero_load_periodic_to_zero);
> + add_scaler_test("mptimer/set_periodic_counter_on_the_fly scaler",
> + scale, test_timer_set_periodic_counter_on_the_fly);
> + add_scaler_test("mptimer/enable_and_set_counter scaler",
> + scale, test_timer_enable_and_set_counter);
> + add_scaler_test("mptimer/set_counter_and_enable scaler",
> + scale, test_timer_set_counter_and_enable);
> + add_scaler_test("mptimer/oneshot_with_counter_0_on_start scaler",
> + scale, test_timer_oneshot_with_counter_0_on_start);
> + add_scaler_test("mptimer/periodic_with_counter_0_on_start scaler",
> + scale, test_timer_periodic_with_counter_0_on_start);
> + add_scaler_test("mptimer/periodic_counter scaler",
> + scale, test_periodic_counter);
> + add_scaler_test("mptimer/set_counter_periodic_with_zero_load scaler",
> + scale, test_timer_set_counter_periodic_with_zero_load);
> + add_scaler_test("mptimer/set_oneshot_load_to_0 scaler",
> + scale, test_timer_set_oneshot_load_to_0);
> + add_scaler_test("mptimer/set_periodic_load_to_0 scaler",
> + scale, test_timer_set_periodic_load_to_0);
> + add_scaler_test("mptimer/zero_load_mode_switch scaler",
> + scale, test_timer_zero_load_mode_switch);
> }
>
> qtest_start("-machine vexpress-a9");
>
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2018-12-04 17:10 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-04 13:29 [Qemu-devel] [PATCH 0/5] arm: five simple memory leak fixes Peter Maydell
2018-12-04 13:29 ` [Qemu-devel] [PATCH 1/5] target/arm: Free name string in ARMCPRegInfo hashtable entries Peter Maydell
2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:25 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 2/5] hw/arm/mps2-tz.c: Free mscname string in make_dma() Peter Maydell
2018-12-04 13:57 ` Richard Henderson
2018-12-04 14:26 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 3/5] hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() Peter Maydell
2018-12-04 13:58 ` Richard Henderson
2018-12-04 14:29 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 4/5] tests/test-arm-mptimer: Don't leak string memory Peter Maydell
2018-12-04 14:00 ` Richard Henderson
2018-12-04 17:08 ` Philippe Mathieu-Daudé
2018-12-04 13:29 ` [Qemu-devel] [PATCH 5/5] target/arm: Create timers in realize, not init Peter Maydell
2018-12-04 14:01 ` Richard Henderson
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).