diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_hv.c')
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 136 |
1 files changed, 94 insertions, 42 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index c6af1d623839..83e929e66f9d 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -56,7 +56,7 @@ | |||
56 | /* #define EXIT_DEBUG_INT */ | 56 | /* #define EXIT_DEBUG_INT */ |
57 | 57 | ||
58 | static void kvmppc_end_cede(struct kvm_vcpu *vcpu); | 58 | static void kvmppc_end_cede(struct kvm_vcpu *vcpu); |
59 | static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu); | 59 | static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu); |
60 | 60 | ||
61 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | 61 | void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) |
62 | { | 62 | { |
@@ -268,24 +268,45 @@ static unsigned long do_h_register_vpa(struct kvm_vcpu *vcpu, | |||
268 | return err; | 268 | return err; |
269 | } | 269 | } |
270 | 270 | ||
271 | static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap) | 271 | static void kvmppc_update_vpa(struct kvm_vcpu *vcpu, struct kvmppc_vpa *vpap) |
272 | { | 272 | { |
273 | struct kvm *kvm = vcpu->kvm; | ||
273 | void *va; | 274 | void *va; |
274 | unsigned long nb; | 275 | unsigned long nb; |
276 | unsigned long gpa; | ||
275 | 277 | ||
276 | vpap->update_pending = 0; | 278 | /* |
277 | va = NULL; | 279 | * We need to pin the page pointed to by vpap->next_gpa, |
278 | if (vpap->next_gpa) { | 280 | * but we can't call kvmppc_pin_guest_page under the lock |
279 | va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb); | 281 | * as it does get_user_pages() and down_read(). So we |
280 | if (nb < vpap->len) { | 282 | * have to drop the lock, pin the page, then get the lock |
281 | /* | 283 | * again and check that a new area didn't get registered |
282 | * If it's now too short, it must be that userspace | 284 | * in the meantime. |
283 | * has changed the mappings underlying guest memory, | 285 | */ |
284 | * so unregister the region. | 286 | for (;;) { |
285 | */ | 287 | gpa = vpap->next_gpa; |
288 | spin_unlock(&vcpu->arch.vpa_update_lock); | ||
289 | va = NULL; | ||
290 | nb = 0; | ||
291 | if (gpa) | ||
292 | va = kvmppc_pin_guest_page(kvm, vpap->next_gpa, &nb); | ||
293 | spin_lock(&vcpu->arch.vpa_update_lock); | ||
294 | if (gpa == vpap->next_gpa) | ||
295 | break; | ||
296 | /* sigh... unpin that one and try again */ | ||
297 | if (va) | ||
286 | kvmppc_unpin_guest_page(kvm, va); | 298 | kvmppc_unpin_guest_page(kvm, va); |
287 | va = NULL; | 299 | } |
288 | } | 300 | |
301 | vpap->update_pending = 0; | ||
302 | if (va && nb < vpap->len) { | ||
303 | /* | ||
304 | * If it's now too short, it must be that userspace | ||
305 | * has changed the mappings underlying guest memory, | ||
306 | * so unregister the region. | ||
307 | */ | ||
308 | kvmppc_unpin_guest_page(kvm, va); | ||
309 | va = NULL; | ||
289 | } | 310 | } |
290 | if (vpap->pinned_addr) | 311 | if (vpap->pinned_addr) |
291 | kvmppc_unpin_guest_page(kvm, vpap->pinned_addr); | 312 | kvmppc_unpin_guest_page(kvm, vpap->pinned_addr); |
@@ -296,20 +317,18 @@ static void kvmppc_update_vpa(struct kvm *kvm, struct kvmppc_vpa *vpap) | |||
296 | 317 | ||
297 | static void kvmppc_update_vpas(struct kvm_vcpu *vcpu) | 318 | static void kvmppc_update_vpas(struct kvm_vcpu *vcpu) |
298 | { | 319 | { |
299 | struct kvm *kvm = vcpu->kvm; | ||
300 | |||
301 | spin_lock(&vcpu->arch.vpa_update_lock); | 320 | spin_lock(&vcpu->arch.vpa_update_lock); |
302 | if (vcpu->arch.vpa.update_pending) { | 321 | if (vcpu->arch.vpa.update_pending) { |
303 | kvmppc_update_vpa(kvm, &vcpu->arch.vpa); | 322 | kvmppc_update_vpa(vcpu, &vcpu->arch.vpa); |
304 | init_vpa(vcpu, vcpu->arch.vpa.pinned_addr); | 323 | init_vpa(vcpu, vcpu->arch.vpa.pinned_addr); |
305 | } | 324 | } |
306 | if (vcpu->arch.dtl.update_pending) { | 325 | if (vcpu->arch.dtl.update_pending) { |
307 | kvmppc_update_vpa(kvm, &vcpu->arch.dtl); | 326 | kvmppc_update_vpa(vcpu, &vcpu->arch.dtl); |
308 | vcpu->arch.dtl_ptr = vcpu->arch.dtl.pinned_addr; | 327 | vcpu->arch.dtl_ptr = vcpu->arch.dtl.pinned_addr; |
309 | vcpu->arch.dtl_index = 0; | 328 | vcpu->arch.dtl_index = 0; |
310 | } | 329 | } |
311 | if (vcpu->arch.slb_shadow.update_pending) | 330 | if (vcpu->arch.slb_shadow.update_pending) |
312 | kvmppc_update_vpa(kvm, &vcpu->arch.slb_shadow); | 331 | kvmppc_update_vpa(vcpu, &vcpu->arch.slb_shadow); |
313 | spin_unlock(&vcpu->arch.vpa_update_lock); | 332 | spin_unlock(&vcpu->arch.vpa_update_lock); |
314 | } | 333 | } |
315 | 334 | ||
@@ -800,12 +819,39 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
800 | struct kvm_vcpu *vcpu, *vcpu0, *vnext; | 819 | struct kvm_vcpu *vcpu, *vcpu0, *vnext; |
801 | long ret; | 820 | long ret; |
802 | u64 now; | 821 | u64 now; |
803 | int ptid, i; | 822 | int ptid, i, need_vpa_update; |
804 | 823 | ||
805 | /* don't start if any threads have a signal pending */ | 824 | /* don't start if any threads have a signal pending */ |
806 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | 825 | need_vpa_update = 0; |
826 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { | ||
807 | if (signal_pending(vcpu->arch.run_task)) | 827 | if (signal_pending(vcpu->arch.run_task)) |
808 | return 0; | 828 | return 0; |
829 | need_vpa_update |= vcpu->arch.vpa.update_pending | | ||
830 | vcpu->arch.slb_shadow.update_pending | | ||
831 | vcpu->arch.dtl.update_pending; | ||
832 | } | ||
833 | |||
834 | /* | ||
835 | * Initialize *vc, in particular vc->vcore_state, so we can | ||
836 | * drop the vcore lock if necessary. | ||
837 | */ | ||
838 | vc->n_woken = 0; | ||
839 | vc->nap_count = 0; | ||
840 | vc->entry_exit_count = 0; | ||
841 | vc->vcore_state = VCORE_RUNNING; | ||
842 | vc->in_guest = 0; | ||
843 | vc->napping_threads = 0; | ||
844 | |||
845 | /* | ||
846 | * Updating any of the vpas requires calling kvmppc_pin_guest_page, | ||
847 | * which can't be called with any spinlocks held. | ||
848 | */ | ||
849 | if (need_vpa_update) { | ||
850 | spin_unlock(&vc->lock); | ||
851 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) | ||
852 | kvmppc_update_vpas(vcpu); | ||
853 | spin_lock(&vc->lock); | ||
854 | } | ||
809 | 855 | ||
810 | /* | 856 | /* |
811 | * Make sure we are running on thread 0, and that | 857 | * Make sure we are running on thread 0, and that |
@@ -838,20 +884,10 @@ static int kvmppc_run_core(struct kvmppc_vcore *vc) | |||
838 | if (vcpu->arch.ceded) | 884 | if (vcpu->arch.ceded) |
839 | vcpu->arch.ptid = ptid++; | 885 | vcpu->arch.ptid = ptid++; |
840 | 886 | ||
841 | vc->n_woken = 0; | ||
842 | vc->nap_count = 0; | ||
843 | vc->entry_exit_count = 0; | ||
844 | vc->vcore_state = VCORE_RUNNING; | ||
845 | vc->stolen_tb += mftb() - vc->preempt_tb; | 887 | vc->stolen_tb += mftb() - vc->preempt_tb; |
846 | vc->in_guest = 0; | ||
847 | vc->pcpu = smp_processor_id(); | 888 | vc->pcpu = smp_processor_id(); |
848 | vc->napping_threads = 0; | ||
849 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { | 889 | list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { |
850 | kvmppc_start_thread(vcpu); | 890 | kvmppc_start_thread(vcpu); |
851 | if (vcpu->arch.vpa.update_pending || | ||
852 | vcpu->arch.slb_shadow.update_pending || | ||
853 | vcpu->arch.dtl.update_pending) | ||
854 | kvmppc_update_vpas(vcpu); | ||
855 | kvmppc_create_dtl_entry(vcpu, vc); | 891 | kvmppc_create_dtl_entry(vcpu, vc); |
856 | } | 892 | } |
857 | /* Grab any remaining hw threads so they can't go into the kernel */ | 893 | /* Grab any remaining hw threads so they can't go into the kernel */ |
@@ -1068,11 +1104,15 @@ int kvmppc_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
1068 | return -EINTR; | 1104 | return -EINTR; |
1069 | } | 1105 | } |
1070 | 1106 | ||
1071 | /* On the first time here, set up VRMA or RMA */ | 1107 | atomic_inc(&vcpu->kvm->arch.vcpus_running); |
1108 | /* Order vcpus_running vs. rma_setup_done, see kvmppc_alloc_reset_hpt */ | ||
1109 | smp_mb(); | ||
1110 | |||
1111 | /* On the first time here, set up HTAB and VRMA or RMA */ | ||
1072 | if (!vcpu->kvm->arch.rma_setup_done) { | 1112 | if (!vcpu->kvm->arch.rma_setup_done) { |
1073 | r = kvmppc_hv_setup_rma(vcpu); | 1113 | r = kvmppc_hv_setup_htab_rma(vcpu); |
1074 | if (r) | 1114 | if (r) |
1075 | return r; | 1115 | goto out; |
1076 | } | 1116 | } |
1077 | 1117 | ||
1078 | flush_fp_to_thread(current); | 1118 | flush_fp_to_thread(current); |
@@ -1090,6 +1130,9 @@ int kvmppc_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu) | |||
1090 | kvmppc_core_prepare_to_enter(vcpu); | 1130 | kvmppc_core_prepare_to_enter(vcpu); |
1091 | } | 1131 | } |
1092 | } while (r == RESUME_GUEST); | 1132 | } while (r == RESUME_GUEST); |
1133 | |||
1134 | out: | ||
1135 | atomic_dec(&vcpu->kvm->arch.vcpus_running); | ||
1093 | return r; | 1136 | return r; |
1094 | } | 1137 | } |
1095 | 1138 | ||
@@ -1305,7 +1348,7 @@ void kvmppc_core_commit_memory_region(struct kvm *kvm, | |||
1305 | { | 1348 | { |
1306 | } | 1349 | } |
1307 | 1350 | ||
1308 | static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu) | 1351 | static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu) |
1309 | { | 1352 | { |
1310 | int err = 0; | 1353 | int err = 0; |
1311 | struct kvm *kvm = vcpu->kvm; | 1354 | struct kvm *kvm = vcpu->kvm; |
@@ -1324,6 +1367,15 @@ static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu) | |||
1324 | if (kvm->arch.rma_setup_done) | 1367 | if (kvm->arch.rma_setup_done) |
1325 | goto out; /* another vcpu beat us to it */ | 1368 | goto out; /* another vcpu beat us to it */ |
1326 | 1369 | ||
1370 | /* Allocate hashed page table (if not done already) and reset it */ | ||
1371 | if (!kvm->arch.hpt_virt) { | ||
1372 | err = kvmppc_alloc_hpt(kvm, NULL); | ||
1373 | if (err) { | ||
1374 | pr_err("KVM: Couldn't alloc HPT\n"); | ||
1375 | goto out; | ||
1376 | } | ||
1377 | } | ||
1378 | |||
1327 | /* Look up the memslot for guest physical address 0 */ | 1379 | /* Look up the memslot for guest physical address 0 */ |
1328 | memslot = gfn_to_memslot(kvm, 0); | 1380 | memslot = gfn_to_memslot(kvm, 0); |
1329 | 1381 | ||
@@ -1435,13 +1487,14 @@ static int kvmppc_hv_setup_rma(struct kvm_vcpu *vcpu) | |||
1435 | 1487 | ||
1436 | int kvmppc_core_init_vm(struct kvm *kvm) | 1488 | int kvmppc_core_init_vm(struct kvm *kvm) |
1437 | { | 1489 | { |
1438 | long r; | 1490 | unsigned long lpcr, lpid; |
1439 | unsigned long lpcr; | ||
1440 | 1491 | ||
1441 | /* Allocate hashed page table */ | 1492 | /* Allocate the guest's logical partition ID */ |
1442 | r = kvmppc_alloc_hpt(kvm); | 1493 | |
1443 | if (r) | 1494 | lpid = kvmppc_alloc_lpid(); |
1444 | return r; | 1495 | if (lpid < 0) |
1496 | return -ENOMEM; | ||
1497 | kvm->arch.lpid = lpid; | ||
1445 | 1498 | ||
1446 | INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables); | 1499 | INIT_LIST_HEAD(&kvm->arch.spapr_tce_tables); |
1447 | 1500 | ||
@@ -1451,7 +1504,6 @@ int kvmppc_core_init_vm(struct kvm *kvm) | |||
1451 | 1504 | ||
1452 | if (cpu_has_feature(CPU_FTR_ARCH_201)) { | 1505 | if (cpu_has_feature(CPU_FTR_ARCH_201)) { |
1453 | /* PPC970; HID4 is effectively the LPCR */ | 1506 | /* PPC970; HID4 is effectively the LPCR */ |
1454 | unsigned long lpid = kvm->arch.lpid; | ||
1455 | kvm->arch.host_lpid = 0; | 1507 | kvm->arch.host_lpid = 0; |
1456 | kvm->arch.host_lpcr = lpcr = mfspr(SPRN_HID4); | 1508 | kvm->arch.host_lpcr = lpcr = mfspr(SPRN_HID4); |
1457 | lpcr &= ~((3 << HID4_LPID1_SH) | (0xful << HID4_LPID5_SH)); | 1509 | lpcr &= ~((3 << HID4_LPID1_SH) | (0xful << HID4_LPID5_SH)); |