diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 63a77ca..4a137d9 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2539,6 +2539,12 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
 	case KVM_HC_MMU_OP:
 		r = kvm_pv_mmu_op(vcpu, a0, hc_gpa(vcpu, a1, a2), &ret);
 		break;
+	case KVM_DELAY: {
+		u32 wait; /* make it 64 */
+		wait = a0 / cpu_data(raw_smp_processor_id()).loops_per_jiffy;
+		ret = schedule_timeout_uninterruptible(wait);
+		break;
+	}
 	default:
 		ret = -KVM_ENOSYS;
 		break;
diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c
index f456860..28fd9a0 100644
--- a/arch/x86/lib/delay.c
+++ b/arch/x86/lib/delay.c
@@ -17,6 +17,7 @@
 #include <linux/preempt.h>
 #include <linux/delay.h>
 #include <linux/init.h>
+#include <linux/kvm_para.h>
 
 #include <asm/processor.h>
 #include <asm/delay.h>
@@ -84,6 +85,10 @@ static void delay_tsc(unsigned long loops)
 	preempt_enable();
 }
 
+static void delay_pv(unsigned long loops)
+{
+	kvm_hypercall1(KVM_DELAY, loops);
+}
 /*
  * Since we calibrate only once at boot, this
  * function should be set once at boot and not changed
@@ -106,7 +111,10 @@ int __devinit read_current_timer(unsigned long *timer_val)
 
 void __delay(unsigned long loops)
 {
-	delay_fn(loops);
+	if (paravirt_enabled())
+		delay_pv(loops);
+	else
+		delay_fn(loops);
 }
 EXPORT_SYMBOL(__delay);
 
diff --git a/include/asm-x86/kvm_para.h b/include/asm-x86/kvm_para.h
index bfd9900..00fc997 100644
--- a/include/asm-x86/kvm_para.h
+++ b/include/asm-x86/kvm_para.h
@@ -23,6 +23,7 @@
 #define KVM_MMU_OP_WRITE_PTE            1
 #define KVM_MMU_OP_FLUSH_TLB	        2
 #define KVM_MMU_OP_RELEASE_PT	        3
+#define KVM_DELAY			4
 
 /* Payload for KVM_HC_MMU_OP */
 struct kvm_mmu_op_header {
