KVM: SVM: fix suspend/resume support
On suspend the svm_hardware_disable function is called which frees all svm_data variables. On resume they are not re-allocated. This patch removes the deallocation of svm_data from the hardware_disable function to the hardware_unsetup function which is not called on suspend. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
180c12fb22
commit
0da1db75a2
|
@ -272,19 +272,11 @@ static int has_svm(void)
|
||||||
|
|
||||||
static void svm_hardware_disable(void *garbage)
|
static void svm_hardware_disable(void *garbage)
|
||||||
{
|
{
|
||||||
struct svm_cpu_data *svm_data
|
uint64_t efer;
|
||||||
= per_cpu(svm_data, raw_smp_processor_id());
|
|
||||||
|
|
||||||
if (svm_data) {
|
wrmsrl(MSR_VM_HSAVE_PA, 0);
|
||||||
uint64_t efer;
|
rdmsrl(MSR_EFER, efer);
|
||||||
|
wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void svm_hardware_enable(void *garbage)
|
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);
|
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)
|
static int svm_cpu_init(int cpu)
|
||||||
{
|
{
|
||||||
struct svm_cpu_data *svm_data;
|
struct svm_cpu_data *svm_data;
|
||||||
|
@ -460,6 +465,11 @@ static __init int svm_hardware_setup(void)
|
||||||
|
|
||||||
static __exit void svm_hardware_unsetup(void)
|
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);
|
__free_pages(pfn_to_page(iopm_base >> PAGE_SHIFT), IOPM_ALLOC_ORDER);
|
||||||
iopm_base = 0;
|
iopm_base = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue