Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp6044480pxb; Thu, 27 Jan 2022 05:23:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJx0WL5iUIURc/5lGAj6675ooGeLNOE07g+WgO5SVjv9A/MokkFB11nbTecUvjBcLBz0ux92 X-Received: by 2002:a17:903:1211:: with SMTP id l17mr3223902plh.11.1643289826022; Thu, 27 Jan 2022 05:23:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643289826; cv=none; d=google.com; s=arc-20160816; b=r3C22E5zqERx2pyt3pEIOoiRKjs1YUZy3NVv0CLkkefwupl3lqxudcb5z9OdQ4gEGP zzJbgFeqHv0/b3X4YbKCLxgo3rOUve6qywjF+qXFur+GbX1xQ3ojhVEjPrtz+t6W2kxO 7l4yVH/76hOLO02GlN/7wByHX+Qq8b5J9m1BBxilZnpEXDVGVYyUMMMpO4XrLTq/Xeuf LMQG2YywVwa4bhw9bNcI1YxCKV5IiynAXXerSgN3afAAc4scDe+z/+cyRcNWAcn6KAC0 Qtuss8f3EhQhddc0BCp6Pi6bW0y3XPbf1j009m/2D6ba69lmr904o7Ksqx5pNrWmhBzy +Q6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=KnwclrFFfqnfk2gvD5VfyOAcdJ0xz2bPvAIWCeWOSYg=; b=HFJ0KGkQHK+3LkHwJywy1w6FrN/XUsLXkjE6yQpoKLM389pQni2kHPBs+grKhzi2rg nvvd6Tzrq9aGkbJB5RapXp3PDUyqgGTjmFQYA+DXTd31IMRlub/5uM3Lv/o7Ls9oQpr9 apfcMjn6fCshJW7H5ICFjT5tmXR7iFehNYlNG1tTzS5JlFVZCuO2VebrD0emguLatSAI Fu2CSFyAnlXzL4CxQiSJWNkfweqngXO1E6zmJv0kkTZA8gNoVR9DxPWG+B6fWhAZKNQv /VgkfhXo5nEfSga2USNIFzZ6d+OSqv7B4PgDK0YplA7QAVWOJd4udjm/sKQp92aMt5rB ec+Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=antgroup.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w10si2013481plq.346.2022.01.27.05.23.22; Thu, 27 Jan 2022 05:23:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=antgroup.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231873AbiA0Gyx (ORCPT + 99 others); Thu, 27 Jan 2022 01:54:53 -0500 Received: from out0-136.mail.aliyun.com ([140.205.0.136]:51346 "EHLO out0-136.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229565AbiA0Gyw (ORCPT ); Thu, 27 Jan 2022 01:54:52 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R301e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018047213;MF=houwenlong.hwl@antgroup.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---.MiyL62r_1643266489; Received: from localhost(mailfrom:houwenlong.hwl@antgroup.com fp:SMTPD_---.MiyL62r_1643266489) by smtp.aliyun-inc.com(127.0.0.1); Thu, 27 Jan 2022 14:54:50 +0800 From: "Hou Wenlong" To: kvm@vger.kernel.org Cc: Hou Wenlong , Sean Christopherson , Paolo Bonzini , linux-kernel@vger.kernel.org Subject: [PATCH v2] KVM: eventfd: Fix false positive RCU usage warning Date: Thu, 27 Jan 2022 14:54:49 +0800 Message-Id: X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hou Wenlong Fix the following false positive warning: ============================= WARNING: suspicious RCU usage 5.16.0-rc4+ #57 Not tainted ----------------------------- arch/x86/kvm/../../../virt/kvm/eventfd.c:484 RCU-list traversed in non-reader section!! other info that might help us debug this: rcu_scheduler_active = 2, debug_locks = 1 3 locks held by fc_vcpu 0/330: #0: ffff8884835fc0b0 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0x88/0x6f0 [kvm] #1: ffffc90004c0bb68 (&kvm->srcu){....}-{0:0}, at: vcpu_enter_guest+0x600/0x1860 [kvm] #2: ffffc90004c0c1d0 (&kvm->irq_srcu){....}-{0:0}, at: kvm_notify_acked_irq+0x36/0x180 [kvm] stack backtrace: CPU: 26 PID: 330 Comm: fc_vcpu 0 Not tainted 5.16.0-rc4+ Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014 Call Trace: dump_stack_lvl+0x44/0x57 kvm_notify_acked_gsi+0x6b/0x70 [kvm] kvm_notify_acked_irq+0x8d/0x180 [kvm] kvm_ioapic_update_eoi+0x92/0x240 [kvm] kvm_apic_set_eoi_accelerated+0x2a/0xe0 [kvm] handle_apic_eoi_induced+0x3d/0x60 [kvm_intel] vmx_handle_exit+0x19c/0x6a0 [kvm_intel] vcpu_enter_guest+0x66e/0x1860 [kvm] kvm_arch_vcpu_ioctl_run+0x438/0x7f0 [kvm] kvm_vcpu_ioctl+0x38a/0x6f0 [kvm] __x64_sys_ioctl+0x89/0xc0 do_syscall_64+0x3a/0x90 entry_SYSCALL_64_after_hwframe+0x44/0xae Since kvm_unregister_irq_ack_notifier() does synchronize_srcu(&kvm->irq_srcu), i.e. kvm->irq_ack_notifier_list is protected by kvm->irq_srcu. And kvm->irq_srcu SRCU read lock is held in kvm_notify_acked_irq(), it's a false positive warning. Use hlist_for_each_entry_srcu() instead of hlist_for_each_entry_rcu() as it also checkes if the right lock is held. Reviewed-by: Sean Christopherson Signed-off-by: Hou Wenlong --- virt/kvm/eventfd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 2ad013b8bde9..59b1dd4a549e 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c @@ -463,8 +463,8 @@ bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin) idx = srcu_read_lock(&kvm->irq_srcu); gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin); if (gsi != -1) - hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, - link) + hlist_for_each_entry_srcu(kian, &kvm->irq_ack_notifier_list, + link, srcu_read_lock_held(&kvm->irq_srcu)) if (kian->gsi == gsi) { srcu_read_unlock(&kvm->irq_srcu, idx); return true; @@ -480,8 +480,8 @@ void kvm_notify_acked_gsi(struct kvm *kvm, int gsi) { struct kvm_irq_ack_notifier *kian; - hlist_for_each_entry_rcu(kian, &kvm->irq_ack_notifier_list, - link) + hlist_for_each_entry_srcu(kian, &kvm->irq_ack_notifier_list, + link, srcu_read_lock_held(&kvm->irq_srcu)) if (kian->gsi == gsi) kian->irq_acked(kian); } -- 2.31.1