KVM: selftests: Add helpers to read kvm_{intel,amd} boolean module parameters
authorDavid Matlack <dmatlack@google.com>
Thu, 29 Sep 2022 18:12:06 +0000 (11:12 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 30 Sep 2022 10:39:36 +0000 (06:39 -0400)
Add helper functions for reading the value of kvm_intel and kvm_amd
boolean module parameters. Use the kvm_intel variant in
vm_is_unrestricted_guest() to simplify the check for
kvm_intel.unrestricted_guest.

No functional change intended.

Signed-off-by: David Matlack <dmatlack@google.com>
Message-Id: <20220929181207.2281449-3-dmatlack@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/include/kvm_util_base.h
tools/testing/selftests/kvm/lib/kvm_util.c
tools/testing/selftests/kvm/lib/x86_64/processor.c

index 24fde97..e42a09c 100644 (file)
@@ -175,6 +175,10 @@ extern const struct vm_guest_mode_params vm_guest_mode_params[];
 
 int open_path_or_exit(const char *path, int flags);
 int open_kvm_dev_path_or_exit(void);
+
+bool get_kvm_intel_param_bool(const char *param);
+bool get_kvm_amd_param_bool(const char *param);
+
 unsigned int kvm_check_cap(long cap);
 
 static inline bool kvm_has_cap(long cap)
index 9889fe0..504c1e1 100644 (file)
@@ -50,6 +50,45 @@ int open_kvm_dev_path_or_exit(void)
        return _open_kvm_dev_path_or_exit(O_RDONLY);
 }
 
+static bool get_module_param_bool(const char *module_name, const char *param)
+{
+       const int path_size = 128;
+       char path[path_size];
+       char value;
+       ssize_t r;
+       int fd;
+
+       r = snprintf(path, path_size, "/sys/module/%s/parameters/%s",
+                    module_name, param);
+       TEST_ASSERT(r < path_size,
+                   "Failed to construct sysfs path in %d bytes.", path_size);
+
+       fd = open_path_or_exit(path, O_RDONLY);
+
+       r = read(fd, &value, 1);
+       TEST_ASSERT(r == 1, "read(%s) failed", path);
+
+       r = close(fd);
+       TEST_ASSERT(!r, "close(%s) failed", path);
+
+       if (value == 'Y')
+               return true;
+       else if (value == 'N')
+               return false;
+
+       TEST_FAIL("Unrecognized value '%c' for boolean module param", value);
+}
+
+bool get_kvm_intel_param_bool(const char *param)
+{
+       return get_module_param_bool("kvm_intel", param);
+}
+
+bool get_kvm_amd_param_bool(const char *param)
+{
+       return get_module_param_bool("kvm_amd", param);
+}
+
 /*
  * Capability
  *
index 2e6e61b..fab0f52 100644 (file)
@@ -1294,20 +1294,9 @@ done:
 /* Returns true if kvm_intel was loaded with unrestricted_guest=1. */
 bool vm_is_unrestricted_guest(struct kvm_vm *vm)
 {
-       char val = 'N';
-       size_t count;
-       FILE *f;
-
        /* Ensure that a KVM vendor-specific module is loaded. */
        if (vm == NULL)
                close(open_kvm_dev_path_or_exit());
 
-       f = fopen("/sys/module/kvm_intel/parameters/unrestricted_guest", "r");
-       if (f) {
-               count = fread(&val, sizeof(char), 1, f);
-               TEST_ASSERT(count == 1, "Unable to read from param file.");
-               fclose(f);
-       }
-
-       return val == 'Y';
+       return get_kvm_intel_param_bool("unrestricted_guest");
 }