|
@@ -272,19 +272,11 @@ static int has_svm(void)
|
|
|
|
|
|
static void svm_hardware_disable(void *garbage)
|
|
|
{
|
|
|
- struct svm_cpu_data *svm_data
|
|
|
- = per_cpu(svm_data, raw_smp_processor_id());
|
|
|
-
|
|
|
- if (svm_data) {
|
|
|
- uint64_t efer;
|
|
|
+ uint64_t efer;
|
|
|
|
|
|
- wrmsrl(MSR_VM_HSAVE_PA, 0);
|
|
|
- rdmsrl(MSR_EFER, efer);
|
|
|
- wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
|
|
|
- per_cpu(svm_data, raw_smp_processor_id()) = NULL;
|
|
|
- __free_page(svm_data->save_area);
|
|
|
- kfree(svm_data);
|
|
|
- }
|
|
|
+ wrmsrl(MSR_VM_HSAVE_PA, 0);
|
|
|
+ rdmsrl(MSR_EFER, efer);
|
|
|
+ wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
|
|
|
}
|
|
|
|
|
|
static void svm_hardware_enable(void *garbage)
|
|
@@ -323,6 +315,19 @@ static void svm_hardware_enable(void *garbage)
|
|
|
page_to_pfn(svm_data->save_area) << PAGE_SHIFT);
|
|
|
}
|
|
|
|
|
|
+static void svm_cpu_uninit(int cpu)
|
|
|
+{
|
|
|
+ struct svm_cpu_data *svm_data
|
|
|
+ = per_cpu(svm_data, raw_smp_processor_id());
|
|
|
+
|
|
|
+ if (!svm_data)
|
|
|
+ return;
|
|
|
+
|
|
|
+ per_cpu(svm_data, raw_smp_processor_id()) = NULL;
|
|
|
+ __free_page(svm_data->save_area);
|
|
|
+ kfree(svm_data);
|
|
|
+}
|
|
|
+
|
|
|
static int svm_cpu_init(int cpu)
|
|
|
{
|
|
|
struct svm_cpu_data *svm_data;
|
|
@@ -460,6 +465,11 @@ err:
|
|
|
|
|
|
static __exit void svm_hardware_unsetup(void)
|
|
|
{
|
|
|
+ int cpu;
|
|
|
+
|
|
|
+ for_each_online_cpu(cpu)
|
|
|
+ svm_cpu_uninit(cpu);
|
|
|
+
|
|
|
__free_pages(pfn_to_page(iopm_base >> PAGE_SHIFT), IOPM_ALLOC_ORDER);
|
|
|
iopm_base = 0;
|
|
|
}
|