diff options
Diffstat (limited to 'arch/x86/kvm/i8254.c')
| -rw-r--r-- | arch/x86/kvm/i8254.c | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index 412a5aa0ef9..518d86471b7 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -37,6 +37,7 @@  #include "irq.h"  #include "i8254.h" +#include "x86.h"  #ifndef CONFIG_X86_64  #define mod_64(x, y) ((x) - (y) * div64_u64(x, y)) @@ -349,6 +350,23 @@ static void create_pit_timer(struct kvm *kvm, u32 val, int is_period)  	atomic_set(&ps->pending, 0);  	ps->irq_ack = 1; +	/* +	 * Do not allow the guest to program periodic timers with small +	 * interval, since the hrtimers are not throttled by the host +	 * scheduler. +	 */ +	if (ps->is_periodic) { +		s64 min_period = min_timer_period_us * 1000LL; + +		if (ps->period < min_period) { +			pr_info_ratelimited( +			    "kvm: requested %lld ns " +			    "i8254 timer period limited to %lld ns\n", +			    ps->period, min_period); +			ps->period = min_period; +		} +	} +  	hrtimer_start(&ps->timer, ktime_add_ns(ktime_get(), interval),  		      HRTIMER_MODE_ABS);  }  | 
