Sean Christopherson <seanjc@xxxxxxxxxx> writes: > On Mon, Nov 22, 2021, Vitaly Kuznetsov wrote: >> 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 > > Any reason not to make this "buffer" extra large, e.g. 100+ to avoid having to > debug this issue again in the future? > No, not really. We could've avoided this ambiguity completely by checking how many fds are already open but all methods I can think of are 'too much'. In my testing I needed around 10 so I put '16' but '100' is even better. >> + >> 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); > > Rather than a separate define that's hard to describe succintly, what about: > > int nr_fds_wanted = kvm_max_vcpus + <arbitrary number> > > and then the body becomes > > if (nr_fds_wanted > rl.rlim_cur) { > rl.rlim_cur = nr_fds_wanted; > rl.rlim_max = max(rl.rlim_max, nr_fds_wanted); > > ... > } Sure but a "succinct" comment will still be needed, either near the 'NOFD' define or above 'int nr_fds_wanted' :-) > >> + 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); > > And strerror() output too? > Sure, will add in v2. >> + >> + 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 >> > -- Vitaly