KVM: s390: clear local interrupts at cpu initial reset
authorJens Freimann <jfrei@linux.vnet.ibm.com>
Tue, 11 Feb 2014 12:48:07 +0000 (13:48 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 25 Mar 2014 12:27:12 +0000 (13:27 +0100)
Empty list of local interrupts when vcpu goes through initial reset
to provide a clean state

Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/interrupt.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/kvm-s390.h

index 79d2e4fa9f9c2619c4b6c6d6e89e99c459b2f2fd..05bffd74961fb30135e00ae7ebb421c654375bc5 100644 (file)
@@ -509,6 +509,20 @@ enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer)
        return HRTIMER_NORESTART;
 }
 
+void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu)
+{
+       struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
+       struct kvm_s390_interrupt_info  *n, *inti = NULL;
+
+       spin_lock_bh(&li->lock);
+       list_for_each_entry_safe(inti, n, &li->list, list) {
+               list_del(&inti->list);
+               kfree(inti);
+       }
+       atomic_set(&li->active, 0);
+       spin_unlock_bh(&li->lock);
+}
+
 void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
 {
        struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
index a02979f1e1afdd115606929a681624e07f281fac..83b79447de5528171c9e86c7ec61c21e7f8310d5 100644 (file)
@@ -395,6 +395,7 @@ static void kvm_s390_vcpu_initial_reset(struct kvm_vcpu *vcpu)
        vcpu->arch.pfault_token = KVM_S390_PFAULT_TOKEN_INVALID;
        kvm_clear_async_pf_completion_queue(vcpu);
        atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
+       kvm_s390_clear_local_irqs(vcpu);
 }
 
 int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
index ed4750a5bc3c05088c2ccfa33d3f0e7411599267..6311170843b6bf16d3e60ee2833bdc25b2703d86 100644 (file)
@@ -129,6 +129,7 @@ enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer);
 void kvm_s390_tasklet(unsigned long parm);
 void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu);
 void kvm_s390_deliver_pending_machine_checks(struct kvm_vcpu *vcpu);
+void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu);
 int __must_check kvm_s390_inject_vm(struct kvm *kvm,
                                    struct kvm_s390_interrupt *s390int);
 int __must_check kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu,