Revert "KVM: PPC: Book3S HV: POWER9 does not require secondary thread management"
authorPaul Mackerras <paulus@ozlabs.org>
Thu, 19 Oct 2017 04:14:20 +0000 (15:14 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 19 Oct 2017 04:28:04 +0000 (15:28 +1100)
This reverts commit 94a04bc25a2c6296bd0c5e82c10e8231c2b11f77.

In order to run HPT guests on a radix POWER9 host, we will have to run
the host in single-threaded mode, because POWER9 processors do not
currently support running some threads of a core in HPT mode while
others are in radix mode ("mixed mode").

That means that we will need the same mechanisms that are used on
POWER8 to make the secondary threads available to KVM, which were
disabled on POWER9 by commit 94a04bc25a2c.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/kvm_book3s_asm.h
arch/powerpc/kernel/idle_book3s.S
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv_rmhandlers.S

index 83596f32f50b49672d7ced5f3ee806c921406114..7cea76f11c26c66fc52e08aae5b37e6534ac79a8 100644 (file)
@@ -104,10 +104,6 @@ struct kvmppc_host_state {
        u8 napping;
 
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
-       /*
-        * hwthread_req/hwthread_state pair is used to pull sibling threads
-        * out of guest on pre-ISAv3.0B CPUs where threads share MMU.
-        */
        u8 hwthread_req;
        u8 hwthread_state;
        u8 host_ipi;
index 1125c9be9e067683c43c583d1672b1b6d3269840..175d49f468af2bcb442794093dc6c2242b0d857f 100644 (file)
@@ -319,20 +319,13 @@ enter_winkle:
 /*
  * r3 - PSSCR value corresponding to the requested stop state.
  */
+power_enter_stop:
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
-power_enter_stop_kvm_rm:
-       /*
-        * This is currently unused because POWER9 KVM does not have to
-        * gather secondary threads into sibling mode, but the code is
-        * here in case that function is required.
-        *
-        * Tell KVM we're entering idle.
-        */
+       /* Tell KVM we're entering idle */
        li      r4,KVM_HWTHREAD_IN_IDLE
        /* DO THIS IN REAL MODE!  See comment above. */
        stb     r4,HSTATE_HWTHREAD_STATE(r13)
 #endif
-power_enter_stop:
 /*
  * Check if we are executing the lite variant with ESL=EC=0
  */
@@ -496,18 +489,6 @@ pnv_powersave_wakeup_mce:
 
        b       pnv_powersave_wakeup
 
-#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
-kvm_start_guest_check:
-       li      r0,KVM_HWTHREAD_IN_KERNEL
-       stb     r0,HSTATE_HWTHREAD_STATE(r13)
-       /* Order setting hwthread_state vs. testing hwthread_req */
-       sync
-       lbz     r0,HSTATE_HWTHREAD_REQ(r13)
-       cmpwi   r0,0
-       beqlr
-       b       kvm_start_guest
-#endif
-
 /*
  * Called from reset vector for powersave wakeups.
  * 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)
        mr      r3,r12
 
 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
-BEGIN_FTR_SECTION
-       bl      kvm_start_guest_check
-END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
+       li      r0,KVM_HWTHREAD_IN_KERNEL
+       stb     r0,HSTATE_HWTHREAD_STATE(r13)
+       /* Order setting hwthread_state vs. testing hwthread_req */
+       sync
+       lbz     r0,HSTATE_HWTHREAD_REQ(r13)
+       cmpwi   r0,0
+       beq     1f
+       b       kvm_start_guest
+1:
 #endif
 
        /* Return SRR1 from power7_nap() */
index 73bf1ebfa78fcc7ef74dd51713d800ea12e9e745..8f34715cfbff489ba37f763acf1e370b5fe6b5b4 100644 (file)
@@ -2117,15 +2117,6 @@ static int kvmppc_grab_hwthread(int cpu)
        struct paca_struct *tpaca;
        long timeout = 10000;
 
-       /*
-        * ISA v3.0 idle routines do not set hwthread_state or test
-        * hwthread_req, so they can not grab idle threads.
-        */
-       if (cpu_has_feature(CPU_FTR_ARCH_300)) {
-               WARN(1, "KVM: can not control sibling threads\n");
-               return -EBUSY;
-       }
-
        tpaca = &paca[cpu];
 
        /* Ensure the thread won't go into the kernel if it wakes */
@@ -2160,12 +2151,10 @@ static void kvmppc_release_hwthread(int cpu)
        struct paca_struct *tpaca;
 
        tpaca = &paca[cpu];
+       tpaca->kvm_hstate.hwthread_req = 0;
        tpaca->kvm_hstate.kvm_vcpu = NULL;
        tpaca->kvm_hstate.kvm_vcore = NULL;
        tpaca->kvm_hstate.kvm_split_mode = NULL;
-       if (!cpu_has_feature(CPU_FTR_ARCH_300))
-               tpaca->kvm_hstate.hwthread_req = 0;
-
 }
 
 static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu)
index 17936f82d3c787c38327f41186f634d043d843a9..fb02209ff782f963daaa96b9e26cdb94b21ad640 100644 (file)
@@ -149,11 +149,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
        subf    r4, r4, r3
        mtspr   SPRN_DEC, r4
 
-BEGIN_FTR_SECTION
        /* hwthread_req may have got set by cede or no vcpu, so clear it */
        li      r0, 0
        stb     r0, HSTATE_HWTHREAD_REQ(r13)
-END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
 
        /*
         * For external interrupts we need to call the Linux
@@ -316,7 +314,6 @@ kvm_novcpu_exit:
  * Relocation is off and most register values are lost.
  * r13 points to the PACA.
  * r3 contains the SRR1 wakeup value, SRR1 is trashed.
- * This is not used by ISAv3.0B processors.
  */
        .globl  kvm_start_guest
 kvm_start_guest:
@@ -435,9 +432,6 @@ kvm_secondary_got_guest:
  * While waiting we also need to check if we get given a vcpu to run.
  */
 kvm_no_guest:
-BEGIN_FTR_SECTION
-       twi     31,0,0
-END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
        lbz     r3, HSTATE_HWTHREAD_REQ(r13)
        cmpwi   r3, 0
        bne     53f
@@ -2531,10 +2525,8 @@ kvm_do_nap:
        clrrdi  r0, r0, 1
        mtspr   SPRN_CTRLT, r0
 
-BEGIN_FTR_SECTION
        li      r0,1
        stb     r0,HSTATE_HWTHREAD_REQ(r13)
-END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
        mfspr   r5,SPRN_LPCR
        ori     r5,r5,LPCR_PECE0 | LPCR_PECE1
 BEGIN_FTR_SECTION