Skip to content

Commit

Permalink
KVM: Fix hotplug of CPUs
Browse files Browse the repository at this point in the history
Both VMX and SVM require per-cpu memory allocation, which is done at module
init time, for only online cpus.

Backend was not allocating enough structure for all possible CPUs, so
new CPUs coming online could not be hardware enabled.

Signed-off-by: Zachary Amsden <zamsden@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
  • Loading branch information
Zachary Amsden authored and Avi Kivity committed Dec 3, 2009
1 parent e6732a5 commit 3230bb4
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 4 deletions.
4 changes: 2 additions & 2 deletions arch/x86/kvm/svm.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ static __init int svm_hardware_setup(void)
kvm_enable_efer_bits(EFER_SVME);
}

for_each_online_cpu(cpu) {
for_each_possible_cpu(cpu) {
r = svm_cpu_init(cpu);
if (r)
goto err;
Expand Down Expand Up @@ -516,7 +516,7 @@ static __exit void svm_hardware_unsetup(void)
{
int cpu;

for_each_online_cpu(cpu)
for_each_possible_cpu(cpu)
svm_cpu_uninit(cpu);

__free_pages(pfn_to_page(iopm_base >> PAGE_SHIFT), IOPM_ALLOC_ORDER);
Expand Down
6 changes: 4 additions & 2 deletions arch/x86/kvm/vmx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1350,15 +1350,17 @@ static void free_kvm_area(void)
{
int cpu;

for_each_online_cpu(cpu)
for_each_possible_cpu(cpu) {
free_vmcs(per_cpu(vmxarea, cpu));
per_cpu(vmxarea, cpu) = NULL;
}
}

static __init int alloc_kvm_area(void)
{
int cpu;

for_each_online_cpu(cpu) {
for_each_possible_cpu(cpu) {
struct vmcs *vmcs;

vmcs = alloc_vmcs_cpu(cpu);
Expand Down

0 comments on commit 3230bb4

Please sign in to comment.