aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64/kvm/kvm-ia64.c
diff options
context:
space:
mode:
authorJulia Lawall <julia@diku.dk>2008-07-22 15:38:18 -0400
committerAvi Kivity <avi@qumranet.com>2008-07-27 04:35:32 -0400
commitcab7a1eeeb007be309cd99cf14407261a72d2418 (patch)
tree1a384bb77cd56512ba2b3a1c7ac83eacea0165ec /arch/ia64/kvm/kvm-ia64.c
parent5fdbcb9dd16f1e89ead127d3ee1a38e3a00cf1ea (diff)
KVM: ia64: Fix irq disabling leak in error handling code
There is a call to local_irq_restore in the normal exit case, so it would seem that there should be one on an error return as well. The semantic patch that finds this problem is as follows: (http://www.emn.fr/x-info/coccinelle/) // <smpl> @@ expression l; expression E,E1,E2; @@ local_irq_save(l); ... when != local_irq_restore(l) when != spin_unlock_irqrestore(E,l) when any when strict ( if (...) { ... when != local_irq_restore(l) when != spin_unlock_irqrestore(E1,l) + local_irq_restore(l); return ...; } | if (...) + {local_irq_restore(l); return ...; + } | spin_unlock_irqrestore(E2,l); | local_irq_restore(l); ) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/ia64/kvm/kvm-ia64.c')
-rw-r--r--arch/ia64/kvm/kvm-ia64.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 2672f4d278a..7a37d06376b 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -125,9 +125,9 @@ void kvm_arch_hardware_enable(void *garbage)
125 PAGE_KERNEL)); 125 PAGE_KERNEL));
126 local_irq_save(saved_psr); 126 local_irq_save(saved_psr);
127 slot = ia64_itr_entry(0x3, KVM_VMM_BASE, pte, KVM_VMM_SHIFT); 127 slot = ia64_itr_entry(0x3, KVM_VMM_BASE, pte, KVM_VMM_SHIFT);
128 local_irq_restore(saved_psr);
128 if (slot < 0) 129 if (slot < 0)
129 return; 130 return;
130 local_irq_restore(saved_psr);
131 131
132 spin_lock(&vp_lock); 132 spin_lock(&vp_lock);
133 status = ia64_pal_vp_init_env(kvm_vsa_base ? 133 status = ia64_pal_vp_init_env(kvm_vsa_base ?
@@ -160,9 +160,9 @@ void kvm_arch_hardware_disable(void *garbage)
160 160
161 local_irq_save(saved_psr); 161 local_irq_save(saved_psr);
162 slot = ia64_itr_entry(0x3, KVM_VMM_BASE, pte, KVM_VMM_SHIFT); 162 slot = ia64_itr_entry(0x3, KVM_VMM_BASE, pte, KVM_VMM_SHIFT);
163 local_irq_restore(saved_psr);
163 if (slot < 0) 164 if (slot < 0)
164 return; 165 return;
165 local_irq_restore(saved_psr);
166 166
167 status = ia64_pal_vp_exit_env(host_iva); 167 status = ia64_pal_vp_exit_env(host_iva);
168 if (status) 168 if (status)
@@ -1253,6 +1253,7 @@ static int vti_vcpu_setup(struct kvm_vcpu *vcpu, int id)
1253uninit: 1253uninit:
1254 kvm_vcpu_uninit(vcpu); 1254 kvm_vcpu_uninit(vcpu);
1255fail: 1255fail:
1256 local_irq_restore(psr);
1256 return r; 1257 return r;
1257} 1258}
1258 1259