Merge tag 'kvm-ppc-fixes-5.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc into kvm-master
PPC KVM fix for 5.5 - Fix a bug where we try to do an ultracall on a system without an ultravisor.
This commit is contained in:
@@ -110,14 +110,11 @@ static const struct kvm_io_device_ops coalesced_mmio_ops = {
|
||||
int kvm_coalesced_mmio_init(struct kvm *kvm)
|
||||
{
|
||||
struct page *page;
|
||||
int ret;
|
||||
|
||||
ret = -ENOMEM;
|
||||
page = alloc_page(GFP_KERNEL | __GFP_ZERO);
|
||||
if (!page)
|
||||
goto out_err;
|
||||
return -ENOMEM;
|
||||
|
||||
ret = 0;
|
||||
kvm->coalesced_mmio_ring = page_address(page);
|
||||
|
||||
/*
|
||||
@@ -128,8 +125,7 @@ int kvm_coalesced_mmio_init(struct kvm *kvm)
|
||||
spin_lock_init(&kvm->ring_lock);
|
||||
INIT_LIST_HEAD(&kvm->coalesced_zones);
|
||||
|
||||
out_err:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kvm_coalesced_mmio_free(struct kvm *kvm)
|
||||
|
||||
@@ -838,6 +838,18 @@ void kvm_put_kvm(struct kvm *kvm)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_put_kvm);
|
||||
|
||||
/*
|
||||
* Used to put a reference that was taken on behalf of an object associated
|
||||
* with a user-visible file descriptor, e.g. a vcpu or device, if installation
|
||||
* of the new file descriptor fails and the reference cannot be transferred to
|
||||
* its final owner. In such cases, the caller is still actively using @kvm and
|
||||
* will fail miserably if the refcount unexpectedly hits zero.
|
||||
*/
|
||||
void kvm_put_kvm_no_destroy(struct kvm *kvm)
|
||||
{
|
||||
WARN_ON(refcount_dec_and_test(&kvm->users_count));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(kvm_put_kvm_no_destroy);
|
||||
|
||||
static int kvm_vm_release(struct inode *inode, struct file *filp)
|
||||
{
|
||||
@@ -2739,17 +2751,18 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
|
||||
goto unlock_vcpu_destroy;
|
||||
}
|
||||
|
||||
BUG_ON(kvm->vcpus[atomic_read(&kvm->online_vcpus)]);
|
||||
vcpu->vcpu_idx = atomic_read(&kvm->online_vcpus);
|
||||
BUG_ON(kvm->vcpus[vcpu->vcpu_idx]);
|
||||
|
||||
/* Now it's all set up, let userspace reach it */
|
||||
kvm_get_kvm(kvm);
|
||||
r = create_vcpu_fd(vcpu);
|
||||
if (r < 0) {
|
||||
kvm_put_kvm(kvm);
|
||||
kvm_put_kvm_no_destroy(kvm);
|
||||
goto unlock_vcpu_destroy;
|
||||
}
|
||||
|
||||
kvm->vcpus[atomic_read(&kvm->online_vcpus)] = vcpu;
|
||||
kvm->vcpus[vcpu->vcpu_idx] = vcpu;
|
||||
|
||||
/*
|
||||
* Pairs with smp_rmb() in kvm_get_vcpu. Write kvm->vcpus
|
||||
@@ -3183,7 +3196,7 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
|
||||
kvm_get_kvm(kvm);
|
||||
ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
|
||||
if (ret < 0) {
|
||||
kvm_put_kvm(kvm);
|
||||
kvm_put_kvm_no_destroy(kvm);
|
||||
mutex_lock(&kvm->lock);
|
||||
list_del(&dev->vm_node);
|
||||
mutex_unlock(&kvm->lock);
|
||||
@@ -4341,12 +4354,12 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
|
||||
|
||||
r = kvm_arch_hardware_setup();
|
||||
if (r < 0)
|
||||
goto out_free_0a;
|
||||
goto out_free_1;
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
smp_call_function_single(cpu, check_processor_compat, &r, 1);
|
||||
if (r < 0)
|
||||
goto out_free_1;
|
||||
goto out_free_2;
|
||||
}
|
||||
|
||||
r = cpuhp_setup_state_nocalls(CPUHP_AP_KVM_STARTING, "kvm/cpu:starting",
|
||||
@@ -4403,9 +4416,8 @@ out_free_3:
|
||||
unregister_reboot_notifier(&kvm_reboot_notifier);
|
||||
cpuhp_remove_state_nocalls(CPUHP_AP_KVM_STARTING);
|
||||
out_free_2:
|
||||
out_free_1:
|
||||
kvm_arch_hardware_unsetup();
|
||||
out_free_0a:
|
||||
out_free_1:
|
||||
free_cpumask_var(cpus_hardware_enabled);
|
||||
out_free_0:
|
||||
kvm_irqfd_exit();
|
||||
|
||||
Reference in New Issue
Block a user