With the elevated 'KVM_CAP_MAX_VCPUS' value kvm_create_max_vcpus test may hit RLIMIT_NOFILE limits: # ./kvm_create_max_vcpus KVM_CAP_MAX_VCPU_ID: 4096 KVM_CAP_MAX_VCPUS: 1024 Testing creating 1024 vCPUs, with IDs 0...1023. /dev/kvm not available (errno: 24), skipping test Adjust RLIMIT_NOFILE limits to make sure KVM_CAP_MAX_VCPUS fds can be opened. Note, raising hard limit ('rlim_max') requires CAP_SYS_RESOURCE capability which is generally not needed to run kvm selftests (but without raising the limit the test is doomed to fail anyway). Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> --- .../selftests/kvm/kvm_create_max_vcpus.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c index f968dfd4ee88..19198477a10e 100644 --- a/tools/testing/selftests/kvm/kvm_create_max_vcpus.c +++ b/tools/testing/selftests/kvm/kvm_create_max_vcpus.c @@ -12,6 +12,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/resource.h> #include "test_util.h" @@ -19,6 +20,9 @@ #include "asm/kvm.h" #include "linux/kvm.h" +/* 'Safe' number of open file descriptors in addition to vCPU fds needed */ +#define NOFD 16 + void test_vcpu_creation(int first_vcpu_id, int num_vcpus) { struct kvm_vm *vm; @@ -40,10 +44,28 @@ int main(int argc, char *argv[]) { int kvm_max_vcpu_id = kvm_check_cap(KVM_CAP_MAX_VCPU_ID); int kvm_max_vcpus = kvm_check_cap(KVM_CAP_MAX_VCPUS); + struct rlimit rl; pr_info("KVM_CAP_MAX_VCPU_ID: %d\n", kvm_max_vcpu_id); pr_info("KVM_CAP_MAX_VCPUS: %d\n", kvm_max_vcpus); + /* + * Creating KVM_CAP_MAX_VCPUS vCPUs require KVM_CAP_MAX_VCPUS open + * file decriptors. + */ + TEST_ASSERT(!getrlimit(RLIMIT_NOFILE, &rl), + "getrlimit() failed (errno: %d)", errno); + + if (kvm_max_vcpus > rl.rlim_cur - NOFD) { + rl.rlim_cur = kvm_max_vcpus + NOFD; + + if (kvm_max_vcpus > rl.rlim_max - NOFD) + rl.rlim_max = kvm_max_vcpus + NOFD; + + TEST_ASSERT(!setrlimit(RLIMIT_NOFILE, &rl), + "setrlimit() failed (errno: %d)", errno); + } + /* * Upstream KVM prior to 4.8 does not support KVM_CAP_MAX_VCPU_ID. * Userspace is supposed to use KVM_CAP_MAX_VCPUS as the maximum ID -- 2.33.1