mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
KVM: PPC: Book3S HV P9: Reduce mftb per guest entry/exit
mftb is serialising (dispatch next-to-complete) so it is heavy weight for a mfspr. Avoid reading it multiple times in the entry or exit paths. A small number of cycles delay to timers is tolerable. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211123095231.1036501-7-npiggin@gmail.com
This commit is contained in:
parent
9581991a60
commit
34bf08a207
@ -3940,7 +3940,7 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||
*
|
||||
* XXX: Another day's problem.
|
||||
*/
|
||||
mtspr(SPRN_DEC, vcpu->arch.dec_expires - mftb());
|
||||
mtspr(SPRN_DEC, vcpu->arch.dec_expires - tb);
|
||||
|
||||
if (kvmhv_on_pseries()) {
|
||||
/*
|
||||
@ -4063,7 +4063,7 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||
vc->in_guest = 0;
|
||||
|
||||
next_timer = timer_get_next_tb();
|
||||
set_dec(next_timer - mftb());
|
||||
set_dec(next_timer - tb);
|
||||
/* We may have raced with new irq work */
|
||||
if (test_irq_work_pending())
|
||||
set_dec(1);
|
||||
|
@ -203,7 +203,8 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
||||
unsigned long host_dawr1;
|
||||
unsigned long host_dawrx1;
|
||||
|
||||
hdec = time_limit - mftb();
|
||||
tb = mftb();
|
||||
hdec = time_limit - tb;
|
||||
if (hdec < 0)
|
||||
return BOOK3S_INTERRUPT_HV_DECREMENTER;
|
||||
|
||||
@ -215,7 +216,7 @@ int kvmhv_vcpu_entry_p9(struct kvm_vcpu *vcpu, u64 time_limit, unsigned long lpc
|
||||
vcpu->arch.ceded = 0;
|
||||
|
||||
if (vc->tb_offset) {
|
||||
u64 new_tb = mftb() + vc->tb_offset;
|
||||
u64 new_tb = tb + vc->tb_offset;
|
||||
mtspr(SPRN_TBU40, new_tb);
|
||||
tb = mftb();
|
||||
if ((tb & 0xffffff) < (new_tb & 0xffffff))
|
||||
|
Loading…
Reference in New Issue
Block a user