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
# include <unistd.h>
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"
2012-01-10 21:31:21 +04:00
int virHostValidateQEMU ( void )
{
2016-03-29 17:38:28 +03:00
virBitmapPtr flags ;
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 ( ) ;
2016-06-14 08:02:45 +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 ;
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 ;
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 ,
_ ( " Only emulated CPUs are available, performance will be significantly limited " ) ) ;
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 ,
_ ( " 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 ;
}
2016-03-29 17:38:28 +03:00
virBitmapFree ( flags ) ;
2015-10-07 19:02:31 +03:00
if ( virHostValidateDeviceExists ( " QEMU " , " /dev/vhost-net " ,
VIR_HOST_VALIDATE_WARN ,
_ ( " 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 ;
2015-10-07 19:36:37 +03:00
if ( virHostValidateCGroupController ( " QEMU " , " memory " ,
VIR_HOST_VALIDATE_WARN ,
" MEMCG " ) < 0 )
ret = - 1 ;
if ( virHostValidateCGroupController ( " QEMU " , " cpu " ,
VIR_HOST_VALIDATE_WARN ,
" CGROUP_CPU " ) < 0 )
ret = - 1 ;
if ( virHostValidateCGroupController ( " QEMU " , " cpuacct " ,
VIR_HOST_VALIDATE_WARN ,
" CGROUP_CPUACCT " ) < 0 )
ret = - 1 ;
2016-01-24 17:11:32 +03:00
if ( virHostValidateCGroupController ( " QEMU " , " cpuset " ,
2015-10-07 19:36:37 +03:00
VIR_HOST_VALIDATE_WARN ,
2016-01-24 17:11:32 +03:00
" CPUSETS " ) < 0 )
2015-10-07 19:36:37 +03:00
ret = - 1 ;
2016-01-24 17:11:32 +03:00
if ( virHostValidateCGroupController ( " QEMU " , " devices " ,
2015-10-07 19:36:37 +03:00
VIR_HOST_VALIDATE_WARN ,
2016-01-24 17:11:32 +03:00
" CGROUP_DEVICES " ) < 0 )
2015-10-07 19:36:37 +03:00
ret = - 1 ;
if ( virHostValidateCGroupController ( " QEMU " , " blkio " ,
VIR_HOST_VALIDATE_WARN ,
" BLK_CGROUP " ) < 0 )
ret = - 1 ;
2015-10-07 19:46:18 +03:00
if ( virHostValidateIOMMU ( " QEMU " ,
VIR_HOST_VALIDATE_WARN ) < 0 )
ret = - 1 ;
2012-01-10 21:31:21 +04:00
return ret ;
}