KVM: Introduce KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2
The previous KVM_CAP_MANUAL_DIRTY_LOG_PROTECT has some problem which blocks the correct usage from userspace. Obsolete the old one and introduce a new capability bit for it. Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									53eac7a8f8
								
							
						
					
					
						commit
						d7547c55cb
					
				| @ -330,7 +330,7 @@ They must be less than the value that KVM_CHECK_EXTENSION returns for | ||||
| the KVM_CAP_MULTI_ADDRESS_SPACE capability. | ||||
| 
 | ||||
| The bits in the dirty bitmap are cleared before the ioctl returns, unless | ||||
| KVM_CAP_MANUAL_DIRTY_LOG_PROTECT is enabled.  For more information, | ||||
| KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 is enabled.  For more information, | ||||
| see the description of the capability. | ||||
| 
 | ||||
| 4.9 KVM_SET_MEMORY_ALIAS | ||||
| @ -3791,7 +3791,7 @@ to I/O ports. | ||||
| 
 | ||||
| 4.117 KVM_CLEAR_DIRTY_LOG (vm ioctl) | ||||
| 
 | ||||
| Capability: KVM_CAP_MANUAL_DIRTY_LOG_PROTECT | ||||
| Capability: KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 | ||||
| Architectures: x86 | ||||
| Type: vm ioctl | ||||
| Parameters: struct kvm_dirty_log (in) | ||||
| @ -3824,10 +3824,10 @@ the address space for which you want to return the dirty bitmap. | ||||
| They must be less than the value that KVM_CHECK_EXTENSION returns for | ||||
| the KVM_CAP_MULTI_ADDRESS_SPACE capability. | ||||
| 
 | ||||
| This ioctl is mostly useful when KVM_CAP_MANUAL_DIRTY_LOG_PROTECT | ||||
| This ioctl is mostly useful when KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 | ||||
| is enabled; for more information, see the description of the capability. | ||||
| However, it can always be used as long as KVM_CHECK_EXTENSION confirms | ||||
| that KVM_CAP_MANUAL_DIRTY_LOG_PROTECT is present. | ||||
| that KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 is present. | ||||
| 
 | ||||
| 4.118 KVM_GET_SUPPORTED_HV_CPUID | ||||
| 
 | ||||
| @ -4780,7 +4780,7 @@ and injected exceptions. | ||||
| * For the new DR6 bits, note that bit 16 is set iff the #DB exception | ||||
|   will clear DR6.RTM. | ||||
| 
 | ||||
| 7.18 KVM_CAP_MANUAL_DIRTY_LOG_PROTECT | ||||
| 7.18 KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 | ||||
| 
 | ||||
| Architectures: all | ||||
| Parameters: args[0] whether feature should be enabled or not | ||||
| @ -4803,6 +4803,11 @@ while userspace can see false reports of dirty pages.  Manual reprotection | ||||
| helps reducing this time, improving guest performance and reducing the | ||||
| number of dirty log false positives. | ||||
| 
 | ||||
| KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 was previously available under the name | ||||
| KVM_CAP_MANUAL_DIRTY_LOG_PROTECT, but the implementation had bugs that make | ||||
| it hard or impossible to use it correctly.  The availability of | ||||
| KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 signals that those bugs are fixed. | ||||
| Userspace should not try to use KVM_CAP_MANUAL_DIRTY_LOG_PROTECT. | ||||
| 
 | ||||
| 8. Other capabilities. | ||||
| ---------------------- | ||||
|  | ||||
| @ -986,8 +986,9 @@ struct kvm_ppc_resize_hpt { | ||||
| #define KVM_CAP_HYPERV_ENLIGHTENED_VMCS 163 | ||||
| #define KVM_CAP_EXCEPTION_PAYLOAD 164 | ||||
| #define KVM_CAP_ARM_VM_IPA_SIZE 165 | ||||
| #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166 | ||||
| #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT 166 /* Obsolete */ | ||||
| #define KVM_CAP_HYPERV_CPUID 167 | ||||
| #define KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2 168 | ||||
| 
 | ||||
| #ifdef KVM_CAP_IRQ_ROUTING | ||||
| 
 | ||||
| @ -1434,7 +1435,7 @@ struct kvm_enc_region { | ||||
| #define KVM_GET_NESTED_STATE         _IOWR(KVMIO, 0xbe, struct kvm_nested_state) | ||||
| #define KVM_SET_NESTED_STATE         _IOW(KVMIO,  0xbf, struct kvm_nested_state) | ||||
| 
 | ||||
| /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT */ | ||||
| /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */ | ||||
| #define KVM_CLEAR_DIRTY_LOG          _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log) | ||||
| 
 | ||||
| /* Available with KVM_CAP_HYPERV_CPUID */ | ||||
|  | ||||
| @ -311,7 +311,7 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations, | ||||
| #ifdef USE_CLEAR_DIRTY_LOG | ||||
| 	struct kvm_enable_cap cap = {}; | ||||
| 
 | ||||
| 	cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT; | ||||
| 	cap.cap = KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2; | ||||
| 	cap.args[0] = 1; | ||||
| 	vm_enable_cap(vm, &cap); | ||||
| #endif | ||||
| @ -427,7 +427,7 @@ int main(int argc, char *argv[]) | ||||
| 	int opt, i; | ||||
| 
 | ||||
| #ifdef USE_CLEAR_DIRTY_LOG | ||||
| 	if (!kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT)) { | ||||
| 	if (!kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2)) { | ||||
| 		fprintf(stderr, "KVM_CLEAR_DIRTY_LOG not available, skipping tests\n"); | ||||
| 		exit(KSFT_SKIP); | ||||
| 	} | ||||
|  | ||||
| @ -3110,7 +3110,7 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg) | ||||
| 	case KVM_CAP_CHECK_EXTENSION_VM: | ||||
| 	case KVM_CAP_ENABLE_CAP_VM: | ||||
| #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT | ||||
| 	case KVM_CAP_MANUAL_DIRTY_LOG_PROTECT: | ||||
| 	case KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2: | ||||
| #endif | ||||
| 		return 1; | ||||
| #ifdef CONFIG_KVM_MMIO | ||||
| @ -3148,7 +3148,7 @@ static int kvm_vm_ioctl_enable_cap_generic(struct kvm *kvm, | ||||
| { | ||||
| 	switch (cap->cap) { | ||||
| #ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT | ||||
| 	case KVM_CAP_MANUAL_DIRTY_LOG_PROTECT: | ||||
| 	case KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2: | ||||
| 		if (cap->flags || (cap->args[0] & ~1)) | ||||
| 			return -EINVAL; | ||||
| 		kvm->manual_dirty_log_protect = cap->args[0]; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user