Commit 26ef1924 authored by Avi Kivity's avatar Avi Kivity Committed by Marcelo Tosatti

KVM: fold kvm_pit_timer into kvm_kpit_state

One structure nests inside the other, providing no value at all.
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 9d9d2239
...@@ -108,7 +108,7 @@ static s64 __kpit_elapsed(struct kvm *kvm) ...@@ -108,7 +108,7 @@ static s64 __kpit_elapsed(struct kvm *kvm)
ktime_t remaining; ktime_t remaining;
struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state; struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state;
if (!ps->pit_timer.period) if (!ps->period)
return 0; return 0;
/* /*
...@@ -120,9 +120,9 @@ static s64 __kpit_elapsed(struct kvm *kvm) ...@@ -120,9 +120,9 @@ static s64 __kpit_elapsed(struct kvm *kvm)
* itself with the initial count and continues counting * itself with the initial count and continues counting
* from there. * from there.
*/ */
remaining = hrtimer_get_remaining(&ps->pit_timer.timer); remaining = hrtimer_get_remaining(&ps->timer);
elapsed = ps->pit_timer.period - ktime_to_ns(remaining); elapsed = ps->period - ktime_to_ns(remaining);
elapsed = mod_64(elapsed, ps->pit_timer.period); elapsed = mod_64(elapsed, ps->period);
return elapsed; return elapsed;
} }
...@@ -238,12 +238,12 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian) ...@@ -238,12 +238,12 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)
int value; int value;
spin_lock(&ps->inject_lock); spin_lock(&ps->inject_lock);
value = atomic_dec_return(&ps->pit_timer.pending); value = atomic_dec_return(&ps->pending);
if (value < 0) if (value < 0)
/* spurious acks can be generated if, for example, the /* spurious acks can be generated if, for example, the
* PIC is being reset. Handle it gracefully here * PIC is being reset. Handle it gracefully here
*/ */
atomic_inc(&ps->pit_timer.pending); atomic_inc(&ps->pending);
else if (value > 0) else if (value > 0)
/* in this case, we had multiple outstanding pit interrupts /* in this case, we had multiple outstanding pit interrupts
* that we needed to inject. Reinject * that we needed to inject. Reinject
...@@ -261,14 +261,14 @@ void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu) ...@@ -261,14 +261,14 @@ void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)
if (!kvm_vcpu_is_bsp(vcpu) || !pit) if (!kvm_vcpu_is_bsp(vcpu) || !pit)
return; return;
timer = &pit->pit_state.pit_timer.timer; timer = &pit->pit_state.timer;
if (hrtimer_cancel(timer)) if (hrtimer_cancel(timer))
hrtimer_start_expires(timer, HRTIMER_MODE_ABS); hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
} }
static void destroy_pit_timer(struct kvm_pit *pit) 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); flush_kthread_work(&pit->expired);
} }
...@@ -311,16 +311,16 @@ static void pit_do_work(struct kthread_work *work) ...@@ -311,16 +311,16 @@ static void pit_do_work(struct kthread_work *work)
static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
{ {
struct kvm_pit_timer *ktimer = container_of(data, struct kvm_pit_timer, timer); struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, timer);
struct kvm_pit *pt = ktimer->kvm->arch.vpit; struct kvm_pit *pt = ps->kvm->arch.vpit;
if (ktimer->reinject || !atomic_read(&ktimer->pending)) { if (ps->reinject || !atomic_read(&ps->pending)) {
atomic_inc(&ktimer->pending); atomic_inc(&ps->pending);
queue_kthread_work(&pt->worker, &pt->expired); queue_kthread_work(&pt->worker, &pt->expired);
} }
if (pt->pit_state.is_periodic) { if (ps->is_periodic) {
hrtimer_add_expires_ns(&ktimer->timer, ktimer->period); hrtimer_add_expires_ns(&ps->timer, ps->period);
return HRTIMER_RESTART; return HRTIMER_RESTART;
} else } else
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
...@@ -329,7 +329,6 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) ...@@ -329,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) 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_kpit_state *ps = &kvm->arch.vpit->pit_state;
struct kvm_pit_timer *pt = &ps->pit_timer;
s64 interval; s64 interval;
if (!irqchip_in_kernel(kvm) || ps->flags & KVM_PIT_FLAGS_HPET_LEGACY) if (!irqchip_in_kernel(kvm) || ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)
...@@ -340,18 +339,18 @@ static void create_pit_timer(struct kvm *kvm, u32 val, int is_period) ...@@ -340,18 +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); pr_debug("create pit timer, interval is %llu nsec\n", interval);
/* TODO The new value only affected after the retriggered */ /* TODO The new value only affected after the retriggered */
hrtimer_cancel(&pt->timer); hrtimer_cancel(&ps->timer);
flush_kthread_work(&ps->pit->expired); flush_kthread_work(&ps->pit->expired);
pt->period = interval; ps->period = interval;
ps->is_periodic = is_period; ps->is_periodic = is_period;
pt->timer.function = pit_timer_fn; ps->timer.function = pit_timer_fn;
pt->kvm = ps->pit->kvm; ps->kvm = ps->pit->kvm;
atomic_set(&pt->pending, 0); atomic_set(&ps->pending, 0);
ps->irq_ack = 1; 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); HRTIMER_MODE_ABS);
} }
...@@ -627,7 +626,7 @@ void kvm_pit_reset(struct kvm_pit *pit) ...@@ -627,7 +626,7 @@ void kvm_pit_reset(struct kvm_pit *pit)
} }
mutex_unlock(&pit->pit_state.lock); 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; pit->pit_state.irq_ack = 1;
} }
...@@ -636,7 +635,7 @@ static void pit_mask_notifer(struct kvm_irq_mask_notifier *kimn, bool mask) ...@@ -636,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); struct kvm_pit *pit = container_of(kimn, struct kvm_pit, mask_notifier);
if (!mask) { if (!mask) {
atomic_set(&pit->pit_state.pit_timer.pending, 0); atomic_set(&pit->pit_state.pending, 0);
pit->pit_state.irq_ack = 1; pit->pit_state.irq_ack = 1;
} }
} }
...@@ -694,12 +693,11 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags) ...@@ -694,12 +693,11 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
pit_state = &pit->pit_state; pit_state = &pit->pit_state;
pit_state->pit = pit; pit_state->pit = pit;
hrtimer_init(&pit_state->pit_timer.timer, hrtimer_init(&pit_state->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
pit_state->irq_ack_notifier.gsi = 0; pit_state->irq_ack_notifier.gsi = 0;
pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq; pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq;
kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); 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); mutex_unlock(&pit->pit_state.lock);
kvm_pit_reset(pit); kvm_pit_reset(pit);
...@@ -749,7 +747,7 @@ void kvm_free_pit(struct kvm *kvm) ...@@ -749,7 +747,7 @@ void kvm_free_pit(struct kvm *kvm)
kvm_unregister_irq_ack_notifier(kvm, kvm_unregister_irq_ack_notifier(kvm,
&kvm->arch.vpit->pit_state.irq_ack_notifier); &kvm->arch.vpit->pit_state.irq_ack_notifier);
mutex_lock(&kvm->arch.vpit->pit_state.lock); 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); hrtimer_cancel(timer);
flush_kthread_work(&kvm->arch.vpit->expired); flush_kthread_work(&kvm->arch.vpit->expired);
kthread_stop(kvm->arch.vpit->worker_task); kthread_stop(kvm->arch.vpit->worker_task);
......
...@@ -21,19 +21,15 @@ struct kvm_kpit_channel_state { ...@@ -21,19 +21,15 @@ struct kvm_kpit_channel_state {
ktime_t count_load_time; ktime_t count_load_time;
}; };
struct kvm_pit_timer {
struct hrtimer timer;
s64 period; /* unit: ns */
atomic_t pending; /* accumulated triggered timers */
bool reinject;
struct kvm *kvm;
};
struct kvm_kpit_state { struct kvm_kpit_state {
struct kvm_kpit_channel_state channels[3]; struct kvm_kpit_channel_state channels[3];
u32 flags; u32 flags;
struct kvm_pit_timer pit_timer;
bool is_periodic; bool is_periodic;
s64 period; /* unit: ns */
struct hrtimer timer;
atomic_t pending; /* accumulated triggered timers */
bool reinject;
struct kvm *kvm;
u32 speaker_data_on; u32 speaker_data_on;
struct mutex lock; struct mutex lock;
struct kvm_pit *pit; struct kvm_pit *pit;
......
...@@ -3082,7 +3082,7 @@ static int kvm_vm_ioctl_reinject(struct kvm *kvm, ...@@ -3082,7 +3082,7 @@ static int kvm_vm_ioctl_reinject(struct kvm *kvm,
if (!kvm->arch.vpit) if (!kvm->arch.vpit)
return -ENXIO; return -ENXIO;
mutex_lock(&kvm->arch.vpit->pit_state.lock); mutex_lock(&kvm->arch.vpit->pit_state.lock);
kvm->arch.vpit->pit_state.pit_timer.reinject = control->pit_reinject; kvm->arch.vpit->pit_state.reinject = control->pit_reinject;
mutex_unlock(&kvm->arch.vpit->pit_state.lock); mutex_unlock(&kvm->arch.vpit->pit_state.lock);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment