diff options
Diffstat (limited to 'arch/x86/kvm/i8254.c')
| -rw-r--r-- | arch/x86/kvm/i8254.c | 64 | 
1 files changed, 25 insertions, 39 deletions
diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c index adba28f88d1..11300d2fa71 100644 --- a/arch/x86/kvm/i8254.c +++ b/arch/x86/kvm/i8254.c @@ -108,7 +108,7 @@ static s64 __kpit_elapsed(struct kvm *kvm)  	ktime_t remaining;  	struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; -	if (!ps->pit_timer.period) +	if (!ps->period)  		return 0;  	/* @@ -120,9 +120,9 @@ static s64 __kpit_elapsed(struct kvm *kvm)  	 * itself with the initial count and continues counting  	 * from there.  	 */ -	remaining = hrtimer_get_remaining(&ps->pit_timer.timer); -	elapsed = ps->pit_timer.period - ktime_to_ns(remaining); -	elapsed = mod_64(elapsed, ps->pit_timer.period); +	remaining = hrtimer_get_remaining(&ps->timer); +	elapsed = ps->period - ktime_to_ns(remaining); +	elapsed = mod_64(elapsed, ps->period);  	return elapsed;  } @@ -238,12 +238,12 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)  	int value;  	spin_lock(&ps->inject_lock); -	value = atomic_dec_return(&ps->pit_timer.pending); +	value = atomic_dec_return(&ps->pending);  	if (value < 0)  		/* spurious acks can be generated if, for example, the  		 * PIC is being reset.  Handle it gracefully here  		 */ -		atomic_inc(&ps->pit_timer.pending); +		atomic_inc(&ps->pending);  	else if (value > 0)  		/* in this case, we had multiple outstanding pit interrupts  		 * that we needed to inject.  Reinject @@ -261,28 +261,17 @@ void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)  	if (!kvm_vcpu_is_bsp(vcpu) || !pit)  		return; -	timer = &pit->pit_state.pit_timer.timer; +	timer = &pit->pit_state.timer;  	if (hrtimer_cancel(timer))  		hrtimer_start_expires(timer, HRTIMER_MODE_ABS);  }  static void destroy_pit_timer(struct kvm_pit *pit)  { -	hrtimer_cancel(&pit->pit_state.pit_timer.timer); +	hrtimer_cancel(&pit->pit_state.timer);  	flush_kthread_work(&pit->expired);  } -static bool kpit_is_periodic(struct kvm_timer *ktimer) -{ -	struct kvm_kpit_state *ps = container_of(ktimer, struct kvm_kpit_state, -						 pit_timer); -	return ps->is_periodic; -} - -static struct kvm_timer_ops kpit_ops = { -	.is_periodic = kpit_is_periodic, -}; -  static void pit_do_work(struct kthread_work *work)  {  	struct kvm_pit *pit = container_of(work, struct kvm_pit, expired); @@ -322,16 +311,16 @@ static void pit_do_work(struct kthread_work *work)  static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)  { -	struct kvm_timer *ktimer = container_of(data, struct kvm_timer, timer); -	struct kvm_pit *pt = ktimer->kvm->arch.vpit; +	struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, timer); +	struct kvm_pit *pt = ps->kvm->arch.vpit; -	if (ktimer->reinject || !atomic_read(&ktimer->pending)) { -		atomic_inc(&ktimer->pending); +	if (ps->reinject || !atomic_read(&ps->pending)) { +		atomic_inc(&ps->pending);  		queue_kthread_work(&pt->worker, &pt->expired);  	} -	if (ktimer->t_ops->is_periodic(ktimer)) { -		hrtimer_add_expires_ns(&ktimer->timer, ktimer->period); +	if (ps->is_periodic) { +		hrtimer_add_expires_ns(&ps->timer, ps->period);  		return HRTIMER_RESTART;  	} else  		return HRTIMER_NORESTART; @@ -340,7 +329,6 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)  static void create_pit_timer(struct kvm *kvm, u32 val, int is_period)  {  	struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; -	struct kvm_timer *pt = &ps->pit_timer;  	s64 interval;  	if (!irqchip_in_kernel(kvm) || ps->flags & KVM_PIT_FLAGS_HPET_LEGACY) @@ -351,19 +339,18 @@ static void create_pit_timer(struct kvm *kvm, u32 val, int is_period)  	pr_debug("create pit timer, interval is %llu nsec\n", interval);  	/* TODO The new value only affected after the retriggered */ -	hrtimer_cancel(&pt->timer); +	hrtimer_cancel(&ps->timer);  	flush_kthread_work(&ps->pit->expired); -	pt->period = interval; +	ps->period = interval;  	ps->is_periodic = is_period; -	pt->timer.function = pit_timer_fn; -	pt->t_ops = &kpit_ops; -	pt->kvm = ps->pit->kvm; +	ps->timer.function = pit_timer_fn; +	ps->kvm = ps->pit->kvm; -	atomic_set(&pt->pending, 0); +	atomic_set(&ps->pending, 0);  	ps->irq_ack = 1; -	hrtimer_start(&pt->timer, ktime_add_ns(ktime_get(), interval), +	hrtimer_start(&ps->timer, ktime_add_ns(ktime_get(), interval),  		      HRTIMER_MODE_ABS);  } @@ -639,7 +626,7 @@ void kvm_pit_reset(struct kvm_pit *pit)  	}  	mutex_unlock(&pit->pit_state.lock); -	atomic_set(&pit->pit_state.pit_timer.pending, 0); +	atomic_set(&pit->pit_state.pending, 0);  	pit->pit_state.irq_ack = 1;  } @@ -648,7 +635,7 @@ static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask)  	struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier);  	if (!mask) { -		atomic_set(&pit->pit_state.pit_timer.pending, 0); +		atomic_set(&pit->pit_state.pending, 0);  		pit->pit_state.irq_ack = 1;  	}  } @@ -706,12 +693,11 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)  	pit_state = &pit->pit_state;  	pit_state->pit = pit; -	hrtimer_init(&pit_state->pit_timer.timer, -		     CLOCK_MONOTONIC, HRTIMER_MODE_ABS); +	hrtimer_init(&pit_state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);  	pit_state->irq_ack_notifier.gsi = 0;  	pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq;  	kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); -	pit_state->pit_timer.reinject = true; +	pit_state->reinject = true;  	mutex_unlock(&pit->pit_state.lock);  	kvm_pit_reset(pit); @@ -761,7 +747,7 @@ void kvm_free_pit(struct kvm *kvm)  		kvm_unregister_irq_ack_notifier(kvm,  				&kvm->arch.vpit->pit_state.irq_ack_notifier);  		mutex_lock(&kvm->arch.vpit->pit_state.lock); -		timer = &kvm->arch.vpit->pit_state.pit_timer.timer; +		timer = &kvm->arch.vpit->pit_state.timer;  		hrtimer_cancel(timer);  		flush_kthread_work(&kvm->arch.vpit->expired);  		kthread_stop(kvm->arch.vpit->worker_task);  |