Commit 88099313 authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Paolo Bonzini
Browse files

KVM: x86: SVM: fix tsc scaling when the host doesn't support it



It was decided that when TSC scaling is not supported,
the virtual MSR_AMD64_TSC_RATIO should still have the default '1.0'
value.

However in this case kvm_max_tsc_scaling_ratio is not set,
which breaks various assumptions.

Fix this by always calculating kvm_max_tsc_scaling_ratio regardless of
host support.  For consistency, do the same for VMX.

Suggested-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20220322172449.235575-8-mlevitsk@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent f37b735e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4752,10 +4752,10 @@ static __init int svm_hardware_setup(void)
		} else {
			pr_info("TSC scaling supported\n");
			kvm_has_tsc_control = true;
			kvm_max_tsc_scaling_ratio = SVM_TSC_RATIO_MAX;
			kvm_tsc_scaling_ratio_frac_bits = 32;
		}
	}
	kvm_max_tsc_scaling_ratio = SVM_TSC_RATIO_MAX;
	kvm_tsc_scaling_ratio_frac_bits = 32;

	tsc_aux_uret_slot = kvm_add_user_return_msr(MSR_TSC_AUX);

+3 −4
Original line number Diff line number Diff line
@@ -7980,12 +7980,11 @@ static __init int hardware_setup(void)
	if (!enable_apicv)
		vmx_x86_ops.sync_pir_to_irr = NULL;

	if (cpu_has_vmx_tsc_scaling()) {
	if (cpu_has_vmx_tsc_scaling())
		kvm_has_tsc_control = true;

	kvm_max_tsc_scaling_ratio = KVM_VMX_TSC_MULTIPLIER_MAX;
	kvm_tsc_scaling_ratio_frac_bits = 48;
	}

	kvm_has_bus_lock_exit = cpu_has_vmx_bus_lock_detection();

	set_bit(0, vmx_vpid_bitmap); /* 0 is reserved for host */
+1 −3
Original line number Diff line number Diff line
@@ -11602,10 +11602,8 @@ int kvm_arch_hardware_setup(void *opaque)
		u64 max = min(0x7fffffffULL,
			      __scale_tsc(kvm_max_tsc_scaling_ratio, tsc_khz));
		kvm_max_guest_tsc_khz = max;

		kvm_default_tsc_scaling_ratio = 1ULL << kvm_tsc_scaling_ratio_frac_bits;
	}

	kvm_default_tsc_scaling_ratio = 1ULL << kvm_tsc_scaling_ratio_frac_bits;
	kvm_init_msr_list();
	return 0;
}