[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [PATCH 02/13] pseries: Split device tree construction fro
From: |
David Gibson |
Subject: |
Re: [Qemu-ppc] [PATCH 02/13] pseries: Split device tree construction from device tree load |
Date: |
Fri, 21 Oct 2016 12:24:20 +1100 |
User-agent: |
Mutt/1.7.0 (2016-08-17) |
On Thu, Oct 20, 2016 at 09:03:04AM +0200, Thomas Huth wrote:
> On 20.10.2016 07:11, David Gibson wrote:
> > spapr_finalize_fdt() both finishes building the device tree for the guest
> > and loads it into guest memory. For future cleanups, it's going to be
> > more convenient to do these two things separately. The loading portion is
> > pretty trivial, so we move it inline into the caller, ppc_spapr_reset().
> >
> > We also rename spapr_finalize_fdt(), because the current name is going to
> > become inaccurate.
> >
> > Signed-off-by: David Gibson <address@hidden>
> > ---
> > hw/ppc/spapr.c | 41 ++++++++++++++++++++++-------------------
> > 1 file changed, 22 insertions(+), 19 deletions(-)
> >
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index ddb7438..7ff3590 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -900,10 +900,9 @@ int spapr_h_cas_compose_response(sPAPRMachineState
> > *spapr,
> > return 0;
> > }
> >
> > -static void spapr_finalize_fdt(sPAPRMachineState *spapr,
> > - hwaddr fdt_addr,
> > - hwaddr rtas_addr,
> > - hwaddr rtas_size)
> > +static void *spapr_build_fdt(sPAPRMachineState *spapr,
> > + hwaddr rtas_addr,
> > + hwaddr rtas_size)
> > {
> > MachineState *machine = MACHINE(qdev_get_machine());
> > MachineClass *mc = MACHINE_GET_CLASS(machine);
> > @@ -999,19 +998,8 @@ static void spapr_finalize_fdt(sPAPRMachineState
> > *spapr,
> > }
> > }
> >
> > - _FDT((fdt_pack(fdt)));
> > -
> > - if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
> > - error_report("FDT too big ! 0x%x bytes (max is 0x%x)",
> > - fdt_totalsize(fdt), FDT_MAX_SIZE);
> > - exit(1);
> > - }
> > -
> > - qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
> > - cpu_physical_memory_write(fdt_addr, fdt, fdt_totalsize(fdt));
> > -
> > g_free(bootlist);
> > - g_free(fdt);
>
> Here you removed a g_free(fdt) ...
>
> > + return fdt;
> > }
> >
> > static uint64_t translate_kernel_address(void *opaque, uint64_t addr)
> > @@ -1147,6 +1135,8 @@ static void ppc_spapr_reset(void)
> > sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
> > PowerPCCPU *first_ppc_cpu;
> > uint32_t rtas_limit;
> > + void *fdt;
> > + int rc;
> >
> > /* Check for unknown sysbus devices */
> > foreach_dynamic_sysbus_device(find_unknown_sysbus_device, NULL);
> > @@ -1173,14 +1163,27 @@ static void ppc_spapr_reset(void)
> > spapr->rtas_addr = rtas_limit - RTAS_MAX_SIZE;
> > spapr->fdt_addr = spapr->rtas_addr - FDT_MAX_SIZE;
> >
> > - /* Load the fdt */
> > - spapr_finalize_fdt(spapr, spapr->fdt_addr, spapr->rtas_addr,
> > - spapr->rtas_size);
> > + fdt = spapr_build_fdt(spapr, spapr->rtas_addr, spapr->rtas_size);
> >
> > /* Copy RTAS over */
> > cpu_physical_memory_write(spapr->rtas_addr, spapr->rtas_blob,
> > spapr->rtas_size);
> >
> > + rc = fdt_pack(fdt);
> > +
> > + /* Should only fail if we've built a corrupted tree */
> > + assert(rc == 0);
> > +
> > + if (fdt_totalsize(fdt) > FDT_MAX_SIZE) {
> > + error_report("FDT too big ! 0x%x bytes (max is 0x%x)",
> > + fdt_totalsize(fdt), FDT_MAX_SIZE);
> > + exit(1);
> > + }
> > +
> > + /* Load the fdt */
> > + qemu_fdt_dumpdtb(fdt, fdt_totalsize(fdt));
> > + cpu_physical_memory_write(spapr->fdt_addr, fdt, fdt_totalsize(fdt));
> > +
>
> ... but you did not add a g_free(fdt) here. Is this a memory leak?
Yes it is. Thanks for the catch.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature
- [Qemu-ppc] [PATCH 00/13] pseries: Consolidate guest device tree construction, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 01/13] pseries: Remove unused callbacks from sPAPR VIO bus state, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 03/13] pseries: Remove rtas_addr and fdt_addr fields from machinestate, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 02/13] pseries: Split device tree construction from device tree load, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 06/13] pseries: Consolidate RTAS loading, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 04/13] pseries: Make spapr_create_fdt_skel() get information from machine state, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 05/13] pseries: Move adding of fdt reserve map entries, David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 10/13] spapr: Move /event-sources construction to spapr_build_fdt(), David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 13/13] spapr: Remove spapr_create_fdt_skel(), David Gibson, 2016/10/20
- [Qemu-ppc] [PATCH 11/13] spapr: Move /hypervisor node construction to fdt_build_fdt(), David Gibson, 2016/10/20