kvm: make KVM_CAP_ENABLE_CAP_VM architecture agnostic
The first such capability to be handled in virt/kvm/ will be manual dirty page reprotection. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									bb22dc14a2
								
							
						
					
					
						commit
						e5d83c74a5
					
				| @ -1129,10 +1129,15 @@ documentation when it pops into existence). | ||||
| 
 | ||||
| 4.37 KVM_ENABLE_CAP | ||||
| 
 | ||||
| Capability: KVM_CAP_ENABLE_CAP, KVM_CAP_ENABLE_CAP_VM | ||||
| Architectures: x86 (only KVM_CAP_ENABLE_CAP_VM), | ||||
| 	       mips (only KVM_CAP_ENABLE_CAP), ppc, s390 | ||||
| Type: vcpu ioctl, vm ioctl (with KVM_CAP_ENABLE_CAP_VM) | ||||
| Capability: KVM_CAP_ENABLE_CAP | ||||
| Architectures: mips, ppc, s390 | ||||
| Type: vcpu ioctl | ||||
| Parameters: struct kvm_enable_cap (in) | ||||
| Returns: 0 on success; -1 on error | ||||
| 
 | ||||
| Capability: KVM_CAP_ENABLE_CAP_VM | ||||
| Architectures: all | ||||
| Type: vcpu ioctl | ||||
| Parameters: struct kvm_enable_cap (in) | ||||
| Returns: 0 on success; -1 on error | ||||
| 
 | ||||
|  | ||||
| @ -518,7 +518,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | ||||
| 	case KVM_CAP_PPC_UNSET_IRQ: | ||||
| 	case KVM_CAP_PPC_IRQ_LEVEL: | ||||
| 	case KVM_CAP_ENABLE_CAP: | ||||
| 	case KVM_CAP_ENABLE_CAP_VM: | ||||
| 	case KVM_CAP_ONE_REG: | ||||
| 	case KVM_CAP_IOEVENTFD: | ||||
| 	case KVM_CAP_DEVICE_CTRL: | ||||
| @ -2084,8 +2083,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event, | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 				   struct kvm_enable_cap *cap) | ||||
| int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 			    struct kvm_enable_cap *cap) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| @ -2273,15 +2272,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | ||||
| 
 | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_ENABLE_CAP: | ||||
| 	{ | ||||
| 		struct kvm_enable_cap cap; | ||||
| 		r = -EFAULT; | ||||
| 		if (copy_from_user(&cap, argp, sizeof(cap))) | ||||
| 			goto out; | ||||
| 		r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||||
| 		break; | ||||
| 	} | ||||
| #ifdef CONFIG_SPAPR_TCE_IOMMU | ||||
| 	case KVM_CREATE_SPAPR_TCE_64: { | ||||
| 		struct kvm_create_spapr_tce_64 create_tce_64; | ||||
|  | ||||
| @ -464,7 +464,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | ||||
| 	case KVM_CAP_S390_CSS_SUPPORT: | ||||
| 	case KVM_CAP_IOEVENTFD: | ||||
| 	case KVM_CAP_DEVICE_CTRL: | ||||
| 	case KVM_CAP_ENABLE_CAP_VM: | ||||
| 	case KVM_CAP_S390_IRQCHIP: | ||||
| 	case KVM_CAP_VM_ATTRIBUTES: | ||||
| 	case KVM_CAP_MP_STATE: | ||||
| @ -607,7 +606,7 @@ static void icpt_operexc_on_all_vcpus(struct kvm *kvm) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | ||||
| int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| @ -1933,14 +1932,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | ||||
| 		r = kvm_s390_inject_vm(kvm, &s390int); | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_ENABLE_CAP: { | ||||
| 		struct kvm_enable_cap cap; | ||||
| 		r = -EFAULT; | ||||
| 		if (copy_from_user(&cap, argp, sizeof(cap))) | ||||
| 			break; | ||||
| 		r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_CREATE_IRQCHIP: { | ||||
| 		struct kvm_irq_routing_entry routing; | ||||
| 
 | ||||
|  | ||||
| @ -3008,7 +3008,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | ||||
| 	case KVM_CAP_HYPERV_TIME: | ||||
| 	case KVM_CAP_IOAPIC_POLARITY_IGNORED: | ||||
| 	case KVM_CAP_TSC_DEADLINE_TIMER: | ||||
| 	case KVM_CAP_ENABLE_CAP_VM: | ||||
| 	case KVM_CAP_DISABLE_QUIRKS: | ||||
| 	case KVM_CAP_SET_BOOT_CPU_ID: | ||||
|  	case KVM_CAP_SPLIT_IRQCHIP: | ||||
| @ -4431,8 +4430,8 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event, | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 				   struct kvm_enable_cap *cap) | ||||
| int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 			    struct kvm_enable_cap *cap) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| @ -4765,15 +4764,6 @@ set_identity_unlock: | ||||
| 		r = 0; | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_ENABLE_CAP: { | ||||
| 		struct kvm_enable_cap cap; | ||||
| 
 | ||||
| 		r = -EFAULT; | ||||
| 		if (copy_from_user(&cap, argp, sizeof(cap))) | ||||
| 			goto out; | ||||
| 		r = kvm_vm_ioctl_enable_cap(kvm, &cap); | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_MEMORY_ENCRYPT_OP: { | ||||
| 		r = -ENOTTY; | ||||
| 		if (kvm_x86_ops->mem_enc_op) | ||||
|  | ||||
| @ -765,6 +765,8 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | ||||
| 
 | ||||
| int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, | ||||
| 			bool line_status); | ||||
| int kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 			    struct kvm_enable_cap *cap); | ||||
| long kvm_arch_vm_ioctl(struct file *filp, | ||||
| 		       unsigned int ioctl, unsigned long arg); | ||||
| 
 | ||||
|  | ||||
| @ -2948,6 +2948,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | ||||
| #endif | ||||
| 	case KVM_CAP_IOEVENTFD_ANY_LENGTH: | ||||
| 	case KVM_CAP_CHECK_EXTENSION_VM: | ||||
| 	case KVM_CAP_ENABLE_CAP_VM: | ||||
| 		return 1; | ||||
| #ifdef CONFIG_KVM_MMIO | ||||
| 	case KVM_CAP_COALESCED_MMIO: | ||||
| @ -2971,6 +2972,21 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | ||||
| 	return kvm_vm_ioctl_check_extension(kvm, arg); | ||||
| } | ||||
| 
 | ||||
| int __attribute__((weak)) kvm_vm_ioctl_enable_cap(struct kvm *kvm, | ||||
| 						  struct kvm_enable_cap *cap) | ||||
| { | ||||
| 	return -EINVAL; | ||||
| } | ||||
| 
 | ||||
| static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm, | ||||
| 					   struct kvm_enable_cap *cap) | ||||
| { | ||||
| 	switch (cap->cap) { | ||||
| 	default: | ||||
| 		return kvm_vm_ioctl_enable_cap(kvm, cap); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static long kvm_vm_ioctl(struct file *filp, | ||||
| 			   unsigned int ioctl, unsigned long arg) | ||||
| { | ||||
| @ -2984,6 +3000,15 @@ static long kvm_vm_ioctl(struct file *filp, | ||||
| 	case KVM_CREATE_VCPU: | ||||
| 		r = kvm_vm_ioctl_create_vcpu(kvm, arg); | ||||
| 		break; | ||||
| 	case KVM_ENABLE_CAP: { | ||||
| 		struct kvm_enable_cap cap; | ||||
| 
 | ||||
| 		r = -EFAULT; | ||||
| 		if (copy_from_user(&cap, argp, sizeof(cap))) | ||||
| 			goto out; | ||||
| 		r = kvm_vm_ioctl_enable_cap_generic(kvm, &cap); | ||||
| 		break; | ||||
| 	} | ||||
| 	case KVM_SET_USER_MEMORY_REGION: { | ||||
| 		struct kvm_userspace_memory_region kvm_userspace_mem; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user