mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-18 10:35:20 +00:00
qemu: Correct CPU capabilities probing for hvf
With this change virsh domcapabilites shows: <mode name='host-passthrough' supported='yes'/> https://gitlab.com/libvirt/libvirt/-/issues/147 Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com> Signed-off-by: Andrea Bolognani <abologna@redhat.com> Tested-by: Brad Laue <brad@brad-x.com> Tested-by: Christophe Fergeau <cfergeau@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
6b94f4d1b1
commit
244542f3bf
@ -745,6 +745,7 @@ struct _virQEMUCaps {
|
|||||||
|
|
||||||
/* Capabilities which may differ depending on the accelerator. */
|
/* Capabilities which may differ depending on the accelerator. */
|
||||||
virQEMUCapsAccel kvm;
|
virQEMUCapsAccel kvm;
|
||||||
|
virQEMUCapsAccel hvf;
|
||||||
virQEMUCapsAccel tcg;
|
virQEMUCapsAccel tcg;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -849,7 +850,8 @@ virQEMUCapsTypeIsAccelerated(virDomainVirtType type)
|
|||||||
static bool
|
static bool
|
||||||
virQEMUCapsHaveAccel(virQEMUCaps *qemuCaps)
|
virQEMUCapsHaveAccel(virQEMUCaps *qemuCaps)
|
||||||
{
|
{
|
||||||
return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM);
|
return virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) ||
|
||||||
|
virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -858,6 +860,8 @@ virQEMUCapsAccelStr(virDomainVirtType type)
|
|||||||
{
|
{
|
||||||
if (type == VIR_DOMAIN_VIRT_KVM)
|
if (type == VIR_DOMAIN_VIRT_KVM)
|
||||||
return "kvm";
|
return "kvm";
|
||||||
|
else if (type == VIR_DOMAIN_VIRT_HVF)
|
||||||
|
return "hvf";
|
||||||
|
|
||||||
return "tcg";
|
return "tcg";
|
||||||
}
|
}
|
||||||
@ -869,6 +873,8 @@ virQEMUCapsGetAccel(virQEMUCaps *qemuCaps,
|
|||||||
{
|
{
|
||||||
if (type == VIR_DOMAIN_VIRT_KVM)
|
if (type == VIR_DOMAIN_VIRT_KVM)
|
||||||
return &qemuCaps->kvm;
|
return &qemuCaps->kvm;
|
||||||
|
else if (type == VIR_DOMAIN_VIRT_HVF)
|
||||||
|
return &qemuCaps->hvf;
|
||||||
|
|
||||||
return &qemuCaps->tcg;
|
return &qemuCaps->tcg;
|
||||||
}
|
}
|
||||||
@ -999,6 +1005,8 @@ virQEMUCapsGetMachineTypesCaps(virQEMUCaps *qemuCaps,
|
|||||||
* take the set of machine types we probed first. */
|
* take the set of machine types we probed first. */
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
accel = &qemuCaps->kvm;
|
accel = &qemuCaps->kvm;
|
||||||
|
else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
accel = &qemuCaps->hvf;
|
||||||
else
|
else
|
||||||
accel = &qemuCaps->tcg;
|
accel = &qemuCaps->tcg;
|
||||||
|
|
||||||
@ -2013,6 +2021,7 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps)
|
|||||||
ret->cpuData = virCPUDataNewCopy(qemuCaps->cpuData);
|
ret->cpuData = virCPUDataNewCopy(qemuCaps->cpuData);
|
||||||
|
|
||||||
if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 ||
|
if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 ||
|
||||||
|
virQEMUCapsAccelCopy(&ret->hvf, &qemuCaps->hvf) < 0 ||
|
||||||
virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0)
|
virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -2066,6 +2075,7 @@ void virQEMUCapsDispose(void *obj)
|
|||||||
virSEVCapabilitiesFree(qemuCaps->sevCapabilities);
|
virSEVCapabilitiesFree(qemuCaps->sevCapabilities);
|
||||||
|
|
||||||
virQEMUCapsAccelClear(&qemuCaps->kvm);
|
virQEMUCapsAccelClear(&qemuCaps->kvm);
|
||||||
|
virQEMUCapsAccelClear(&qemuCaps->hvf);
|
||||||
virQEMUCapsAccelClear(&qemuCaps->tcg);
|
virQEMUCapsAccelClear(&qemuCaps->tcg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2317,6 +2327,10 @@ virQEMUCapsIsVirtTypeSupported(virQEMUCaps *qemuCaps,
|
|||||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG))
|
virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
if (virtType == VIR_DOMAIN_VIRT_HVF &&
|
||||||
|
virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
return true;
|
||||||
|
|
||||||
if (virtType == VIR_DOMAIN_VIRT_KVM &&
|
if (virtType == VIR_DOMAIN_VIRT_KVM &&
|
||||||
virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
return true;
|
return true;
|
||||||
@ -2794,7 +2808,9 @@ bool
|
|||||||
virQEMUCapsHasMachines(virQEMUCaps *qemuCaps)
|
virQEMUCapsHasMachines(virQEMUCaps *qemuCaps)
|
||||||
{
|
{
|
||||||
|
|
||||||
return !!qemuCaps->kvm.nmachineTypes || !!qemuCaps->tcg.nmachineTypes;
|
return !!qemuCaps->kvm.nmachineTypes ||
|
||||||
|
!!qemuCaps->hvf.nmachineTypes ||
|
||||||
|
!!qemuCaps->tcg.nmachineTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4484,6 +4500,10 @@ virQEMUCapsLoadCache(virArch hostArch,
|
|||||||
virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0) {
|
virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF) &&
|
||||||
|
virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_HVF) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
|
if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -4495,6 +4515,8 @@ virQEMUCapsLoadCache(virArch hostArch,
|
|||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM);
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM);
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HVF);
|
||||||
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU);
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU);
|
||||||
|
|
||||||
if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0)
|
if (virXPathBoolean("boolean(./kvmSupportsNesting)", ctxt) > 0)
|
||||||
@ -4729,6 +4751,8 @@ virQEMUCapsFormatCache(virQEMUCaps *qemuCaps)
|
|||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM);
|
virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM);
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_HVF);
|
||||||
virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU);
|
virQEMUCapsFormatAccel(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU);
|
||||||
|
|
||||||
for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
|
for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
|
||||||
@ -5351,6 +5375,9 @@ virQEMUCapsGetVirtType(virQEMUCaps *qemuCaps)
|
|||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
return VIR_DOMAIN_VIRT_KVM;
|
return VIR_DOMAIN_VIRT_KVM;
|
||||||
|
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
return VIR_DOMAIN_VIRT_HVF;
|
||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_TCG))
|
||||||
return VIR_DOMAIN_VIRT_QEMU;
|
return VIR_DOMAIN_VIRT_QEMU;
|
||||||
|
|
||||||
@ -5589,6 +5616,8 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
|
|||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
|
||||||
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM);
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM);
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_HVF))
|
||||||
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_HVF);
|
||||||
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU);
|
virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU);
|
||||||
|
|
||||||
if (virQEMUCapsHaveAccel(qemuCaps)) {
|
if (virQEMUCapsHaveAccel(qemuCaps)) {
|
||||||
@ -6583,5 +6612,6 @@ void
|
|||||||
virQEMUCapsStripMachineAliases(virQEMUCaps *qemuCaps)
|
virQEMUCapsStripMachineAliases(virQEMUCaps *qemuCaps)
|
||||||
{
|
{
|
||||||
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_KVM);
|
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_KVM);
|
||||||
|
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_HVF);
|
||||||
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_QEMU);
|
virQEMUCapsStripMachineAliasesForVirtType(qemuCaps, VIR_DOMAIN_VIRT_QEMU);
|
||||||
}
|
}
|
||||||
|
@ -9241,6 +9241,8 @@ qemuProcessQMPInit(qemuProcessQMP *proc)
|
|||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
# define hwaccel "kvm:tcg"
|
# define hwaccel "kvm:tcg"
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# define hwaccel "hvf:tcg"
|
||||||
#else
|
#else
|
||||||
# define hwaccel "tcg"
|
# define hwaccel "tcg"
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user