As of today, trying to enable dirty-ring with a size bigger than the
maximum will return an "argument list too long" error.

Change vm_enable_dirty_ring() to get the maximum size, then compare it to
the desired size before enabling. If the value is invalid, print a more
precise error message.

Signed-off-by: Leonardo Bras <[email protected]>
---
 tools/testing/selftests/kvm/lib/kvm_util.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c 
b/tools/testing/selftests/kvm/lib/kvm_util.c
index 9ddc047d5c27..fbd0aaa679d6 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -168,24 +168,36 @@ unsigned int kvm_check_cap(long cap)
        ret = __kvm_ioctl(kvm_fd, KVM_CHECK_EXTENSION, (void *)cap);
        TEST_ASSERT(ret >= 0, KVM_IOCTL_ERROR(KVM_CHECK_EXTENSION, ret));
 
        kvm_free_fd(kvm_fd);
 
        return (unsigned int)ret;
 }
 
 void vm_enable_dirty_ring(struct kvm_vm *vm, u32 ring_size)
 {
-       if (vm_check_cap(vm, KVM_CAP_DIRTY_LOG_RING_ACQ_REL))
-               vm_enable_cap(vm, KVM_CAP_DIRTY_LOG_RING_ACQ_REL, ring_size);
-       else
-               vm_enable_cap(vm, KVM_CAP_DIRTY_LOG_RING, ring_size);
+       long cap = kvm_get_dirty_ring_cap();
+       int max_size;
+
+       TEST_ASSERT(cap, "Dirty-ring not supported, check 
CONFIG_HAVE_KVM_DIRTY_RING");
+
+       TEST_ASSERT(is_power_of_2(ring_size),
+                   "Dirty-ring size '0x%x' must be a power-of-2", ring_size);
+       TEST_ASSERT(ring_size >= getpagesize(),
+                   "Dirty-ring size '0x%x' must be at least one (host) page", 
ring_size);
+
+       max_size = vm_check_cap(vm, cap);
+       TEST_ASSERT(ring_size <= max_size,
+                   "Dirty-ring size '0x%x' is larger than KVM's limit of 
'0x%x'",
+                   ring_size, max_size);
+
+       vm_enable_cap(vm, cap, ring_size);
        vm->dirty_ring_size = ring_size;
 }
 
 static void vm_open(struct kvm_vm *vm)
 {
        vm->kvm_fd = _open_kvm_dev_path_or_exit(O_RDWR);
 
        TEST_REQUIRE(kvm_has_cap(KVM_CAP_IMMEDIATE_EXIT));
 
        vm->fd = __kvm_ioctl(vm->kvm_fd, KVM_CREATE_VM, (void *)vm->type);
-- 
2.55.0


Reply via email to