If the guest hypervisor node contains "has-idle" property.

Signed-off-by: Liu Yu <[email protected]>
---
 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-ppc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to