diff options
author | Paul Mackerras <paulus@ozlabs.org> | 2017-11-01 00:33:39 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@ozlabs.org> | 2017-11-01 00:33:39 -0400 |
commit | 3e8f150a3bc30214c15e5f8d27e4b2d904bd929e (patch) | |
tree | 0b7aec14c8340153c58fb7354f923ec4a1bb4e7a | |
parent | 93897a1f4b1a96171b4a445207a371df1b0d4601 (diff) | |
parent | 2a3d6553cbd791da4fb624c2500b4580b3f9d72f (diff) |
Merge remote-tracking branch 'remotes/powerpc/topic/ppc-kvm' into kvm-ppc-next
This merges in the ppc-kvm topic branch of the powerpc tree to get the
commit that reverts the patch "KVM: PPC: Book3S HV: POWER9 does not
require secondary thread management". This is needed for subsequent
patches which will be applied on this branch.
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
-rw-r--r-- | arch/powerpc/include/asm/kvm_book3s_asm.h | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/idle_book3s.S | 35 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 13 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 8 | ||||
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 4 |
5 files changed, 14 insertions, 50 deletions
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h index 83596f32f50b..7cea76f11c26 100644 --- a/arch/powerpc/include/asm/kvm_book3s_asm.h +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h | |||
@@ -104,10 +104,6 @@ struct kvmppc_host_state { | |||
104 | u8 napping; | 104 | u8 napping; |
105 | 105 | ||
106 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 106 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
107 | /* | ||
108 | * hwthread_req/hwthread_state pair is used to pull sibling threads | ||
109 | * out of guest on pre-ISAv3.0B CPUs where threads share MMU. | ||
110 | */ | ||
111 | u8 hwthread_req; | 107 | u8 hwthread_req; |
112 | u8 hwthread_state; | 108 | u8 hwthread_state; |
113 | u8 host_ipi; | 109 | u8 host_ipi; |
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 1125c9be9e06..175d49f468af 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S | |||
@@ -319,20 +319,13 @@ enter_winkle: | |||
319 | /* | 319 | /* |
320 | * r3 - PSSCR value corresponding to the requested stop state. | 320 | * r3 - PSSCR value corresponding to the requested stop state. |
321 | */ | 321 | */ |
322 | power_enter_stop: | ||
322 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 323 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
323 | power_enter_stop_kvm_rm: | 324 | /* Tell KVM we're entering idle */ |
324 | /* | ||
325 | * This is currently unused because POWER9 KVM does not have to | ||
326 | * gather secondary threads into sibling mode, but the code is | ||
327 | * here in case that function is required. | ||
328 | * | ||
329 | * Tell KVM we're entering idle. | ||
330 | */ | ||
331 | li r4,KVM_HWTHREAD_IN_IDLE | 325 | li r4,KVM_HWTHREAD_IN_IDLE |
332 | /* DO THIS IN REAL MODE! See comment above. */ | 326 | /* DO THIS IN REAL MODE! See comment above. */ |
333 | stb r4,HSTATE_HWTHREAD_STATE(r13) | 327 | stb r4,HSTATE_HWTHREAD_STATE(r13) |
334 | #endif | 328 | #endif |
335 | power_enter_stop: | ||
336 | /* | 329 | /* |
337 | * Check if we are executing the lite variant with ESL=EC=0 | 330 | * Check if we are executing the lite variant with ESL=EC=0 |
338 | */ | 331 | */ |
@@ -496,18 +489,6 @@ pnv_powersave_wakeup_mce: | |||
496 | 489 | ||
497 | b pnv_powersave_wakeup | 490 | b pnv_powersave_wakeup |
498 | 491 | ||
499 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | ||
500 | kvm_start_guest_check: | ||
501 | li r0,KVM_HWTHREAD_IN_KERNEL | ||
502 | stb r0,HSTATE_HWTHREAD_STATE(r13) | ||
503 | /* Order setting hwthread_state vs. testing hwthread_req */ | ||
504 | sync | ||
505 | lbz r0,HSTATE_HWTHREAD_REQ(r13) | ||
506 | cmpwi r0,0 | ||
507 | beqlr | ||
508 | b kvm_start_guest | ||
509 | #endif | ||
510 | |||
511 | /* | 492 | /* |
512 | * Called from reset vector for powersave wakeups. | 493 | * Called from reset vector for powersave wakeups. |
513 | * cr3 - set to gt if waking up with partial/complete hypervisor state loss | 494 | * cr3 - set to gt if waking up with partial/complete hypervisor state loss |
@@ -532,9 +513,15 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300) | |||
532 | mr r3,r12 | 513 | mr r3,r12 |
533 | 514 | ||
534 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 515 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
535 | BEGIN_FTR_SECTION | 516 | li r0,KVM_HWTHREAD_IN_KERNEL |
536 | bl kvm_start_guest_check | 517 | stb r0,HSTATE_HWTHREAD_STATE(r13) |
537 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) | 518 | /* Order setting hwthread_state vs. testing hwthread_req */ |
519 | sync | ||
520 | lbz r0,HSTATE_HWTHREAD_REQ(r13) | ||
521 | cmpwi r0,0 | ||
522 | beq 1f | ||
523 | b kvm_start_guest | ||
524 | 1: | ||
538 | #endif | 525 | #endif |
539 | 526 | ||
540 | /* Return SRR1 from power7_nap() */ | 527 | /* Return SRR1 from power7_nap() */ |
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 362fbd972f76..9634425f0f39 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c | |||
@@ -2118,15 +2118,6 @@ static int kvmppc_grab_hwthread(int cpu) | |||
2118 | struct paca_struct *tpaca; | 2118 | struct paca_struct *tpaca; |
2119 | long timeout = 10000; | 2119 | long timeout = 10000; |
2120 | 2120 | ||
2121 | /* | ||
2122 | * ISA v3.0 idle routines do not set hwthread_state or test | ||
2123 | * hwthread_req, so they can not grab idle threads. | ||
2124 | */ | ||
2125 | if (cpu_has_feature(CPU_FTR_ARCH_300)) { | ||
2126 | WARN(1, "KVM: can not control sibling threads\n"); | ||
2127 | return -EBUSY; | ||
2128 | } | ||
2129 | |||
2130 | tpaca = &paca[cpu]; | 2121 | tpaca = &paca[cpu]; |
2131 | 2122 | ||
2132 | /* Ensure the thread won't go into the kernel if it wakes */ | 2123 | /* Ensure the thread won't go into the kernel if it wakes */ |
@@ -2161,12 +2152,10 @@ static void kvmppc_release_hwthread(int cpu) | |||
2161 | struct paca_struct *tpaca; | 2152 | struct paca_struct *tpaca; |
2162 | 2153 | ||
2163 | tpaca = &paca[cpu]; | 2154 | tpaca = &paca[cpu]; |
2155 | tpaca->kvm_hstate.hwthread_req = 0; | ||
2164 | tpaca->kvm_hstate.kvm_vcpu = NULL; | 2156 | tpaca->kvm_hstate.kvm_vcpu = NULL; |
2165 | tpaca->kvm_hstate.kvm_vcore = NULL; | 2157 | tpaca->kvm_hstate.kvm_vcore = NULL; |
2166 | tpaca->kvm_hstate.kvm_split_mode = NULL; | 2158 | tpaca->kvm_hstate.kvm_split_mode = NULL; |
2167 | if (!cpu_has_feature(CPU_FTR_ARCH_300)) | ||
2168 | tpaca->kvm_hstate.hwthread_req = 0; | ||
2169 | |||
2170 | } | 2159 | } |
2171 | 2160 | ||
2172 | static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu) | 2161 | static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu) |
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 985bdc0ba1c1..fd2583ddc9a9 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
@@ -150,11 +150,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | |||
150 | subf r4, r4, r3 | 150 | subf r4, r4, r3 |
151 | mtspr SPRN_DEC, r4 | 151 | mtspr SPRN_DEC, r4 |
152 | 152 | ||
153 | BEGIN_FTR_SECTION | ||
154 | /* hwthread_req may have got set by cede or no vcpu, so clear it */ | 153 | /* hwthread_req may have got set by cede or no vcpu, so clear it */ |
155 | li r0, 0 | 154 | li r0, 0 |
156 | stb r0, HSTATE_HWTHREAD_REQ(r13) | 155 | stb r0, HSTATE_HWTHREAD_REQ(r13) |
157 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) | ||
158 | 156 | ||
159 | /* | 157 | /* |
160 | * For external interrupts we need to call the Linux | 158 | * For external interrupts we need to call the Linux |
@@ -317,7 +315,6 @@ kvm_novcpu_exit: | |||
317 | * Relocation is off and most register values are lost. | 315 | * Relocation is off and most register values are lost. |
318 | * r13 points to the PACA. | 316 | * r13 points to the PACA. |
319 | * r3 contains the SRR1 wakeup value, SRR1 is trashed. | 317 | * r3 contains the SRR1 wakeup value, SRR1 is trashed. |
320 | * This is not used by ISAv3.0B processors. | ||
321 | */ | 318 | */ |
322 | .globl kvm_start_guest | 319 | .globl kvm_start_guest |
323 | kvm_start_guest: | 320 | kvm_start_guest: |
@@ -436,9 +433,6 @@ kvm_secondary_got_guest: | |||
436 | * While waiting we also need to check if we get given a vcpu to run. | 433 | * While waiting we also need to check if we get given a vcpu to run. |
437 | */ | 434 | */ |
438 | kvm_no_guest: | 435 | kvm_no_guest: |
439 | BEGIN_FTR_SECTION | ||
440 | twi 31,0,0 | ||
441 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | ||
442 | lbz r3, HSTATE_HWTHREAD_REQ(r13) | 436 | lbz r3, HSTATE_HWTHREAD_REQ(r13) |
443 | cmpwi r3, 0 | 437 | cmpwi r3, 0 |
444 | bne 53f | 438 | bne 53f |
@@ -2544,10 +2538,8 @@ kvm_do_nap: | |||
2544 | clrrdi r0, r0, 1 | 2538 | clrrdi r0, r0, 1 |
2545 | mtspr SPRN_CTRLT, r0 | 2539 | mtspr SPRN_CTRLT, r0 |
2546 | 2540 | ||
2547 | BEGIN_FTR_SECTION | ||
2548 | li r0,1 | 2541 | li r0,1 |
2549 | stb r0,HSTATE_HWTHREAD_REQ(r13) | 2542 | stb r0,HSTATE_HWTHREAD_REQ(r13) |
2550 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) | ||
2551 | mfspr r5,SPRN_LPCR | 2543 | mfspr r5,SPRN_LPCR |
2552 | ori r5,r5,LPCR_PECE0 | LPCR_PECE1 | 2544 | ori r5,r5,LPCR_PECE0 | LPCR_PECE1 |
2553 | BEGIN_FTR_SECTION | 2545 | BEGIN_FTR_SECTION |
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 3480faaf1ef8..a3746b98ec11 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c | |||
@@ -644,8 +644,8 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
644 | break; | 644 | break; |
645 | #endif | 645 | #endif |
646 | case KVM_CAP_PPC_HTM: | 646 | case KVM_CAP_PPC_HTM: |
647 | r = cpu_has_feature(CPU_FTR_TM_COMP) && | 647 | r = is_kvmppc_hv_enabled(kvm) && |
648 | is_kvmppc_hv_enabled(kvm); | 648 | (cur_cpu_spec->cpu_user_features2 & PPC_FEATURE2_HTM_COMP); |
649 | break; | 649 | break; |
650 | default: | 650 | default: |
651 | r = 0; | 651 | r = 0; |