diff options
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/kvm_main.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 002fe0b12c9f..bc8bfd15ab71 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -137,6 +137,14 @@ void vcpu_load(struct kvm_vcpu *vcpu) | |||
137 | int cpu; | 137 | int cpu; |
138 | 138 | ||
139 | mutex_lock(&vcpu->mutex); | 139 | mutex_lock(&vcpu->mutex); |
140 | if (unlikely(vcpu->pid != current->pids[PIDTYPE_PID].pid)) { | ||
141 | /* The thread running this VCPU changed. */ | ||
142 | struct pid *oldpid = vcpu->pid; | ||
143 | struct pid *newpid = get_task_pid(current, PIDTYPE_PID); | ||
144 | rcu_assign_pointer(vcpu->pid, newpid); | ||
145 | synchronize_rcu(); | ||
146 | put_pid(oldpid); | ||
147 | } | ||
140 | cpu = get_cpu(); | 148 | cpu = get_cpu(); |
141 | preempt_notifier_register(&vcpu->preempt_notifier); | 149 | preempt_notifier_register(&vcpu->preempt_notifier); |
142 | kvm_arch_vcpu_load(vcpu, cpu); | 150 | kvm_arch_vcpu_load(vcpu, cpu); |
@@ -212,6 +220,7 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) | |||
212 | vcpu->cpu = -1; | 220 | vcpu->cpu = -1; |
213 | vcpu->kvm = kvm; | 221 | vcpu->kvm = kvm; |
214 | vcpu->vcpu_id = id; | 222 | vcpu->vcpu_id = id; |
223 | vcpu->pid = NULL; | ||
215 | init_waitqueue_head(&vcpu->wq); | 224 | init_waitqueue_head(&vcpu->wq); |
216 | kvm_async_pf_vcpu_init(vcpu); | 225 | kvm_async_pf_vcpu_init(vcpu); |
217 | 226 | ||
@@ -236,6 +245,7 @@ EXPORT_SYMBOL_GPL(kvm_vcpu_init); | |||
236 | 245 | ||
237 | void kvm_vcpu_uninit(struct kvm_vcpu *vcpu) | 246 | void kvm_vcpu_uninit(struct kvm_vcpu *vcpu) |
238 | { | 247 | { |
248 | put_pid(vcpu->pid); | ||
239 | kvm_arch_vcpu_uninit(vcpu); | 249 | kvm_arch_vcpu_uninit(vcpu); |
240 | free_page((unsigned long)vcpu->run); | 250 | free_page((unsigned long)vcpu->run); |
241 | } | 251 | } |