@@ -446,12 +446,7 @@ static void kvmppc_dump_regs(struct kvm_vcpu *vcpu)
446446
447447static struct kvm_vcpu * kvmppc_find_vcpu (struct kvm * kvm , int id )
448448{
449- struct kvm_vcpu * ret ;
450-
451- mutex_lock (& kvm -> lock );
452- ret = kvm_get_vcpu_by_id (kvm , id );
453- mutex_unlock (& kvm -> lock );
454- return ret ;
449+ return kvm_get_vcpu_by_id (kvm , id );
455450}
456451
457452static void init_vpa (struct kvm_vcpu * vcpu , struct lppaca * vpa )
@@ -1583,7 +1578,6 @@ static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr,
15831578 struct kvmppc_vcore * vc = vcpu -> arch .vcore ;
15841579 u64 mask ;
15851580
1586- mutex_lock (& kvm -> lock );
15871581 spin_lock (& vc -> lock );
15881582 /*
15891583 * If ILE (interrupt little-endian) has changed, update the
@@ -1623,7 +1617,6 @@ static void kvmppc_set_lpcr(struct kvm_vcpu *vcpu, u64 new_lpcr,
16231617 mask &= 0xFFFFFFFF ;
16241618 vc -> lpcr = (vc -> lpcr & ~mask ) | (new_lpcr & mask );
16251619 spin_unlock (& vc -> lock );
1626- mutex_unlock (& kvm -> lock );
16271620}
16281621
16291622static int kvmppc_get_one_reg_hv (struct kvm_vcpu * vcpu , u64 id ,
@@ -2338,11 +2331,17 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
23382331 pr_devel ("KVM: collision on id %u" , id );
23392332 vcore = NULL ;
23402333 } else if (!vcore ) {
2334+ /*
2335+ * Take mmu_setup_lock for mutual exclusion
2336+ * with kvmppc_update_lpcr().
2337+ */
23412338 err = - ENOMEM ;
23422339 vcore = kvmppc_vcore_create (kvm ,
23432340 id & ~(kvm -> arch .smt_mode - 1 ));
2341+ mutex_lock (& kvm -> arch .mmu_setup_lock );
23442342 kvm -> arch .vcores [core ] = vcore ;
23452343 kvm -> arch .online_vcores ++ ;
2344+ mutex_unlock (& kvm -> arch .mmu_setup_lock );
23462345 }
23472346 }
23482347 mutex_unlock (& kvm -> lock );
@@ -3663,6 +3662,7 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit,
36633662 vc -> in_guest = 0 ;
36643663
36653664 mtspr (SPRN_DEC , local_paca -> kvm_hstate .dec_expires - mftb ());
3665+ mtspr (SPRN_SPRG_VDSO_WRITE , local_paca -> sprg_vdso );
36663666
36673667 kvmhv_load_host_pmu ();
36683668
@@ -3859,7 +3859,7 @@ static int kvmhv_setup_mmu(struct kvm_vcpu *vcpu)
38593859 int r = 0 ;
38603860 struct kvm * kvm = vcpu -> kvm ;
38613861
3862- mutex_lock (& kvm -> lock );
3862+ mutex_lock (& kvm -> arch . mmu_setup_lock );
38633863 if (!kvm -> arch .mmu_ready ) {
38643864 if (!kvm_is_radix (kvm ))
38653865 r = kvmppc_hv_setup_htab_rma (vcpu );
@@ -3869,7 +3869,7 @@ static int kvmhv_setup_mmu(struct kvm_vcpu *vcpu)
38693869 kvm -> arch .mmu_ready = 1 ;
38703870 }
38713871 }
3872- mutex_unlock (& kvm -> lock );
3872+ mutex_unlock (& kvm -> arch . mmu_setup_lock );
38733873 return r ;
38743874}
38753875
@@ -4091,16 +4091,20 @@ int kvmhv_run_single_vcpu(struct kvm_run *kvm_run,
40914091 kvmppc_check_need_tlb_flush (kvm , pcpu , nested );
40924092 }
40934093
4094- trace_hardirqs_on ();
40954094 guest_enter_irqoff ();
40964095
40974096 srcu_idx = srcu_read_lock (& kvm -> srcu );
40984097
40994098 this_cpu_disable_ftrace ();
41004099
4100+ /* Tell lockdep that we're about to enable interrupts */
4101+ trace_hardirqs_on ();
4102+
41014103 trap = kvmhv_p9_guest_entry (vcpu , time_limit , lpcr );
41024104 vcpu -> arch .trap = trap ;
41034105
4106+ trace_hardirqs_off ();
4107+
41044108 this_cpu_enable_ftrace ();
41054109
41064110 srcu_read_unlock (& kvm -> srcu , srcu_idx );
@@ -4110,7 +4114,6 @@ int kvmhv_run_single_vcpu(struct kvm_run *kvm_run,
41104114 isync ();
41114115 }
41124116
4113- trace_hardirqs_off ();
41144117 set_irq_happened (trap );
41154118
41164119 kvmppc_set_host_core (pcpu );
@@ -4478,7 +4481,8 @@ static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm,
44784481
44794482/*
44804483 * Update LPCR values in kvm->arch and in vcores.
4481- * Caller must hold kvm->lock.
4484+ * Caller must hold kvm->arch.mmu_setup_lock (for mutual exclusion
4485+ * of kvm->arch.lpcr update).
44824486 */
44834487void kvmppc_update_lpcr (struct kvm * kvm , unsigned long lpcr , unsigned long mask )
44844488{
@@ -4530,7 +4534,7 @@ void kvmppc_setup_partition_table(struct kvm *kvm)
45304534
45314535/*
45324536 * Set up HPT (hashed page table) and RMA (real-mode area).
4533- * Must be called with kvm->lock held.
4537+ * Must be called with kvm->arch.mmu_setup_lock held.
45344538 */
45354539static int kvmppc_hv_setup_htab_rma (struct kvm_vcpu * vcpu )
45364540{
@@ -4618,7 +4622,10 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
46184622 goto out_srcu ;
46194623}
46204624
4621- /* Must be called with kvm->lock held and mmu_ready = 0 and no vcpus running */
4625+ /*
4626+ * Must be called with kvm->arch.mmu_setup_lock held and
4627+ * mmu_ready = 0 and no vcpus running.
4628+ */
46224629int kvmppc_switch_mmu_to_hpt (struct kvm * kvm )
46234630{
46244631 if (nesting_enabled (kvm ))
@@ -4635,7 +4642,10 @@ int kvmppc_switch_mmu_to_hpt(struct kvm *kvm)
46354642 return 0 ;
46364643}
46374644
4638- /* Must be called with kvm->lock held and mmu_ready = 0 and no vcpus running */
4645+ /*
4646+ * Must be called with kvm->arch.mmu_setup_lock held and
4647+ * mmu_ready = 0 and no vcpus running.
4648+ */
46394649int kvmppc_switch_mmu_to_radix (struct kvm * kvm )
46404650{
46414651 int err ;
@@ -4740,6 +4750,8 @@ static int kvmppc_core_init_vm_hv(struct kvm *kvm)
47404750 char buf [32 ];
47414751 int ret ;
47424752
4753+ mutex_init (& kvm -> arch .mmu_setup_lock );
4754+
47434755 /* Allocate the guest's logical partition ID */
47444756
47454757 lpid = kvmppc_alloc_lpid ();
@@ -5265,7 +5277,7 @@ static int kvmhv_configure_mmu(struct kvm *kvm, struct kvm_ppc_mmuv3_cfg *cfg)
52655277 if (kvmhv_on_pseries () && !radix )
52665278 return - EINVAL ;
52675279
5268- mutex_lock (& kvm -> lock );
5280+ mutex_lock (& kvm -> arch . mmu_setup_lock );
52695281 if (radix != kvm_is_radix (kvm )) {
52705282 if (kvm -> arch .mmu_ready ) {
52715283 kvm -> arch .mmu_ready = 0 ;
@@ -5293,7 +5305,7 @@ static int kvmhv_configure_mmu(struct kvm *kvm, struct kvm_ppc_mmuv3_cfg *cfg)
52935305 err = 0 ;
52945306
52955307 out_unlock :
5296- mutex_unlock (& kvm -> lock );
5308+ mutex_unlock (& kvm -> arch . mmu_setup_lock );
52975309 return err ;
52985310}
52995311
0 commit comments