KVM: PPC: Remove the tasklet used by the hrtimer
Powerpc timer implementation is a copycat version of s390. Now that they removed
the tasklet with commit ea74c0ea1b
follow this
optimization.
Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Bogdan Purcareata <bogdan.purcareata@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Родитель
2f699a59f3
Коммит
d02d4d156e
|
@ -606,7 +606,6 @@ struct kvm_vcpu_arch {
|
||||||
u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */
|
u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */
|
||||||
|
|
||||||
struct hrtimer dec_timer;
|
struct hrtimer dec_timer;
|
||||||
struct tasklet_struct tasklet;
|
|
||||||
u64 dec_jiffies;
|
u64 dec_jiffies;
|
||||||
u64 dec_expires;
|
u64 dec_expires;
|
||||||
unsigned long pending_exceptions;
|
unsigned long pending_exceptions;
|
||||||
|
|
|
@ -89,7 +89,7 @@ extern int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu);
|
||||||
extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu);
|
extern int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu);
|
extern void kvmppc_emulate_dec(struct kvm_vcpu *vcpu);
|
||||||
extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb);
|
extern u32 kvmppc_get_dec(struct kvm_vcpu *vcpu, u64 tb);
|
||||||
extern void kvmppc_decrementer_func(unsigned long data);
|
extern void kvmppc_decrementer_func(struct kvm_vcpu *vcpu);
|
||||||
extern int kvmppc_sanity_check(struct kvm_vcpu *vcpu);
|
extern int kvmppc_sanity_check(struct kvm_vcpu *vcpu);
|
||||||
extern int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu);
|
extern int kvmppc_subarch_vcpu_init(struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu);
|
extern void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu);
|
||||||
|
|
|
@ -718,10 +718,8 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvmppc_decrementer_func(unsigned long data)
|
void kvmppc_decrementer_func(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data;
|
|
||||||
|
|
||||||
kvmppc_core_queue_dec(vcpu);
|
kvmppc_core_queue_dec(vcpu);
|
||||||
kvm_vcpu_kick(vcpu);
|
kvm_vcpu_kick(vcpu);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1822,10 +1822,8 @@ void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits)
|
||||||
update_timer_ints(vcpu);
|
update_timer_ints(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvmppc_decrementer_func(unsigned long data)
|
void kvmppc_decrementer_func(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data;
|
|
||||||
|
|
||||||
if (vcpu->arch.tcr & TCR_ARE) {
|
if (vcpu->arch.tcr & TCR_ARE) {
|
||||||
vcpu->arch.dec = vcpu->arch.decar;
|
vcpu->arch.dec = vcpu->arch.decar;
|
||||||
kvmppc_emulate_dec(vcpu);
|
kvmppc_emulate_dec(vcpu);
|
||||||
|
|
|
@ -638,7 +638,6 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
/* Make sure we're not using the vcpu anymore */
|
/* Make sure we're not using the vcpu anymore */
|
||||||
hrtimer_cancel(&vcpu->arch.dec_timer);
|
hrtimer_cancel(&vcpu->arch.dec_timer);
|
||||||
tasklet_kill(&vcpu->arch.tasklet);
|
|
||||||
|
|
||||||
kvmppc_remove_vcpu_debugfs(vcpu);
|
kvmppc_remove_vcpu_debugfs(vcpu);
|
||||||
|
|
||||||
|
@ -664,16 +663,12 @@ int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||||
return kvmppc_core_pending_dec(vcpu);
|
return kvmppc_core_pending_dec(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* low level hrtimer wake routine. Because this runs in hardirq context
|
|
||||||
* we schedule a tasklet to do the real work.
|
|
||||||
*/
|
|
||||||
enum hrtimer_restart kvmppc_decrementer_wakeup(struct hrtimer *timer)
|
enum hrtimer_restart kvmppc_decrementer_wakeup(struct hrtimer *timer)
|
||||||
{
|
{
|
||||||
struct kvm_vcpu *vcpu;
|
struct kvm_vcpu *vcpu;
|
||||||
|
|
||||||
vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer);
|
vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer);
|
||||||
tasklet_schedule(&vcpu->arch.tasklet);
|
kvmppc_decrementer_func(vcpu);
|
||||||
|
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
}
|
}
|
||||||
|
@ -683,7 +678,6 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
|
hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
|
||||||
tasklet_init(&vcpu->arch.tasklet, kvmppc_decrementer_func, (ulong)vcpu);
|
|
||||||
vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup;
|
vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup;
|
||||||
vcpu->arch.dec_expires = ~(u64)0;
|
vcpu->arch.dec_expires = ~(u64)0;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче