From c12e3580287911a355de8bdf2fdd4c37c38d7fec Mon Sep 17 00:00:00 2001 From: Rajesh Tailor Date: Wed, 11 Apr 2018 17:11:15 +0530 Subject: [PATCH] Handle libvirt/cpu_model_extra_flags option This allows for specifying granular CPU feature flags when specifying CPU models. It should be set only if 'cpu_mode' and 'cpu_model' attributes are set and cpu_mode attribute value is set to "custom". NOTE: The related nova changes are done in change: I6bb956808aa3df58747c865c92e5b276e61aff44 Change-Id: Id4f2cad2e0b0c34a7a68d0b3a6f69b44816f4cd9 --- manifests/compute/libvirt.pp | 13 +++++++++++++ .../notes/extra_cpu_flags-2de6915770ac9514.yaml | 12 ++++++++++++ spec/classes/nova_compute_libvirt_spec.rb | 9 +++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/extra_cpu_flags-2de6915770ac9514.yaml diff --git a/manifests/compute/libvirt.pp b/manifests/compute/libvirt.pp index 3f51fe304..261b25814 100644 --- a/manifests/compute/libvirt.pp +++ b/manifests/compute/libvirt.pp @@ -33,6 +33,12 @@ # cpu_mode="custom" and virt_type="kvm|qemu". # Defaults to undef # +# [*libvirt_cpu_model_extra_flags*] +# (optional) This allows specifying granular CPU feature flags when +# specifying CPU models. Only valid, if cpu_mode and cpu_model +# attributes are specified and only if cpu_mode="custom". +# Defaults to undef +# # [*libvirt_snapshot_image_format*] # (optional) Format to save snapshots to. Some filesystems # have a preference and only operate on raw or qcow2 @@ -138,6 +144,7 @@ class nova::compute::libvirt ( $migration_support = false, $libvirt_cpu_mode = false, $libvirt_cpu_model = undef, + $libvirt_cpu_model_extra_flags = undef, $libvirt_snapshot_image_format = $::os_service_default, $libvirt_disk_cachemodes = [], $libvirt_hw_disk_discard = $::os_service_default, @@ -235,14 +242,20 @@ class nova::compute::libvirt ( validate_string($libvirt_cpu_model) nova_config { 'libvirt/cpu_model': value => $libvirt_cpu_model; + 'libvirt/cpu_model_extra_flags': value => $libvirt_cpu_model_extra_flags; } } else { nova_config { 'libvirt/cpu_model': ensure => absent; + 'libvirt/cpu_model_extra_flags': ensure => absent; } if $libvirt_cpu_model { warning('$libvirt_cpu_model requires that $libvirt_cpu_mode => "custom" and will be ignored') } + + if $libvirt_cpu_model_extra_flags { + warning('$libvirt_cpu_model_extra_flags requires that $libvirt_cpu_mode => "custom" and will be ignored') + } } if size($libvirt_disk_cachemodes) > 0 { diff --git a/releasenotes/notes/extra_cpu_flags-2de6915770ac9514.yaml b/releasenotes/notes/extra_cpu_flags-2de6915770ac9514.yaml new file mode 100644 index 000000000..fc94448f1 --- /dev/null +++ b/releasenotes/notes/extra_cpu_flags-2de6915770ac9514.yaml @@ -0,0 +1,12 @@ +--- +features: + - | + This allows for specifying granular CPU feature flags, when + specifying CPU models. It should be set only if ``cpu_mode`` + and ``cpu_model`` conf parameter are set and ``cpu_mode`` + parameter value is set to "custom". + The recent "Meltdown" CVE fixes have resulted in critical + performance penalty which impacts every Nova guest within + certain CPU models. + + More info is available in `nova release notes `_. diff --git a/spec/classes/nova_compute_libvirt_spec.rb b/spec/classes/nova_compute_libvirt_spec.rb index 2fe38d280..8f98cd0e2 100644 --- a/spec/classes/nova_compute_libvirt_spec.rb +++ b/spec/classes/nova_compute_libvirt_spec.rb @@ -50,6 +50,7 @@ describe 'nova::compute::libvirt' do it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('kvm')} it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-model')} it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')} + it { is_expected.to contain_nova_config('libvirt/cpu_model_extra_flags').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/snapshot_image_format').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/inject_password').with_value(false)} @@ -68,6 +69,7 @@ describe 'nova::compute::libvirt' do :vncserver_listen => '0.0.0.0', :libvirt_cpu_mode => 'host-passthrough', :libvirt_cpu_model => 'kvm64', + :libvirt_cpu_model_extra_flags => 'pcid', :libvirt_snapshot_image_format => 'raw', :libvirt_disk_cachemodes => ['file=directsync','block=none'], :libvirt_hw_disk_discard => 'unmap', @@ -94,6 +96,7 @@ describe 'nova::compute::libvirt' do it { is_expected.to contain_nova_config('libvirt/virt_type').with_value('qemu')} it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('host-passthrough')} it { is_expected.to contain_nova_config('libvirt/cpu_model').with_ensure('absent')} + it { is_expected.to contain_nova_config('libvirt/cpu_model_extra_flags').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/snapshot_image_format').with_ensure('absent')} it { is_expected.to contain_nova_config('libvirt/disk_cachemodes').with_value('file=directsync,block=none')} it { is_expected.to contain_nova_config('libvirt/hw_disk_discard').with_value('unmap')} @@ -127,12 +130,14 @@ describe 'nova::compute::libvirt' do describe 'with custom cpu_mode' do let :params do - { :libvirt_cpu_mode => 'custom', - :libvirt_cpu_model => 'kvm64' } + { :libvirt_cpu_mode => 'custom', + :libvirt_cpu_model => 'kvm64', + :libvirt_cpu_model_extra_flags => 'pcid' } end it { is_expected.to contain_nova_config('libvirt/cpu_mode').with_value('custom')} it { is_expected.to contain_nova_config('libvirt/cpu_model').with_value('kvm64')} + it { is_expected.to contain_nova_config('libvirt/cpu_model_extra_flags').with_value('pcid')} end describe 'with qcow2 as snapshot_image_format' do