If the guest hypervisor node contains "has-idle" property. Signed-off-by: Liu Yu <yu.liu@xxxxxxxxxxxxx> --- arch/powerpc/kernel/kvm.c | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c index b06bdae..258f129 100644 --- a/arch/powerpc/kernel/kvm.c +++ b/arch/powerpc/kernel/kvm.c @@ -28,6 +28,7 @@ #include <asm/sections.h> #include <asm/cacheflush.h> #include <asm/disassemble.h> +#include <asm/machdep.h> #define KVM_MAGIC_PAGE (-4096L) #define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x) @@ -571,6 +572,30 @@ static __init void kvm_free_tmp(void) } } +static void kvm_hcall_ev_idle(void) +{ + ulong in[8]; + ulong out[8]; + + current_thread_info()->local_flags |= _TLF_NAPPING; + local_irq_enable(); + kvm_hypercall(in, out, HC_VENDOR_EPAPR | HC_EV_IDLE); +} + +static int kvm_para_ev_has_idle(void) +{ + struct device_node *hyper_node; + + hyper_node = of_find_node_by_path("/hypervisor"); + if (!hyper_node) + return 0; + + if (of_get_property(hyper_node, "has-idle", NULL)) + return 1; + + return 0; +} + static int __init kvm_guest_init(void) { if (!kvm_para_available()) @@ -587,6 +612,10 @@ static int __init kvm_guest_init(void) powersave_nap = 1; #endif + /* Install hcall EV_IDLE based power_save for guest kernel */ + if (kvm_para_ev_has_idle()) + ppc_md.power_save = kvm_hcall_ev_idle; + free_tmp: kvm_free_tmp(); -- 1.6.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html