2012-01-10 21:31:21 +04: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-21 02:30:55 +04:00
* License along with this library . If not , see
2012-07-21 14:06:23 +04:00
* < http : //www.gnu.org/licenses/>.
2012-01-10 21:31:21 +04:00
*
*/
# include <config.h>
2015-10-07 19:46:18 +03:00
2012-01-10 21:31:21 +04:00
# include "virt-host-validate-qemu.h"
# include "virt-host-validate-common.h"
2016-05-03 09:10:54 +03:00
# include "virarch.h"
2016-03-29 17:38:28 +03:00
# include "virbitmap.h"
2018-09-29 22:37:22 +03:00
# include "vircgroup.h"
2012-01-10 21:31:21 +04:00
int virHostValidateQEMU ( void )
{
2021-12-07 18:34:00 +03:00
g_autoptr ( virBitmap ) flags = NULL ;
2012-01-10 21:31:21 +04:00
int ret = 0 ;
2016-05-03 09:10:54 +03:00
bool hasHwVirt = false ;
2016-06-03 15:53:58 +03:00
bool hasVirtFlag = false ;
2018-02-14 12:43:59 +03:00
virArch arch = virArchFromHost ( ) ;
2023-08-24 18:04:34 +03:00
const char * kvmhint = _ ( " Check that CPU and firmware supports virtualization and kvm module is loaded " ) ;
2016-03-29 17:38:28 +03:00
2016-05-03 09:10:53 +03:00
if ( ! ( flags = virHostValidateGetCPUFlags ( ) ) )
return - 1 ;
2016-03-29 17:38:28 +03:00
2018-02-14 12:43:59 +03:00
switch ( ( int ) arch ) {
2016-05-03 09:10:54 +03:00
case VIR_ARCH_I686 :
case VIR_ARCH_X86_64 :
2016-06-03 15:53:58 +03:00
hasVirtFlag = true ;
2023-08-24 18:04:34 +03:00
kvmhint = _ ( " Check that the 'kvm-intel' or 'kvm-amd' modules are loaded & the BIOS has enabled virtualization " ) ;
2016-05-03 09:10:54 +03: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 15:53:58 +03:00
hasVirtFlag = true ;
2016-05-03 09:10:54 +03:00
if ( virBitmapIsBitSet ( flags , VIR_HOST_VALIDATE_CPU_FLAG_SIE ) )
hasHwVirt = true ;
break ;
2020-03-13 20:48:03 +03:00
case VIR_ARCH_PPC64 :
case VIR_ARCH_PPC64LE :
hasVirtFlag = true ;
hasHwVirt = true ;
break ;
2016-05-03 09:10:54 +03:00
default :
hasHwVirt = false ;
}
2016-06-03 15:53:58 +03:00
if ( hasVirtFlag ) {
virHostMsgCheck ( " QEMU " , " %s " , _ ( " for hardware virtualization " ) ) ;
if ( hasHwVirt ) {
virHostMsgPass ( ) ;
} else {
virHostMsgFail ( VIR_HOST_VALIDATE_FAIL ,
2023-08-24 18:04:34 +03:00
_ ( " Host not compatible with KVM; HW virtualization CPU features not found. Only emulated CPUs are available; performance will be significantly limited " ) ) ;
2016-06-03 15:53:58 +03:00
ret = - 1 ;
}
}
if ( hasHwVirt | | ! hasVirtFlag ) {
2015-10-07 19:02:31 +03:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/kvm " ,
VIR_HOST_VALIDATE_FAIL ,
2016-06-03 15:53:58 +03:00
kvmhint ) < 0 )
2015-10-07 19:02:31 +03:00
ret = - 1 ;
else if ( virHostValidateDeviceAccessible ( " QEMU " , " /dev/kvm " ,
VIR_HOST_VALIDATE_FAIL ,
2023-08-24 18:04:34 +03:00
_ ( " Check /dev/kvm is world writable or you are in a group that is allowed to access it " ) ) < 0 )
2012-01-10 21:31:21 +04:00
ret = - 1 ;
}
2020-03-13 20:48:03 +03:00
if ( arch = = VIR_ARCH_PPC64 | | arch = = VIR_ARCH_PPC64LE ) {
virHostMsgCheck ( " QEMU " , " %s " , _ ( " for PowerPC KVM module loaded " ) ) ;
if ( ! virHostKernelModuleIsLoaded ( " kvm_hv " ) )
virHostMsgFail ( VIR_HOST_VALIDATE_WARN ,
_ ( " Load kvm_hv for better performance " ) ) ;
else
virHostMsgPass ( ) ;
}
2015-10-07 19:02:31 +03:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/vhost-net " ,
VIR_HOST_VALIDATE_WARN ,
2023-08-24 18:04:34 +03:00
_ ( " Load the 'vhost_net' module to improve performance of virtio networking " ) ) < 0 )
2012-01-10 21:31:21 +04:00
ret = - 1 ;
2015-10-07 19:02:31 +03:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/net/tun " ,
VIR_HOST_VALIDATE_FAIL ,
_ ( " Load the 'tun' module to enable networking for QEMU guests " ) ) < 0 )
2012-01-10 21:31:21 +04:00
ret = - 1 ;
2018-09-29 22:37:22 +03: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 ) ,
VIR_HOST_VALIDATE_WARN ) < 0 ) {
2015-10-07 19:36:37 +03:00
ret = - 1 ;
2018-09-29 22:37:22 +03:00
}
2015-10-07 19:36:37 +03:00
2015-10-07 19:46:18 +03:00
if ( virHostValidateIOMMU ( " QEMU " ,
VIR_HOST_VALIDATE_WARN ) < 0 )
ret = - 1 ;
2020-06-15 11:28:09 +03:00
if ( virHostValidateSecureGuests ( " QEMU " ,
VIR_HOST_VALIDATE_WARN ) < 0 )
ret = - 1 ;
2012-01-10 21:31:21 +04:00
return ret ;
}