Hi Igor,

On Tue, Mar 3, 2020 at 10:13 AM Igor Mammedov <imamm...@redhat.com> wrote:

> SOC object returned by object_new() is leaked in current code.
> Set SOC parent explicitly to board and then unref to SOC object
> to make sure that refererence returned by object_new() is taken
> care of.
>
> The SOC object will be kept alive by its parent (machine) and
> will be automatically freed when MachineState is destroyed.
>

Thanks for reporting this issue. In the Allwinner H3 series, I actually
inherited this pattern as well,
so I'll include this fix as well in the next version of that series.


>
> Signed-off-by: Igor Mammedov <imamm...@redhat.com>
> Reported-by: Andrew Jones <drjo...@redhat.com>
> ---
>  hw/arm/cubieboard.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
> index 089f9a30c1..12f8ac798d 100644
> --- a/hw/arm/cubieboard.c
> +++ b/hw/arm/cubieboard.c
> @@ -30,9 +30,14 @@ static struct arm_boot_info cubieboard_binfo = {
>
>  static void cubieboard_init(MachineState *machine)
>  {
> -    AwA10State *a10 = AW_A10(object_new(TYPE_AW_A10));
> +    AwA10State *a10;
>      Error *err = NULL;
>
> +    a10 = AW_A10(object_new(TYPE_AW_A10));
> +    object_property_add_child(OBJECT(machine), "soc", OBJECT(a10),
> +                              &error_abort);
> +    object_unref(OBJECT(a10));
>

I see that there are a few machines which also do
object_property_add_child() to add its
SoC object to the machine, but they do not do the object_unref(). Can you
explain why it is needed here?
Or do the other machines still have a leak due to the missing
object_unref()? Examples are:
  hw/arm/sabrelite.c
  hw/arm/mcimx7d-sabre.c
  hw/arm/mcimx6ul-evk.c

Regards,
Niek


> +
>      object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
>      if (err != NULL) {
>          error_reportf_err(err, "Couldn't set phy address: ");
> --
> 2.18.1
>
>
>

-- 
Niek Linnenbank

Reply via email to