Message ID | 20120709062053.24030.52767.sendpatchset@codeblue (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 07/09/2012 02:20 AM, Raghavendra K T wrote: > +bool kvm_arch_vcpu_check_and_update_eligible(struct kvm_vcpu *vcpu) > +{ > + bool eligible; > + > + eligible = !vcpu->arch.plo.pause_loop_exited || > + (vcpu->arch.plo.pause_loop_exited&& > + vcpu->arch.plo.dy_eligible); > + > + if (vcpu->arch.plo.pause_loop_exited) > + vcpu->arch.plo.dy_eligible = !vcpu->arch.plo.dy_eligible; > + > + return eligible; > +} This is a nice simple mechanism to skip CPUs that were eligible last time and had pause loop exits recently. However, it could stand some documentation. Please add a good comment explaining how and why the algorithm works, when arch.plo.pause_loop_exited is cleared, etc... It would be good to make this heuristic understandable to people who look at the code for the first time.
On 07/10/2012 04:00 AM, Rik van Riel wrote: > On 07/09/2012 02:20 AM, Raghavendra K T wrote: > >> +bool kvm_arch_vcpu_check_and_update_eligible(struct kvm_vcpu *vcpu) >> +{ >> + bool eligible; >> + >> + eligible = !vcpu->arch.plo.pause_loop_exited || >> + (vcpu->arch.plo.pause_loop_exited&& >> + vcpu->arch.plo.dy_eligible); >> + >> + if (vcpu->arch.plo.pause_loop_exited) >> + vcpu->arch.plo.dy_eligible = !vcpu->arch.plo.dy_eligible; >> + >> + return eligible; >> +} > > This is a nice simple mechanism to skip CPUs that were > eligible last time and had pause loop exits recently. > > However, it could stand some documentation. Please > add a good comment explaining how and why the algorithm > works, when arch.plo.pause_loop_exited is cleared, etc... > > It would be good to make this heuristic understandable > to people who look at the code for the first time. > Thanks for the review. will do more documentation. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index dd17537..884f2c4 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -256,5 +256,10 @@ struct kvm_arch{ struct gmap *gmap; }; +static inline bool kvm_arch_vcpu_check_and_update_eligible(struct kvm_vcpu *v) +{ + return true; +} + extern int sie64a(struct kvm_s390_sie_block *, u64 *); #endif diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 857ca68..ce01db3 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -962,7 +962,7 @@ extern bool kvm_find_async_pf_gfn(struct kvm_vcpu *vcpu, gfn_t gfn); void kvm_complete_insn_gp(struct kvm_vcpu *vcpu, int err); int kvm_is_in_guest(void); - +bool kvm_arch_vcpu_check_and_update_eligible(struct kvm_vcpu *vcpu); void kvm_pmu_init(struct kvm_vcpu *vcpu); void kvm_pmu_destroy(struct kvm_vcpu *vcpu); void kvm_pmu_reset(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 07dbd14..24ceae8 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6623,6 +6623,20 @@ bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu) kvm_x86_ops->interrupt_allowed(vcpu); } +bool kvm_arch_vcpu_check_and_update_eligible(struct kvm_vcpu *vcpu) +{ + bool eligible; + + eligible = !vcpu->arch.plo.pause_loop_exited || + (vcpu->arch.plo.pause_loop_exited && + vcpu->arch.plo.dy_eligible); + + if (vcpu->arch.plo.pause_loop_exited) + vcpu->arch.plo.dy_eligible = !vcpu->arch.plo.dy_eligible; + + return eligible; +} + EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_inj_virq); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_page_fault); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 7e14068..519321a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1595,6 +1595,9 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me) continue; if (waitqueue_active(&vcpu->wq)) continue; + if (!kvm_arch_vcpu_check_and_update_eligible(vcpu)) { + continue; + } if (kvm_vcpu_yield_to(vcpu)) { kvm->last_boosted_vcpu = i; yielded = 1;