From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4ADDC4338F for ; Fri, 30 Jul 2021 04:33:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8AA256052B for ; Fri, 30 Jul 2021 04:33:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230022AbhG3EdD (ORCPT ); Fri, 30 Jul 2021 00:33:03 -0400 Received: from ozlabs.ru ([107.174.27.60]:34640 "EHLO ozlabs.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229609AbhG3EdB (ORCPT ); Fri, 30 Jul 2021 00:33:01 -0400 Received: from fstn1-p1.ozlabs.ibm.com. (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id 37EE5AE80062; Fri, 30 Jul 2021 00:32:21 -0400 (EDT) From: Alexey Kardashevskiy To: linux-kernel@vger.kernel.org Cc: Alexey Kardashevskiy , kvm@vger.kernel.org, Paolo Bonzini Subject: [RFC PATCH kernel] KVM: Stop leaking memory in debugfs Date: Fri, 30 Jul 2021 14:32:17 +1000 Message-Id: <20210730043217.953384-1-aik@ozlabs.ru> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The debugfs folder name is made of a supposedly unique pair of the process pid and a VM fd. However it is possible to get a race here which manifests in these messages: [ 471.846235] debugfs: Directory '20245-4' with parent 'kvm' already present! debugfs_create_dir() returns an error which is handled correctly everywhere except kvm_create_vm_debugfs() where the code allocates stat data structs and overwrites the older values regardless. Spotted by syzkaller. This slow memory leak produces way too many OOM reports. Signed-off-by: Alexey Kardashevskiy --- I am pretty sure we better fix the race but I am not quite sure what lock is appropriate here, ideas? --- virt/kvm/kvm_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 986959833d70..89496fd8127a 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -904,6 +904,10 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, int fd) snprintf(dir_name, sizeof(dir_name), "%d-%d", task_pid_nr(current), fd); kvm->debugfs_dentry = debugfs_create_dir(dir_name, kvm_debugfs_dir); + if (IS_ERR_OR_NULL(kvm->debugfs_dentry)) { + pr_err("Failed to create %s\n", dir_name); + return 0; + } kvm->debugfs_stat_data = kcalloc(kvm_debugfs_num_entries, sizeof(*kvm->debugfs_stat_data), -- 2.30.2