[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: |
Thomas Huth |
Subject: |
Re: [Qemu-ppc] [PATCH 02/13] pseries: Split device tree construction from device tree load |
Date: |
Thu, 20 Oct 2016 09:03:04 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 |
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?
Thomas
- [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
- Re: [Qemu-ppc] [PATCH 02/13] pseries: Split device tree construction from device tree load,
Thomas Huth <=
- [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