mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 4 changed files with 17 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue