aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@ozlabs.org>2017-11-01 00:33:39 -0400
committerPaul Mackerras <paulus@ozlabs.org>2017-11-01 00:33:39 -0400
commit3e8f150a3bc30214c15e5f8d27e4b2d904bd929e (patch)
tree0b7aec14c8340153c58fb7354f923ec4a1bb4e7a
parent93897a1f4b1a96171b4a445207a371df1b0d4601 (diff)
parent2a3d6553cbd791da4fb624c2500b4580b3f9d72f (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.h4
-rw-r--r--arch/powerpc/kernel/idle_book3s.S35
-rw-r--r--arch/powerpc/kvm/book3s_hv.c13
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S8
-rw-r--r--arch/powerpc/kvm/powerpc.c4
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 */
322power_enter_stop:
322#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE 323#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
323power_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
335power_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
500kvm_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
535BEGIN_FTR_SECTION 516 li r0,KVM_HWTHREAD_IN_KERNEL
536 bl kvm_start_guest_check 517 stb r0,HSTATE_HWTHREAD_STATE(r13)
537END_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
5241:
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
2172static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu) 2161static 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
153BEGIN_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)
157END_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
323kvm_start_guest: 320kvm_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 */
438kvm_no_guest: 435kvm_no_guest:
439BEGIN_FTR_SECTION
440 twi 31,0,0
441END_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
2547BEGIN_FTR_SECTION
2548 li r0,1 2541 li r0,1
2549 stb r0,HSTATE_HWTHREAD_REQ(r13) 2542 stb r0,HSTATE_HWTHREAD_REQ(r13)
2550END_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
2553BEGIN_FTR_SECTION 2545BEGIN_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;