Avoid debugfs warning like "KVM: debugfs: duplicate directory 59904-4" caused by creating VMs with the same vm fd number in a single process. As shown in the below test case, two test() are executed sequentially in a single process, each creating a new VM. Though the 2nd test() creates a new VM after the 1st test() closes the vm_fd, KVM prints warnings like "KVM: debugfs: duplicate directory 59904-4" on creating the 2nd VM. This is due to the dup() of the vcpu_fd in test(). So, after closing the 1st vm_fd, kvm->users_count of the 1st VM is still > 0 when creating the 2nd VM. So, KVM has not yet invoked kvm_destroy_vm() and kvm_destroy_vm_debugfs() for the 1st VM after closing the 1st vm_fd. The 2nd test() thus will be able to create a different VM with the same vm fd number as the 1st VM. Therefore, besides having "pid" and "fdname" in the dir_name of the debugfs, add a random number to differentiate different VMs to avoid printing warning, also allowing the 2nd VM to have a functional debugfs. Use get_random_u32() to avoid dir_name() taking up too much memory while greatly reducing the chance of printing warning. void test(void) { int kvm_fd, vm_fd, vcpu_fd; kvm_fd = open("/dev/kvm", O_RDWR); if (kvm_fd == -1) return; vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0); if (vm_fd == -1) return; vcpu_fd = ioctl(vm_fd, KVM_CREATE_VCPU, 0); if (vcpu_fd == -1) return; dup(vcpu_fd); close(vcpu_fd); close(vm_fd); close(kvm_fd); } int main() { test(); test(); return 0; } Signed-off-by: Ted Chen --- virt/kvm/kvm_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6c07dd423458..f92a60ed5de8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1017,7 +1017,7 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, const char *fdname) { static DEFINE_MUTEX(kvm_debugfs_lock); struct dentry *dent; - char dir_name[ITOA_MAX_LEN * 2]; + char dir_name[ITOA_MAX_LEN * 3]; struct kvm_stat_data *stat_data; const struct _kvm_stats_desc *pdesc; int i, ret = -ENOMEM; @@ -1027,7 +1027,8 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, const char *fdname) if (!debugfs_initialized()) return 0; - snprintf(dir_name, sizeof(dir_name), "%d-%s", task_pid_nr(current), fdname); + snprintf(dir_name, sizeof(dir_name), "%d-%s-%u", task_pid_nr(current), + fdname, get_random_u32()); mutex_lock(&kvm_debugfs_lock); dent = debugfs_lookup(dir_name, kvm_debugfs_dir); if (dent) { -- 2.39.2