diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 45 | 
1 files changed, 31 insertions, 14 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 584a5bab3af3..25d7872b29c1 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3409,10 +3409,8 @@ static int kvm_vcpu_check_block(struct kvm_vcpu *vcpu)  	int ret = -EINTR;  	int idx = srcu_read_lock(&vcpu->kvm->srcu); -	if (kvm_arch_vcpu_runnable(vcpu)) { -		kvm_make_request(KVM_REQ_UNHALT, vcpu); +	if (kvm_arch_vcpu_runnable(vcpu))  		goto out; -	}  	if (kvm_cpu_has_pending_timer(vcpu))  		goto out;  	if (signal_pending(current)) @@ -4475,7 +4473,13 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)  	case KVM_CAP_NR_MEMSLOTS:  		return KVM_USER_MEM_SLOTS;  	case KVM_CAP_DIRTY_LOG_RING: -#ifdef CONFIG_HAVE_KVM_DIRTY_RING +#ifdef CONFIG_HAVE_KVM_DIRTY_RING_TSO +		return KVM_DIRTY_RING_MAX_ENTRIES * sizeof(struct kvm_dirty_gfn); +#else +		return 0; +#endif +	case KVM_CAP_DIRTY_LOG_RING_ACQ_REL: +#ifdef CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL  		return KVM_DIRTY_RING_MAX_ENTRIES * sizeof(struct kvm_dirty_gfn);  #else  		return 0; @@ -4580,6 +4584,10 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm,  		return 0;  	}  	case KVM_CAP_DIRTY_LOG_RING: +	case KVM_CAP_DIRTY_LOG_RING_ACQ_REL: +		if (!kvm_vm_ioctl_check_extension_generic(kvm, cap->cap)) +			return -EINVAL; +  		return kvm_vm_ioctl_enable_dirty_log_ring(kvm, cap->args[0]);  	default:  		return kvm_vm_ioctl_enable_cap(kvm, cap); @@ -4834,6 +4842,12 @@ struct compat_kvm_clear_dirty_log {  	};  }; +long __weak kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl, +				     unsigned long arg) +{ +	return -ENOTTY; +} +  static long kvm_vm_compat_ioctl(struct file *filp,  			   unsigned int ioctl, unsigned long arg)  { @@ -4842,6 +4856,11 @@ static long kvm_vm_compat_ioctl(struct file *filp,  	if (kvm->mm != current->mm || kvm->vm_dead)  		return -EIO; + +	r = kvm_arch_vm_compat_ioctl(filp, ioctl, arg); +	if (r != -ENOTTY) +		return r; +  	switch (ioctl) {  #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT  	case KVM_CLEAR_DIRTY_LOG: { @@ -5393,6 +5412,7 @@ static int kvm_debugfs_open(struct inode *inode, struct file *file,  			   int (*get)(void *, u64 *), int (*set)(void *, u64),  			   const char *fmt)  { +	int ret;  	struct kvm_stat_data *stat_data = (struct kvm_stat_data *)  					  inode->i_private; @@ -5404,15 +5424,13 @@ static int kvm_debugfs_open(struct inode *inode, struct file *file,  	if (!kvm_get_kvm_safe(stat_data->kvm))  		return -ENOENT; -	if (simple_attr_open(inode, file, get, -		    kvm_stats_debugfs_mode(stat_data->desc) & 0222 -		    ? set : NULL, -		    fmt)) { +	ret = simple_attr_open(inode, file, get, +			       kvm_stats_debugfs_mode(stat_data->desc) & 0222 +			       ? set : NULL, fmt); +	if (ret)  		kvm_put_kvm(stat_data->kvm); -		return -ENOMEM; -	} -	return 0; +	return ret;  }  static int kvm_debugfs_release(struct inode *inode, struct file *file) @@ -5881,7 +5899,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,  	r = kvm_async_pf_init();  	if (r) -		goto out_free_5; +		goto out_free_4;  	kvm_chardev_ops.owner = module; @@ -5905,10 +5923,9 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,  out_unreg:  	kvm_async_pf_deinit(); -out_free_5: +out_free_4:  	for_each_possible_cpu(cpu)  		free_cpumask_var(per_cpu(cpu_kick_mask, cpu)); -out_free_4:  	kmem_cache_destroy(kvm_vcpu_cache);  out_free_3:  	unregister_reboot_notifier(&kvm_reboot_notifier);  |