mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-17 17:37:42 +07:00
KVM: fold kvm_pit_timer into kvm_kpit_state
One structure nests inside the other, providing no value at all. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
9d9d2239bd
commit
26ef19242f
@ -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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 {
|
|||||||
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,
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user