Message ID | 20220921231349.274049-2-gshan@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/arm/virt: Improve address assignment for high memory regions | expand |
Hi Gavin, On 9/22/22 01:13, Gavin Shan wrote: > This introduces virt_set_high_memmap() helper. The logic of high > memory region address assignment is moved to the helper. The intention > is to make the subsequent optimization for high memory region address > assignment easier. > > No functional change intended. > > Signed-off-by: Gavin Shan <gshan@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Thanks Eric > --- > hw/arm/virt.c | 74 ++++++++++++++++++++++++++++----------------------- > 1 file changed, 41 insertions(+), 33 deletions(-) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 0961e053e5..4dab528b82 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -1689,6 +1689,46 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx) > return arm_cpu_mp_affinity(idx, clustersz); > } > > +static void virt_set_high_memmap(VirtMachineState *vms, > + hwaddr base, int pa_bits) > +{ > + int i; > + > + for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) { > + hwaddr size = extended_memmap[i].size; > + bool fits; > + > + base = ROUND_UP(base, size); > + vms->memmap[i].base = base; > + vms->memmap[i].size = size; > + > + /* > + * Check each device to see if they fit in the PA space, > + * moving highest_gpa as we go. > + * > + * For each device that doesn't fit, disable it. > + */ > + fits = (base + size) <= BIT_ULL(pa_bits); > + if (fits) { > + vms->highest_gpa = base + size - 1; > + } > + > + switch (i) { > + case VIRT_HIGH_GIC_REDIST2: > + vms->highmem_redists &= fits; > + break; > + case VIRT_HIGH_PCIE_ECAM: > + vms->highmem_ecam &= fits; > + break; > + case VIRT_HIGH_PCIE_MMIO: > + vms->highmem_mmio &= fits; > + break; > + } > + > + base += size; > + } > +} > + > static void virt_set_memmap(VirtMachineState *vms, int pa_bits) > { > MachineState *ms = MACHINE(vms); > @@ -1744,39 +1784,7 @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits) > /* We know for sure that at least the memory fits in the PA space */ > vms->highest_gpa = memtop - 1; > > - for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) { > - hwaddr size = extended_memmap[i].size; > - bool fits; > - > - base = ROUND_UP(base, size); > - vms->memmap[i].base = base; > - vms->memmap[i].size = size; > - > - /* > - * Check each device to see if they fit in the PA space, > - * moving highest_gpa as we go. > - * > - * For each device that doesn't fit, disable it. > - */ > - fits = (base + size) <= BIT_ULL(pa_bits); > - if (fits) { > - vms->highest_gpa = base + size - 1; > - } > - > - switch (i) { > - case VIRT_HIGH_GIC_REDIST2: > - vms->highmem_redists &= fits; > - break; > - case VIRT_HIGH_PCIE_ECAM: > - vms->highmem_ecam &= fits; > - break; > - case VIRT_HIGH_PCIE_MMIO: > - vms->highmem_mmio &= fits; > - break; > - } > - > - base += size; > - } > + virt_set_high_memmap(vms, base, pa_bits); > > if (device_memory_size > 0) { > ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
On Thu, Sep 22 2022, Gavin Shan <gshan@redhat.com> wrote: > This introduces virt_set_high_memmap() helper. The logic of high > memory region address assignment is moved to the helper. The intention > is to make the subsequent optimization for high memory region address > assignment easier. > > No functional change intended. > > Signed-off-by: Gavin Shan <gshan@redhat.com> > --- > hw/arm/virt.c | 74 ++++++++++++++++++++++++++++----------------------- > 1 file changed, 41 insertions(+), 33 deletions(-) Reviewed-by: Cornelia Huck <cohuck@redhat.com>
diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 0961e053e5..4dab528b82 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -1689,6 +1689,46 @@ static uint64_t virt_cpu_mp_affinity(VirtMachineState *vms, int idx) return arm_cpu_mp_affinity(idx, clustersz); } +static void virt_set_high_memmap(VirtMachineState *vms, + hwaddr base, int pa_bits) +{ + int i; + + for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) { + hwaddr size = extended_memmap[i].size; + bool fits; + + base = ROUND_UP(base, size); + vms->memmap[i].base = base; + vms->memmap[i].size = size; + + /* + * Check each device to see if they fit in the PA space, + * moving highest_gpa as we go. + * + * For each device that doesn't fit, disable it. + */ + fits = (base + size) <= BIT_ULL(pa_bits); + if (fits) { + vms->highest_gpa = base + size - 1; + } + + switch (i) { + case VIRT_HIGH_GIC_REDIST2: + vms->highmem_redists &= fits; + break; + case VIRT_HIGH_PCIE_ECAM: + vms->highmem_ecam &= fits; + break; + case VIRT_HIGH_PCIE_MMIO: + vms->highmem_mmio &= fits; + break; + } + + base += size; + } +} + static void virt_set_memmap(VirtMachineState *vms, int pa_bits) { MachineState *ms = MACHINE(vms); @@ -1744,39 +1784,7 @@ static void virt_set_memmap(VirtMachineState *vms, int pa_bits) /* We know for sure that at least the memory fits in the PA space */ vms->highest_gpa = memtop - 1; - for (i = VIRT_LOWMEMMAP_LAST; i < ARRAY_SIZE(extended_memmap); i++) { - hwaddr size = extended_memmap[i].size; - bool fits; - - base = ROUND_UP(base, size); - vms->memmap[i].base = base; - vms->memmap[i].size = size; - - /* - * Check each device to see if they fit in the PA space, - * moving highest_gpa as we go. - * - * For each device that doesn't fit, disable it. - */ - fits = (base + size) <= BIT_ULL(pa_bits); - if (fits) { - vms->highest_gpa = base + size - 1; - } - - switch (i) { - case VIRT_HIGH_GIC_REDIST2: - vms->highmem_redists &= fits; - break; - case VIRT_HIGH_PCIE_ECAM: - vms->highmem_ecam &= fits; - break; - case VIRT_HIGH_PCIE_MMIO: - vms->highmem_mmio &= fits; - break; - } - - base += size; - } + virt_set_high_memmap(vms, base, pa_bits); if (device_memory_size > 0) { ms->device_memory = g_malloc0(sizeof(*ms->device_memory));
This introduces virt_set_high_memmap() helper. The logic of high memory region address assignment is moved to the helper. The intention is to make the subsequent optimization for high memory region address assignment easier. No functional change intended. Signed-off-by: Gavin Shan <gshan@redhat.com> --- hw/arm/virt.c | 74 ++++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 33 deletions(-)