@@ -233,20 +233,21 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
233233
234234 /* copy parameters in */
235235 hv_ptr = kvmppc_get_gpr (vcpu , 4 );
236+ regs_ptr = kvmppc_get_gpr (vcpu , 5 );
237+ vcpu -> srcu_idx = srcu_read_lock (& vcpu -> kvm -> srcu );
236238 err = kvm_vcpu_read_guest (vcpu , hv_ptr , & l2_hv ,
237- sizeof (struct hv_guest_state ));
239+ sizeof (struct hv_guest_state )) ||
240+ kvm_vcpu_read_guest (vcpu , regs_ptr , & l2_regs ,
241+ sizeof (struct pt_regs ));
242+ srcu_read_unlock (& vcpu -> kvm -> srcu , vcpu -> srcu_idx );
238243 if (err )
239244 return H_PARAMETER ;
245+
240246 if (kvmppc_need_byteswap (vcpu ))
241247 byteswap_hv_regs (& l2_hv );
242248 if (l2_hv .version != HV_GUEST_STATE_VERSION )
243249 return H_P2 ;
244250
245- regs_ptr = kvmppc_get_gpr (vcpu , 5 );
246- err = kvm_vcpu_read_guest (vcpu , regs_ptr , & l2_regs ,
247- sizeof (struct pt_regs ));
248- if (err )
249- return H_PARAMETER ;
250251 if (kvmppc_need_byteswap (vcpu ))
251252 byteswap_pt_regs (& l2_regs );
252253 if (l2_hv .vcpu_token >= NR_CPUS )
@@ -323,12 +324,12 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
323324 byteswap_hv_regs (& l2_hv );
324325 byteswap_pt_regs (& l2_regs );
325326 }
327+ vcpu -> srcu_idx = srcu_read_lock (& vcpu -> kvm -> srcu );
326328 err = kvm_vcpu_write_guest (vcpu , hv_ptr , & l2_hv ,
327- sizeof (struct hv_guest_state ));
328- if (err )
329- return H_AUTHORITY ;
330- err = kvm_vcpu_write_guest (vcpu , regs_ptr , & l2_regs ,
329+ sizeof (struct hv_guest_state )) ||
330+ kvm_vcpu_write_guest (vcpu , regs_ptr , & l2_regs ,
331331 sizeof (struct pt_regs ));
332+ srcu_read_unlock (& vcpu -> kvm -> srcu , vcpu -> srcu_idx );
332333 if (err )
333334 return H_AUTHORITY ;
334335
@@ -508,12 +509,16 @@ long kvmhv_copy_tofrom_guest_nested(struct kvm_vcpu *vcpu)
508509 goto not_found ;
509510
510511 /* Write what was loaded into our buffer back to the L1 guest */
512+ vcpu -> srcu_idx = srcu_read_lock (& vcpu -> kvm -> srcu );
511513 rc = kvm_vcpu_write_guest (vcpu , gp_to , buf , n );
514+ srcu_read_unlock (& vcpu -> kvm -> srcu , vcpu -> srcu_idx );
512515 if (rc )
513516 goto not_found ;
514517 } else {
515518 /* Load the data to be stored from the L1 guest into our buf */
519+ vcpu -> srcu_idx = srcu_read_lock (& vcpu -> kvm -> srcu );
516520 rc = kvm_vcpu_read_guest (vcpu , gp_from , buf , n );
521+ srcu_read_unlock (& vcpu -> kvm -> srcu , vcpu -> srcu_idx );
517522 if (rc )
518523 goto not_found ;
519524
@@ -548,9 +553,12 @@ static void kvmhv_update_ptbl_cache(struct kvm_nested_guest *gp)
548553
549554 ret = - EFAULT ;
550555 ptbl_addr = (kvm -> arch .l1_ptcr & PRTB_MASK ) + (gp -> l1_lpid << 4 );
551- if (gp -> l1_lpid < (1ul << ((kvm -> arch .l1_ptcr & PRTS_MASK ) + 8 )))
556+ if (gp -> l1_lpid < (1ul << ((kvm -> arch .l1_ptcr & PRTS_MASK ) + 8 ))) {
557+ int srcu_idx = srcu_read_lock (& kvm -> srcu );
552558 ret = kvm_read_guest (kvm , ptbl_addr ,
553559 & ptbl_entry , sizeof (ptbl_entry ));
560+ srcu_read_unlock (& kvm -> srcu , srcu_idx );
561+ }
554562 if (ret ) {
555563 gp -> l1_gr_to_hr = 0 ;
556564 gp -> process_table = 0 ;
0 commit comments