aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/svm.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-10-29 09:34:14 -0400
committerTejun Heo <tj@kernel.org>2009-10-29 09:34:14 -0400
commit0fe1e009541e925adc1748a605d8b66188e4b2ab (patch)
treee3c7238bcb865f14a288ffe6e9d37ea7dea1ec2a /arch/x86/kvm/svm.c
parentc6e22f9e3e99cc221fe01a0cacf94a9da8a59c31 (diff)
percpu: make percpu symbols in x86 unique
This patch updates percpu related symbols in x86 such that percpu symbols are unique and don't clash with local symbols. This serves two purposes of decreasing the possibility of global percpu symbol collision and allowing dropping per_cpu__ prefix from percpu symbols. * arch/x86/kernel/cpu/common.c: rename local variable to avoid collision * arch/x86/kvm/svm.c: s/svm_data/sd/ for local variables to avoid collision * arch/x86/kernel/cpu/cpu_debug.c: s/cpu_arr/cpud_arr/ s/priv_arr/cpud_priv_arr/ s/cpu_priv_count/cpud_priv_count/ * arch/x86/kernel/cpu/intel_cacheinfo.c: s/cpuid4_info/ici_cpuid4_info/ s/cache_kobject/ici_cache_kobject/ s/index_kobject/ici_index_kobject/ * arch/x86/kernel/ds.c: s/cpu_context/cpu_ds_context/ Partly based on Rusty Russell's "alloc_percpu: rename percpu vars which cause name clashes" patch. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: (kvm) Avi Kivity <avi@redhat.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Marcelo Tosatti <mtosatti@redhat.com> Cc: x86@kernel.org
Diffstat (limited to 'arch/x86/kvm/svm.c')
-rw-r--r--arch/x86/kvm/svm.c63
1 files changed, 31 insertions, 32 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 944cc9c04b3..6c79a14a3b6 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -319,7 +319,7 @@ static void svm_hardware_disable(void *garbage)
319static void svm_hardware_enable(void *garbage) 319static void svm_hardware_enable(void *garbage)
320{ 320{
321 321
322 struct svm_cpu_data *svm_data; 322 struct svm_cpu_data *sd;
323 uint64_t efer; 323 uint64_t efer;
324 struct descriptor_table gdt_descr; 324 struct descriptor_table gdt_descr;
325 struct desc_struct *gdt; 325 struct desc_struct *gdt;
@@ -329,62 +329,61 @@ static void svm_hardware_enable(void *garbage)
329 printk(KERN_ERR "svm_cpu_init: err EOPNOTSUPP on %d\n", me); 329 printk(KERN_ERR "svm_cpu_init: err EOPNOTSUPP on %d\n", me);
330 return; 330 return;
331 } 331 }
332 svm_data = per_cpu(svm_data, me); 332 sd = per_cpu(svm_data, me);
333 333
334 if (!svm_data) { 334 if (!sd) {
335 printk(KERN_ERR "svm_cpu_init: svm_data is NULL on %d\n", 335 printk(KERN_ERR "svm_cpu_init: svm_data is NULL on %d\n",
336 me); 336 me);
337 return; 337 return;
338 } 338 }
339 339
340 svm_data->asid_generation = 1; 340 sd->asid_generation = 1;
341 svm_data->max_asid = cpuid_ebx(SVM_CPUID_FUNC) - 1; 341 sd->max_asid = cpuid_ebx(SVM_CPUID_FUNC) - 1;
342 svm_data->next_asid = svm_data->max_asid + 1; 342 sd->next_asid = sd->max_asid + 1;
343 343
344 kvm_get_gdt(&gdt_descr); 344 kvm_get_gdt(&gdt_descr);
345 gdt = (struct desc_struct *)gdt_descr.base; 345 gdt = (struct desc_struct *)gdt_descr.base;
346 svm_data->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS); 346 sd->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS);
347 347
348 rdmsrl(MSR_EFER, efer); 348 rdmsrl(MSR_EFER, efer);
349 wrmsrl(MSR_EFER, efer | EFER_SVME); 349 wrmsrl(MSR_EFER, efer | EFER_SVME);
350 350
351 wrmsrl(MSR_VM_HSAVE_PA, 351 wrmsrl(MSR_VM_HSAVE_PA,
352 page_to_pfn(svm_data->save_area) << PAGE_SHIFT); 352 page_to_pfn(sd->save_area) << PAGE_SHIFT);
353} 353}
354 354
355static void svm_cpu_uninit(int cpu) 355static void svm_cpu_uninit(int cpu)
356{ 356{
357 struct svm_cpu_data *svm_data 357 struct svm_cpu_data *sd = per_cpu(svm_data, raw_smp_processor_id());
358 = per_cpu(svm_data, raw_smp_processor_id());
359 358
360 if (!svm_data) 359 if (!sd)
361 return; 360 return;
362 361
363 per_cpu(svm_data, raw_smp_processor_id()) = NULL; 362 per_cpu(svm_data, raw_smp_processor_id()) = NULL;
364 __free_page(svm_data->save_area); 363 __free_page(sd->save_area);
365 kfree(svm_data); 364 kfree(sd);
366} 365}
367 366
368static int svm_cpu_init(int cpu) 367static int svm_cpu_init(int cpu)
369{ 368{
370 struct svm_cpu_data *svm_data; 369 struct svm_cpu_data *sd;
371 int r; 370 int r;
372 371
373 svm_data = kzalloc(sizeof(struct svm_cpu_data), GFP_KERNEL); 372 sd = kzalloc(sizeof(struct svm_cpu_data), GFP_KERNEL);
374 if (!svm_data) 373 if (!sd)
375 return -ENOMEM; 374 return -ENOMEM;
376 svm_data->cpu = cpu; 375 sd->cpu = cpu;
377 svm_data->save_area = alloc_page(GFP_KERNEL); 376 sd->save_area = alloc_page(GFP_KERNEL);
378 r = -ENOMEM; 377 r = -ENOMEM;
379 if (!svm_data->save_area) 378 if (!sd->save_area)
380 goto err_1; 379 goto err_1;
381 380
382 per_cpu(svm_data, cpu) = svm_data; 381 per_cpu(svm_data, cpu) = sd;
383 382
384 return 0; 383 return 0;
385 384
386err_1: 385err_1:
387 kfree(svm_data); 386 kfree(sd);
388 return r; 387 return r;
389 388
390} 389}
@@ -1094,16 +1093,16 @@ static void save_host_msrs(struct kvm_vcpu *vcpu)
1094#endif 1093#endif
1095} 1094}
1096 1095
1097static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *svm_data) 1096static void new_asid(struct vcpu_svm *svm, struct svm_cpu_data *sd)
1098{ 1097{
1099 if (svm_data->next_asid > svm_data->max_asid) { 1098 if (sd->next_asid > sd->max_asid) {
1100 ++svm_data->asid_generation; 1099 ++sd->asid_generation;
1101 svm_data->next_asid = 1; 1100 sd->next_asid = 1;
1102 svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID; 1101 svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID;
1103 } 1102 }
1104 1103
1105 svm->asid_generation = svm_data->asid_generation; 1104 svm->asid_generation = sd->asid_generation;
1106 svm->vmcb->control.asid = svm_data->next_asid++; 1105 svm->vmcb->control.asid = sd->next_asid++;
1107} 1106}
1108 1107
1109static unsigned long svm_get_dr(struct kvm_vcpu *vcpu, int dr) 1108static unsigned long svm_get_dr(struct kvm_vcpu *vcpu, int dr)
@@ -2377,8 +2376,8 @@ static void reload_tss(struct kvm_vcpu *vcpu)
2377{ 2376{
2378 int cpu = raw_smp_processor_id(); 2377 int cpu = raw_smp_processor_id();
2379 2378
2380 struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu); 2379 struct svm_cpu_data *sd = per_cpu(svm_data, cpu);
2381 svm_data->tss_desc->type = 9; /* available 32/64-bit TSS */ 2380 sd->tss_desc->type = 9; /* available 32/64-bit TSS */
2382 load_TR_desc(); 2381 load_TR_desc();
2383} 2382}
2384 2383
@@ -2386,12 +2385,12 @@ static void pre_svm_run(struct vcpu_svm *svm)
2386{ 2385{
2387 int cpu = raw_smp_processor_id(); 2386 int cpu = raw_smp_processor_id();
2388 2387
2389 struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu); 2388 struct svm_cpu_data *sd = per_cpu(svm_data, cpu);
2390 2389
2391 svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING; 2390 svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING;
2392 /* FIXME: handle wraparound of asid_generation */ 2391 /* FIXME: handle wraparound of asid_generation */
2393 if (svm->asid_generation != svm_data->asid_generation) 2392 if (svm->asid_generation != sd->asid_generation)
2394 new_asid(svm, svm_data); 2393 new_asid(svm, sd);
2395} 2394}
2396 2395
2397static void svm_inject_nmi(struct kvm_vcpu *vcpu) 2396static void svm_inject_nmi(struct kvm_vcpu *vcpu)