Add support for generating QEMU command line with PCI high memory MMIO size:
- Add highmem-mmio-size to machine command line generation using
size conveyed through pcihole64
- Add validation for aarch64/virt machine type requirement
- Add capability check for QEMU support
This enables configuring the PCI high memory MMIO window size
for aarch64 virt machine types using the existing pcihole64
element.
Signed-off-by: Matthew R. Ochs <mochs@nvidia.com>
---
src/qemu/qemu_command.c | 14 +++++++++++++-
src/qemu/qemu_validate.c | 8 ++++++--
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index e6d308534f87..1386b2772a55 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6195,7 +6195,8 @@ qemuBuildGlobalControllerCommandLine(virCommand *cmd,
for (i = 0; i < def->ncontrollers; i++) {
virDomainControllerDef *cont = def->controllers[i];
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
- cont->opts.pciopts.pcihole64) {
+ cont->opts.pciopts.pcihole64 &&
+ !qemuDomainIsARMVirt(def)) {
const char *hoststr = NULL;
switch (cont->model) {
@@ -7112,6 +7113,17 @@ qemuBuildMachineCommandLine(virCommand *cmd,
qemuBuildMachineACPI(&buf, def, qemuCaps);
+ if (qemuDomainIsARMVirt(def)) {
+ for (i = 0; i < def->ncontrollers; i++) {
+ virDomainControllerDef *cont = def->controllers[i];
+ if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
+ cont->opts.pciopts.pcihole64) {
+ virBufferAsprintf(&buf, ",highmem-mmio-size=%lluK", cont->opts.pciopts.pcihole64size);
+ break;
+ }
+ }
+ }
+
virCommandAddArgBuffer(cmd, &buf);
return 0;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index b2c3c9e2f631..f808aac1063a 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -4074,7 +4074,9 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont,
switch ((virDomainControllerModelPCI) cont->model) {
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT:
if (pciopts->pcihole64 || pciopts->pcihole64size != 0) {
- if (!qemuDomainIsI440FX(def)) {
+ if (!qemuDomainIsI440FX(def) &&
+ !(qemuDomainIsARMVirt(def) && virQEMUCapsGet(qemuCaps,
+ QEMU_CAPS_MACHINE_VIRT_HIGHMEM_MMIO_SIZE))) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Setting the 64-bit PCI hole size is not supported for machine '%1$s'"),
def->os.machine);
@@ -4085,7 +4087,9 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont,
case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT:
if (pciopts->pcihole64 || pciopts->pcihole64size != 0) {
- if (!qemuDomainIsQ35(def)) {
+ if (!qemuDomainIsQ35(def) &&
+ !(qemuDomainIsARMVirt(def) && virQEMUCapsGet(qemuCaps,
+ QEMU_CAPS_MACHINE_VIRT_HIGHMEM_MMIO_SIZE))) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Setting the 64-bit PCI hole size is not supported for machine '%1$s'"),
def->os.machine);
--
2.46.0
On Wed, May 14, 2025 at 05:18:50PM -0700, Matthew R. Ochs wrote: > Add support for generating QEMU command line with PCI high memory MMIO size: > - Add highmem-mmio-size to machine command line generation using > size conveyed through pcihole64 > - Add validation for aarch64/virt machine type requirement > - Add capability check for QEMU support > > This enables configuring the PCI high memory MMIO window size > for aarch64 virt machine types using the existing pcihole64 > element. > > Signed-off-by: Matthew R. Ochs <mochs@nvidia.com> > --- > src/qemu/qemu_command.c | 14 +++++++++++++- > src/qemu/qemu_validate.c | 8 ++++++-- > 2 files changed, 19 insertions(+), 3 deletions(-) > > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index e6d308534f87..1386b2772a55 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -6195,7 +6195,8 @@ qemuBuildGlobalControllerCommandLine(virCommand *cmd, > for (i = 0; i < def->ncontrollers; i++) { > virDomainControllerDef *cont = def->controllers[i]; > if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && > - cont->opts.pciopts.pcihole64) { > + cont->opts.pciopts.pcihole64 && > + !qemuDomainIsARMVirt(def)) { This ought to be a positive check ..IsQ35(..) || ..IsI440FX(..) > const char *hoststr = NULL; > > switch (cont->model) { > @@ -7112,6 +7113,17 @@ qemuBuildMachineCommandLine(virCommand *cmd, > > qemuBuildMachineACPI(&buf, def, qemuCaps); > > + if (qemuDomainIsARMVirt(def)) { > + for (i = 0; i < def->ncontrollers; i++) { > + virDomainControllerDef *cont = def->controllers[i]; > + if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && > + cont->opts.pciopts.pcihole64) { > + virBufferAsprintf(&buf, ",highmem-mmio-size=%lluK", cont->opts.pciopts.pcihole64size); > + break; > + } > + } > + } > + > virCommandAddArgBuffer(cmd, &buf); > > return 0; > diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c > index b2c3c9e2f631..f808aac1063a 100644 > --- a/src/qemu/qemu_validate.c > +++ b/src/qemu/qemu_validate.c > @@ -4074,7 +4074,9 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont, > switch ((virDomainControllerModelPCI) cont->model) { > case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: > if (pciopts->pcihole64 || pciopts->pcihole64size != 0) { > - if (!qemuDomainIsI440FX(def)) { > + if (!qemuDomainIsI440FX(def) && > + !(qemuDomainIsARMVirt(def) && virQEMUCapsGet(qemuCaps, > + QEMU_CAPS_MACHINE_VIRT_HIGHMEM_MMIO_SIZE))) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > _("Setting the 64-bit PCI hole size is not supported for machine '%1$s'"), > def->os.machine); IIUC arm virt machine is always PCI-E, so we shouldn't allow it for arm here. > @@ -4085,7 +4087,9 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont, > > case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: > if (pciopts->pcihole64 || pciopts->pcihole64size != 0) { > - if (!qemuDomainIsQ35(def)) { > + if (!qemuDomainIsQ35(def) && > + !(qemuDomainIsARMVirt(def) && virQEMUCapsGet(qemuCaps, > + QEMU_CAPS_MACHINE_VIRT_HIGHMEM_MMIO_SIZE))) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, > _("Setting the 64-bit PCI hole size is not supported for machine '%1$s'"), > def->os.machine); > -- > 2.46.0 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
> On May 15, 2025, at 6:54 AM, Daniel P. Berrangé <berrange@redhat.com> wrote: > On Wed, May 14, 2025 at 05:18:50PM -0700, Matthew R. Ochs wrote: >> Add support for generating QEMU command line with PCI high memory MMIO size: >> - Add highmem-mmio-size to machine command line generation using >> size conveyed through pcihole64 >> - Add validation for aarch64/virt machine type requirement >> - Add capability check for QEMU support >> >> This enables configuring the PCI high memory MMIO window size >> for aarch64 virt machine types using the existing pcihole64 >> element. >> >> Signed-off-by: Matthew R. Ochs <mochs@nvidia.com> >> --- >> src/qemu/qemu_command.c | 14 +++++++++++++- >> src/qemu/qemu_validate.c | 8 ++++++-- >> 2 files changed, 19 insertions(+), 3 deletions(-) >> >> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c >> index e6d308534f87..1386b2772a55 100644 >> --- a/src/qemu/qemu_command.c >> +++ b/src/qemu/qemu_command.c >> @@ -6195,7 +6195,8 @@ qemuBuildGlobalControllerCommandLine(virCommand *cmd, >> for (i = 0; i < def->ncontrollers; i++) { >> virDomainControllerDef *cont = def->controllers[i]; >> if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI && >> - cont->opts.pciopts.pcihole64) { >> + cont->opts.pciopts.pcihole64 && >> + !qemuDomainIsARMVirt(def)) { > > This ought to be a positive check > > ..IsQ35(..) || ..IsI440FX(..) Makes sense, will fix in v3. >> >> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c >> index b2c3c9e2f631..f808aac1063a 100644 >> --- a/src/qemu/qemu_validate.c >> +++ b/src/qemu/qemu_validate.c >> @@ -4074,7 +4074,9 @@ qemuValidateDomainDeviceDefControllerPCI(const virDomainControllerDef *cont, >> switch ((virDomainControllerModelPCI) cont->model) { >> case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: >> if (pciopts->pcihole64 || pciopts->pcihole64size != 0) { >> - if (!qemuDomainIsI440FX(def)) { >> + if (!qemuDomainIsI440FX(def) && >> + !(qemuDomainIsARMVirt(def) && virQEMUCapsGet(qemuCaps, >> + QEMU_CAPS_MACHINE_VIRT_HIGHMEM_MMIO_SIZE))) { >> virReportError(VIR_ERR_CONFIG_UNSUPPORTED, >> _("Setting the 64-bit PCI hole size is not supported for machine '%1$s'"), >> def->os.machine); > > IIUC arm virt machine is always PCI-E, so we shouldn't allow it > for arm here. Yep, will remove this change in v3.
© 2016 - 2025 Red Hat, Inc.