KVM: PPC: Remove the tasklet used by the hrtimer
authorMihai Caraman <mihai.caraman@freescale.com>
Mon, 1 Sep 2014 14:19:56 +0000 (17:19 +0300)
committerAlexander Graf <agraf@suse.de>
Mon, 22 Sep 2014 08:11:34 +0000 (10:11 +0200)
Powerpc timer implementation is a copycat version of s390. Now that they removed
the tasklet with commit ea74c0ea1b24a6978a6ebc80ba4dbc7b7848b32d 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>
arch/powerpc/include/asm/kvm_host.h
arch/powerpc/include/asm/kvm_ppc.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/powerpc.c

index bad3491cc32ce9900f9dc21030b5a947b9763f08..d2432401d301c4c9793d333d97d80d4c4951ffeb 100644 (file)
@@ -606,7 +606,6 @@ struct kvm_vcpu_arch {
        u32 cpr0_cfgaddr; /* holds the last set cpr0_cfgaddr */
 
        struct hrtimer dec_timer;
-       struct tasklet_struct tasklet;
        u64 dec_jiffies;
        u64 dec_expires;
        unsigned long pending_exceptions;
index 05e58b6306018cb446ee90356aecc0889cead45b..73063ef5369432578a26dcb8fbffcf189e85aab2 100644 (file)
@@ -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 void kvmppc_emulate_dec(struct kvm_vcpu *vcpu);
 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_subarch_vcpu_init(struct kvm_vcpu *vcpu);
 extern void kvmppc_subarch_vcpu_uninit(struct kvm_vcpu *vcpu);
index 1b5adda2a2247381d9b589bbd0de69eb11326cfe..f23b6a5530825703fc6ed8f3097c5a0c7b3d45e0 100644 (file)
@@ -718,10 +718,8 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
        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);
        kvm_vcpu_kick(vcpu);
 }
index b4e81e6be11af69b49ecfde3968ffbe1b6247ba1..97ec5b7fce9c0087b03239c7575d0cda5f65d02a 100644 (file)
@@ -1822,10 +1822,8 @@ void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits)
        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) {
                vcpu->arch.dec = vcpu->arch.decar;
                kvmppc_emulate_dec(vcpu);
index 0c7d1917c23de681c2d8c2001aaec8cbcc281b0d..ecf057551a2f5f189db1fb50f9d9040cd574f3b5 100644 (file)
@@ -638,7 +638,6 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
 {
        /* Make sure we're not using the vcpu anymore */
        hrtimer_cancel(&vcpu->arch.dec_timer);
-       tasklet_kill(&vcpu->arch.tasklet);
 
        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);
 }
 
-/*
- * 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)
 {
        struct kvm_vcpu *vcpu;
 
        vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer);
-       tasklet_schedule(&vcpu->arch.tasklet);
+       kvmppc_decrementer_func(vcpu);
 
        return HRTIMER_NORESTART;
 }
@@ -683,7 +678,6 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
        int ret;
 
        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_expires = ~(u64)0;