2012-01-10 17:31:21 +00:00
/*
* virt - host - validate - qemu . c : Sanity check a QEMU hypervisor host
*
* Copyright ( C ) 2012 Red Hat , Inc .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
2012-09-20 22:30:55 +00:00
* License along with this library . If not , see
2012-07-21 10:06:23 +00:00
* < http : //www.gnu.org/licenses/>.
2012-01-10 17:31:21 +00:00
*
*/
# include <config.h>
2015-10-07 16:46:18 +00:00
2012-01-10 17:31:21 +00:00
# include "virt-host-validate-qemu.h"
# include "virt-host-validate-common.h"
2016-05-03 06:10:54 +00:00
# include "virarch.h"
2016-03-29 14:38:28 +00:00
# include "virbitmap.h"
2018-09-29 19:37:22 +00:00
# include "vircgroup.h"
2012-01-10 17:31:21 +00:00
int virHostValidateQEMU ( void )
{
2021-12-07 15:34:00 +00:00
g_autoptr ( virBitmap ) flags = NULL ;
2012-01-10 17:31:21 +00:00
int ret = 0 ;
2016-05-03 06:10:54 +00:00
bool hasHwVirt = false ;
2016-06-03 12:53:58 +00:00
bool hasVirtFlag = false ;
2018-02-14 09:43:59 +00:00
virArch arch = virArchFromHost ( ) ;
2023-08-24 15:04:34 +00:00
const char * kvmhint = _ ( " Check that CPU and firmware supports virtualization and kvm module is loaded " ) ;
2016-03-29 14:38:28 +00:00
2016-05-03 06:10:53 +00:00
if ( ! ( flags = virHostValidateGetCPUFlags ( ) ) )
return - 1 ;
2016-03-29 14:38:28 +00:00
2018-02-14 09:43:59 +00:00
switch ( ( int ) arch ) {
2016-05-03 06:10:54 +00:00
case VIR_ARCH_I686 :
case VIR_ARCH_X86_64 :
2016-06-03 12:53:58 +00:00
hasVirtFlag = true ;
2023-08-24 15:04:34 +00:00
kvmhint = _ ( " Check that the 'kvm-intel' or 'kvm-amd' modules are loaded & the BIOS has enabled virtualization " ) ;
2016-05-03 06:10:54 +00:00
if ( virBitmapIsBitSet ( flags , VIR_HOST_VALIDATE_CPU_FLAG_SVM ) | |
virBitmapIsBitSet ( flags , VIR_HOST_VALIDATE_CPU_FLAG_VMX ) )
hasHwVirt = true ;
break ;
case VIR_ARCH_S390 :
case VIR_ARCH_S390X :
2016-06-03 12:53:58 +00:00
hasVirtFlag = true ;
2016-05-03 06:10:54 +00:00
if ( virBitmapIsBitSet ( flags , VIR_HOST_VALIDATE_CPU_FLAG_SIE ) )
hasHwVirt = true ;
break ;
2020-03-13 17:48:03 +00:00
case VIR_ARCH_PPC64 :
case VIR_ARCH_PPC64LE :
hasVirtFlag = true ;
hasHwVirt = true ;
break ;
2016-05-03 06:10:54 +00:00
default :
hasHwVirt = false ;
}
2016-06-03 12:53:58 +00:00
if ( hasVirtFlag ) {
2024-06-06 16:07:24 +00:00
virValidateCheck ( " QEMU " , " %s " , _ ( " Checking for hardware virtualization " ) ) ;
2016-06-03 12:53:58 +00:00
if ( hasHwVirt ) {
2024-06-06 16:07:24 +00:00
virValidatePass ( ) ;
2016-06-03 12:53:58 +00:00
} else {
2024-06-06 16:07:24 +00:00
virValidateFail ( VIR_VALIDATE_FAIL ,
_ ( " Host not compatible with KVM; HW virtualization CPU features not found. Only emulated CPUs are available; performance will be significantly limited " ) ) ;
2016-06-03 12:53:58 +00:00
ret = - 1 ;
}
}
if ( hasHwVirt | | ! hasVirtFlag ) {
2015-10-07 16:02:31 +00:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/kvm " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_FAIL ,
2016-06-03 12:53:58 +00:00
kvmhint ) < 0 )
2015-10-07 16:02:31 +00:00
ret = - 1 ;
else if ( virHostValidateDeviceAccessible ( " QEMU " , " /dev/kvm " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_FAIL ,
2023-08-24 15:04:34 +00:00
_ ( " Check /dev/kvm is world writable or you are in a group that is allowed to access it " ) ) < 0 )
2012-01-10 17:31:21 +00:00
ret = - 1 ;
}
2020-03-13 17:48:03 +00:00
if ( arch = = VIR_ARCH_PPC64 | | arch = = VIR_ARCH_PPC64LE ) {
2024-06-06 16:07:24 +00:00
virValidateCheck ( " QEMU " , " %s " , _ ( " Checking for PowerPC KVM module loaded " ) ) ;
2020-03-13 17:48:03 +00:00
if ( ! virHostKernelModuleIsLoaded ( " kvm_hv " ) )
2024-06-06 16:07:24 +00:00
virValidateFail ( VIR_VALIDATE_WARN ,
_ ( " Load kvm_hv for better performance " ) ) ;
2020-03-13 17:48:03 +00:00
else
2024-06-06 16:07:24 +00:00
virValidatePass ( ) ;
2020-03-13 17:48:03 +00:00
}
2015-10-07 16:02:31 +00:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/vhost-net " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_WARN ,
2023-08-24 15:04:34 +00:00
_ ( " Load the 'vhost_net' module to improve performance of virtio networking " ) ) < 0 )
2012-01-10 17:31:21 +00:00
ret = - 1 ;
2015-10-07 16:02:31 +00:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/net/tun " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_FAIL ,
2015-10-07 16:02:31 +00:00
_ ( " Load the 'tun' module to enable networking for QEMU guests " ) ) < 0 )
2012-01-10 17:31:21 +00:00
ret = - 1 ;
2018-09-29 19:37:22 +00:00
if ( virHostValidateCGroupControllers ( " QEMU " ,
( 1 < < VIR_CGROUP_CONTROLLER_MEMORY ) |
( 1 < < VIR_CGROUP_CONTROLLER_CPU ) |
( 1 < < VIR_CGROUP_CONTROLLER_CPUACCT ) |
( 1 < < VIR_CGROUP_CONTROLLER_CPUSET ) |
( 1 < < VIR_CGROUP_CONTROLLER_DEVICES ) |
( 1 < < VIR_CGROUP_CONTROLLER_BLKIO ) ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_WARN ) < 0 ) {
2015-10-07 16:36:37 +00:00
ret = - 1 ;
2018-09-29 19:37:22 +00:00
}
2015-10-07 16:36:37 +00:00
2015-10-07 16:46:18 +00:00
if ( virHostValidateIOMMU ( " QEMU " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_WARN ) < 0 )
2015-10-07 16:46:18 +00:00
ret = - 1 ;
2020-06-15 08:28:09 +00:00
if ( virHostValidateSecureGuests ( " QEMU " ,
2024-06-06 16:07:24 +00:00
VIR_VALIDATE_WARN ) < 0 )
2020-06-15 08:28:09 +00:00
ret = - 1 ;
2012-01-10 17:31:21 +00:00
return ret ;
}