From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 183F723098D for ; Fri, 16 May 2025 23:07:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436861; cv=none; b=k2i+uYNu1ctLpFycSwUywgZX5SGVsC52NjJTFLlDkum8/7fkif8GnysqKUAyIZ6AgyiPjRWS18qO/B4vOng+1hXWp17fZLGeq2gZQDl2GKaDmslWDI0jiEot4D1pW92roMeTZ11RZQaORyU+49gQ/ZuC1e70J6zNGt+dedPcjg8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436861; c=relaxed/simple; bh=I1ALcWIwC8w2ZTqFEjmPzQUw5bLz7mdjqS6Qdf0kmJ0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=VOP0TdihIAbnUCmdnNWxBckRrTA9WY1o7RhajH4dDlOR5mfkSuF75dIekq5/NBQJkn3hM7Z0mXE0pMHS0jtRjHRdmO/r+OPTgMVKsYmHGLFtF2sj75VsmplkmH5+sKzeY1VvTpZVarEj5fO92Ce4O0KnBy99mVWt7bIl0cFvre4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=q3VauYOt; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="q3VauYOt" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-30c9b0aa4ccso2378795a91.3 for ; Fri, 16 May 2025 16:07:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436859; x=1748041659; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=8kDa/puR8zC/TVy/ii11k+vGNrXdae9yxfqU/1udF6g=; b=q3VauYOtN04RZ0hh3sol0uU4/jLOh+yA68XJ3uItKyLT3IGd+IUTszJX85M7o6zT0D 7qy0tqgNdqvp1wmKi2BFS+nrWhz4T0xENqoVxul4ie15EgDjHQij82WJa/3Z1IB4PT7V rT8v+FuB8kKWm2gxY70LBr7Br2/n95XjlOV9kVGaUDbPS5vaxCttCDLJ1TFmX6j/g7OC 0I17Ed9BzisZ1vSGkvxDzJmZN8rFAYUqeSRDCtz3qE/jZgzeKU687JXaGKnp/BuV6eCq amyWSsLC908LB5kFMPQtclFcR/1whoRqCGHVG67bUjTwOweZ/N+3j8pM8JsQhLG5pmVh mTzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436859; x=1748041659; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8kDa/puR8zC/TVy/ii11k+vGNrXdae9yxfqU/1udF6g=; b=OLUK16MNlFGdnKYvmVVkunatSrm7Ytz8CnnfbpmzHrdCLpz07kF/nLHV4RDN3IpyCS JhxyrKpDrjUmRlSrjk+eudRmtevE6K83TU5haKzpzvY1+h3za+s5EecnhIrjjcNVCzVh 5ejBNu0sB1xX1N6ydx6Dey77xCLH0sz6A7zWdvpfqEwNIbpc2MJYjWVTvoN3sEK9ZnWl vmcBxRpWN33HMwsQmg1CvaF2bHtoJUPp3kxNke5x7fSokr66AR1LliVN+J22TTPMXGOD hoMcinOPftUfVTR69Z4AYjdMxelxOiFvrI49LdwEu6+AEDUAJ7MR1866u3JtidCzLO2/ y6YA== X-Forwarded-Encrypted: i=1; AJvYcCVPqKyFJDQ1I0abT+QpIi/0CzVOSUnazjhmbgEu/9MBRP/zRwKTYBab0Lx2Ci/+YGb4KIH6Wp/4yyzCedE=@vger.kernel.org X-Gm-Message-State: AOJu0YzudkQamxAsuKHIJxg7vr1KXOu77P4/LTDSSG+3zTjnfWhJeJw9 hpc0lENOzjCFjUm+Jn+DJXNRQL+2RHpFN4OgLIwH3rjgyd2sB/UT/mU5Ad2EbapHPaR6YReymIT 5dvqtfA== X-Google-Smtp-Source: AGHT+IGms52EOzdUpeUySel370WkLvf5qcqXwBrssv6N0gEIpnS2oZ+4XnP+3IKYtmrBjEsQ2ftNzRdpjys= X-Received: from pjbsb5.prod.google.com ([2002:a17:90b:50c5:b0:301:2679:9d9]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3e8e:b0:301:1bce:c255 with SMTP id 98e67ed59e1d1-30e7d5a93bamr7142197a91.27.1747436859419; Fri, 16 May 2025 16:07:39 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:27 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-2-seanjc@google.com> Subject: [PATCH v2 1/8] irqbypass: Drop pointless and misleading THIS_MODULE get/put From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop irqbypass.ko's superfluous and misleading get/put calls on THIS_MODULE. A module taking a reference to itself is useless; no amount of checks will prevent doom and destruction if the caller hasn't already guaranteed the liveliness of the module (this goes for any module). E.g. if try_module_get() fails because irqbypass.ko is being unloaded, then the kernel has already hit a use-after-free by virtue of executing code whose lifecycle is tied to irqbypass.ko. Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- virt/lib/irqbypass.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 28fda42e471b..080c706f3b01 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -92,9 +92,6 @@ int irq_bypass_register_producer(struct irq_bypass_produc= er *producer) =20 might_sleep(); =20 - if (!try_module_get(THIS_MODULE)) - return -ENODEV; - mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { @@ -120,7 +117,6 @@ int irq_bypass_register_producer(struct irq_bypass_prod= ucer *producer) return 0; out_err: mutex_unlock(&lock); - module_put(THIS_MODULE); return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); @@ -142,9 +138,6 @@ void irq_bypass_unregister_producer(struct irq_bypass_p= roducer *producer) =20 might_sleep(); =20 - if (!try_module_get(THIS_MODULE)) - return; /* nothing in the list anyway */ - mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { @@ -159,13 +152,10 @@ void irq_bypass_unregister_producer(struct irq_bypass= _producer *producer) } =20 list_del(&producer->node); - module_put(THIS_MODULE); break; } =20 mutex_unlock(&lock); - - module_put(THIS_MODULE); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); =20 @@ -188,9 +178,6 @@ int irq_bypass_register_consumer(struct irq_bypass_cons= umer *consumer) =20 might_sleep(); =20 - if (!try_module_get(THIS_MODULE)) - return -ENODEV; - mutex_lock(&lock); =20 list_for_each_entry(tmp, &consumers, node) { @@ -216,7 +203,6 @@ int irq_bypass_register_consumer(struct irq_bypass_cons= umer *consumer) return 0; out_err: mutex_unlock(&lock); - module_put(THIS_MODULE); return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); @@ -238,9 +224,6 @@ void irq_bypass_unregister_consumer(struct irq_bypass_c= onsumer *consumer) =20 might_sleep(); =20 - if (!try_module_get(THIS_MODULE)) - return; /* nothing in the list anyway */ - mutex_lock(&lock); =20 list_for_each_entry(tmp, &consumers, node) { @@ -255,12 +238,9 @@ void irq_bypass_unregister_consumer(struct irq_bypass_= consumer *consumer) } =20 list_del(&consumer->node); - module_put(THIS_MODULE); break; } =20 mutex_unlock(&lock); - - module_put(THIS_MODULE); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB4D0280A2B for ; Fri, 16 May 2025 23:07:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436864; cv=none; b=LwBhweqws+b49LooWewiP4o8o+nrSsEWPEaGdLfWN94bHk3e1ZaNbaVwzMKAs9lMvVPLwXvam2SIPktTnUH4LqcDnClbw0m1DAPu58jrX6tSEc40wxRboBTUG97Nw3Kudv09/r9UCre2+u5eoXGqPQXJYLgzWfvD+7Y3wtIPxzQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436864; c=relaxed/simple; bh=53lKZIp0QEDIxAnbUsZj0HBAIqsGZWy+CnuC9aywW/o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hqFJ/kRv4QWpI0QmCRn30iZlMGWxVWU/2p4NUpWOiFbDF+szVQ4f+i2Y5AU1YACmG27v61S/dDD41izgIoTY6o6m/qaPnlHYF8N5NRP4WitAcReIlc4YgQFWnR/rKcix7lgwT7CixFYug8kjHyt4NRCpSo/BE3khLs9GprPi6cc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=1SJwF6jV; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="1SJwF6jV" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-740270e168aso2422455b3a.1 for ; Fri, 16 May 2025 16:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436861; x=1748041661; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=NfgqeidfxQ2kyf1sJo8U3YZ4JNEzadROFUB65CCKoYo=; b=1SJwF6jVGsvJoqd7rhdiq8l+du2JROSxasleJXx2a1zJBqZXLji5/fkOVoQd8NqSxH pNbdrk+mTqX9TtvCsHE9HjJx4j4svaV/P+xtnm5hvPCBHWSCe+8YF0ryxYnvVk396c7P HqRhRQUNx4qcWu4S8rhczJaraF8RFGo49QbbzrwurKLMl/mra89bohu8veF+4h79eTtg aRCSabpnOqgoyKNFKPk+nuxLMYD3KSBxT7XUxuY/37Txi6a9jsNwgpHMKs6QCiP74kor hQtv0ZfL9YKNKqgbmc27MPeh6w3DYczy0gSFLlu1Sw4zg+pwyaniaaaC29hA6smVkhGk 1gBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436861; x=1748041661; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=NfgqeidfxQ2kyf1sJo8U3YZ4JNEzadROFUB65CCKoYo=; b=ijUJGHkBhaToVI8wjrHINtRVKKVEk0NcpN+J58pDSGXbyRmi7HSOjk3KkjfRG3Lr/D HfXQV9fgm/v52TVJT5c/2ltQWlwd4YYWfJea6BYX2dE0IylxfLMmXkyVJqvFOJQPkYMj BR59AdHMa2GG9MMYbAFqkVuGd4PgmBbMQ+wcvAY0a354qhiod0mbHZprU6lpltWXwfqw 7Cvh+GyMIyV4E+94pwJgzeUdBwPKRElnxVck4mDNFuuMA1GTCeC11IMici6ILJWEqbSg e8L7sHtyb5ga8exLEVUr/xLlro16fZ6KesA4SjZR0MXA5ah7kFXCiZZIxgQ1SE1OwKTK rT2Q== X-Forwarded-Encrypted: i=1; AJvYcCUHSIXDvYxwA0nsLRnBDRuSqkQ+3nl9tE0aptHGu+tvGBkdJSpT7HLwMIexe+pRt0iVJqcsHiibeMSzWic=@vger.kernel.org X-Gm-Message-State: AOJu0YxZrLUsjp+xHr9HJZaYZXzFHDU13Jm5XKgRk8pouexYVoHJ/JtP jnkMWCA+ss8KMJ9YhJoceKkTxWOQYjLVQUh6e/EIFw/kCoSMe1sPOq05jIi246FZbDEl+i9oewj sP2x9LQ== X-Google-Smtp-Source: AGHT+IEpuk3JhFswrcOYHhuNZFtNFDjaC6SxgeOCtP19MsiXoVMuiAOEkn9SRzfq0mcswFVBZevjQHeWqN0= X-Received: from pfst15.prod.google.com ([2002:aa7:8f8f:0:b0:742:aa0f:2420]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ac6:b0:736:32d2:aa8e with SMTP id d2e1a72fcca58-742a97a16bbmr6249072b3a.6.1747436860987; Fri, 16 May 2025 16:07:40 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:28 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-3-seanjc@google.com> Subject: [PATCH v2 2/8] irqbypass: Drop superfluous might_sleep() annotations From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drop superfluous might_sleep() annotations from irqbypass, mutex_lock() provides all of the necessary tracking. Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- virt/lib/irqbypass.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 080c706f3b01..28a4d933569a 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -90,8 +90,6 @@ int irq_bypass_register_producer(struct irq_bypass_produc= er *producer) if (!producer->token) return -EINVAL; =20 - might_sleep(); - mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { @@ -136,8 +134,6 @@ void irq_bypass_unregister_producer(struct irq_bypass_p= roducer *producer) if (!producer->token) return; =20 - might_sleep(); - mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { @@ -176,8 +172,6 @@ int irq_bypass_register_consumer(struct irq_bypass_cons= umer *consumer) !consumer->add_producer || !consumer->del_producer) return -EINVAL; =20 - might_sleep(); - mutex_lock(&lock); =20 list_for_each_entry(tmp, &consumers, node) { @@ -222,8 +216,6 @@ void irq_bypass_unregister_consumer(struct irq_bypass_c= onsumer *consumer) if (!consumer->token) return; =20 - might_sleep(); - mutex_lock(&lock); =20 list_for_each_entry(tmp, &consumers, node) { --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E151281351 for ; Fri, 16 May 2025 23:07:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436865; cv=none; b=u/FcpLfqN3G98RoJ9M5h8HG6m9Bwc6eoBysz/P3IP51GJQAD8DgwLBc8jeZVxTTUQOr23AthN9INO8wuqdN+/4Z0PhJwok2RKu+kJxYOJlBEO1ra3mTTO9KJ0d/ZAJld6vnWc0tVbOrqMpd9J4u+bPY6LAAnmSiOqaMjho3EJtA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436865; c=relaxed/simple; bh=3tOfy0wPMzmmtgf16NbWP4Jo1oouiVgnLtYKdu2JdA8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=hlUBrP+Ha8xTl8lKHGOm5OtZrvn6uSE8ooc/1X238HHicIc09OPzZNsuOs1AcK30VOtlaIKb2aav064xU+M+zBTfHmLtFlwuHJxnYKnvv2Ue8DPVhFiXdRO8mGjlF1GhuPDFe/RahYgAj8qRm3Qjxk/1jZqa3feaEUNKG8SZWvI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=qeM2KjK1; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="qeM2KjK1" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-74089884644so2361395b3a.3 for ; Fri, 16 May 2025 16:07:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436863; x=1748041663; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=8ro5pucdXOXxQU01a4cvnDr2WLudpDkRjBvhYSrYOz0=; b=qeM2KjK1AGeOG36OoO3gmjhu7u6xb6qFo5F6OoNB27v58xzgwBfmxCetFDR4BM07SS ASTVaCJl0xXcg9frD4OPrSbna8W7BeKPB135ZtjFksl3hKoROFgQM/GZ9zV/Mp6x907A 4JDYzawIv+I3fdnJ/7iPdVluWbRkbti+ynqXuMcgD4P73z3CrBBGhE3aXkntnz2I/m6X FTopR2jbvjEEwfZiXVWNINsVpk0UvjI6MMGHo3xTCkvbGyc4P6lsawYAUTwRtgJsox2Z UC+rzlUaasl5PJob62xax8bm1X34CNNRp51F7CiUgDUYtCRvBK6M2C7XdYS8AJGg/Hdi uSEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436863; x=1748041663; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8ro5pucdXOXxQU01a4cvnDr2WLudpDkRjBvhYSrYOz0=; b=J7VMRgcFlUrmB2iyeofGnoUTApYnQ40GuIPLIWwcHyvo7C3ChLYjZKfsy5o5guu3s5 WjYVAaEH+ucQtcHJMynZVTzA3VbP03CufwQn+DsvOajMeBK7mOWxITlW1k1RkKU5Vqnl KCTBWtySOb4h7AYYB5Zjgws8G2lzNBw+Yx3T0vWlcMHI4SlXqtne8JBFG0oxfnyAVJ8B ZCA9qZUnj+mFOkx2TcI2s+sDMz3ysVGH0aaifs421HZLb2P5jNMRkA17aKtZPwX2B4gL xmPYwbIXRDylqxKyn0PHTZwRmAl89xJ5wh7FMwwbCt81BYUe/dZUwq0gCCKnValKa8mr LtUg== X-Forwarded-Encrypted: i=1; AJvYcCW/FDlE3+PVF8dOUXdZ+XapLAQv0OKsDQn6DzJBOwAo9Bfp5snLdLIgszxIdadj1dN8/MI5bsEzALr0TBo=@vger.kernel.org X-Gm-Message-State: AOJu0YwWBsVAHNqvPMLTSTLK1dZO+Fd+bJwBeutgxfO/w022oWCi/LLg xCHY40QsfuigXYc9LjwvwuaCbXqPu0BvynohOvbZ4GTZWSMQ9mEg5FUWSfyps27P54de04qbrxI kwomXSg== X-Google-Smtp-Source: AGHT+IHuBd6leiNTcn0nzvJq72WI9YGScV8jwRnPwk8riDF4/dQUj4oqlwemFkXW+9J9DbTmCWfYlt852cA= X-Received: from pfbkm11.prod.google.com ([2002:a05:6a00:3c4b:b0:740:813:f7bb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:b56:b0:740:a52f:a126 with SMTP id d2e1a72fcca58-742accc52cbmr5169945b3a.9.1747436862766; Fri, 16 May 2025 16:07:42 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:29 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-4-seanjc@google.com> Subject: [PATCH v2 3/8] irqbypass: Take ownership of producer/consumer token tracking From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move ownership of IRQ bypass token tracking into irqbypass.ko, and explicitly require callers to pass an eventfd_ctx structure instead of a completely opaque token. Relying on producers and consumers to set the token appropriately is error prone, and hiding the fact that the token must be an eventfd_ctx pointer (for all intents and purposes) unnecessarily obfuscates the code and makes it more brittle. Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- arch/x86/kvm/x86.c | 4 +-- drivers/vfio/pci/vfio_pci_intrs.c | 9 +++---- drivers/vhost/vdpa.c | 8 +++--- include/linux/irqbypass.h | 35 +++++++++++++----------- virt/kvm/eventfd.c | 7 +++-- virt/lib/irqbypass.c | 44 ++++++++++++++++++++----------- 6 files changed, 58 insertions(+), 49 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index f9f798f286ce..c219aab2187f 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -13667,8 +13667,8 @@ void kvm_arch_irq_bypass_del_producer(struct irq_by= pass_consumer *cons, ret =3D kvm_x86_call(pi_update_irte)(irqfd->kvm, prod->irq, irqfd->gsi, 0); if (ret) - printk(KERN_INFO "irq bypass consumer (token %p) unregistration" - " fails: %d\n", irqfd->consumer.token, ret); + printk(KERN_INFO "irq bypass consumer (eventfd %p) unregistration" + " fails: %d\n", irqfd->consumer.eventfd, ret); =20 spin_unlock_irq(&kvm->irqfds.lock); =20 diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_= intrs.c index 565966351dfa..d87fe116762a 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -505,15 +505,12 @@ static int vfio_msi_set_vector_signal(struct vfio_pci= _core_device *vdev, if (ret) goto out_put_eventfd_ctx; =20 - ctx->producer.token =3D trigger; ctx->producer.irq =3D irq; - ret =3D irq_bypass_register_producer(&ctx->producer); + ret =3D irq_bypass_register_producer(&ctx->producer, trigger); if (unlikely(ret)) { dev_info(&pdev->dev, - "irq bypass producer (token %p) registration fails: %d\n", - ctx->producer.token, ret); - - ctx->producer.token =3D NULL; + "irq bypass producer (eventfd %p) registration fails: %d\n", + trigger, ret); } ctx->trigger =3D trigger; =20 diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 5a49b5a6d496..7b265ffda697 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -213,10 +213,10 @@ static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa= *v, u16 qid) return; =20 vq->call_ctx.producer.irq =3D irq; - ret =3D irq_bypass_register_producer(&vq->call_ctx.producer); + ret =3D irq_bypass_register_producer(&vq->call_ctx.producer, vq->call_ctx= .ctx); if (unlikely(ret)) - dev_info(&v->dev, "vq %u, irq bypass producer (token %p) registration fa= ils, ret =3D %d\n", - qid, vq->call_ctx.producer.token, ret); + dev_info(&v->dev, "vq %u, irq bypass producer (eventfd %p) registration = fails, ret =3D %d\n", + qid, vq->call_ctx.ctx, ret); } =20 static void vhost_vdpa_unsetup_vq_irq(struct vhost_vdpa *v, u16 qid) @@ -712,7 +712,6 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v= , unsigned int cmd, if (ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK) vhost_vdpa_unsetup_vq_irq(v, idx); - vq->call_ctx.producer.token =3D NULL; } break; } @@ -753,7 +752,6 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v= , unsigned int cmd, cb.callback =3D vhost_vdpa_virtqueue_cb; cb.private =3D vq; cb.trigger =3D vq->call_ctx.ctx; - vq->call_ctx.producer.token =3D vq->call_ctx.ctx; if (ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK) vhost_vdpa_setup_vq_irq(v, idx); diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index 9bdb2a781841..1b57d15ac4cf 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -10,6 +10,7 @@ =20 #include =20 +struct eventfd_ctx; struct irq_bypass_consumer; =20 /* @@ -18,20 +19,20 @@ struct irq_bypass_consumer; * The IRQ bypass manager is a simple set of lists and callbacks that allo= ws * IRQ producers (ex. physical interrupt sources) to be matched to IRQ * consumers (ex. virtualization hardware that allows IRQ bypass or offloa= d) - * via a shared token (ex. eventfd_ctx). Producers and consumers register - * independently. When a token match is found, the optional @stop callback - * will be called for each participant. The pair will then be connected v= ia - * the @add_* callbacks, and finally the optional @start callback will all= ow - * any final coordination. When either participant is unregistered, the - * process is repeated using the @del_* callbacks in place of the @add_* - * callbacks. Match tokens must be unique per producer/consumer, 1:N pair= ings - * are not supported. + * via a shared eventfd_ctx. Producers and consumers register independent= ly. + * When a producer and consumer are paired, i.e. an eventfd match is found= , the + * optional @stop callback will be called for each participant. The pair = will + * then be connected via the @add_* callbacks, and finally the optional @s= tart + * callback will allow any final coordination. When either participant is + * unregistered, the process is repeated using the @del_* callbacks in pla= ce of + * the @add_* callbacks. eventfds must be unique per producer/consumer, 1= :N + * pairings are not supported. */ =20 /** * struct irq_bypass_producer - IRQ bypass producer definition * @node: IRQ bypass manager private list management - * @token: opaque token to match between producer and consumer (non-NULL) + * @eventfd: eventfd context used to match producers and consumers * @irq: Linux IRQ number for the producer device * @add_consumer: Connect the IRQ producer to an IRQ consumer (optional) * @del_consumer: Disconnect the IRQ producer from an IRQ consumer (option= al) @@ -44,7 +45,7 @@ struct irq_bypass_consumer; */ struct irq_bypass_producer { struct list_head node; - void *token; + struct eventfd_ctx *eventfd; int irq; int (*add_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *); @@ -57,7 +58,7 @@ struct irq_bypass_producer { /** * struct irq_bypass_consumer - IRQ bypass consumer definition * @node: IRQ bypass manager private list management - * @token: opaque token to match between producer and consumer (non-NULL) + * @eventfd: eventfd context used to match producers and consumers * @add_producer: Connect the IRQ consumer to an IRQ producer * @del_producer: Disconnect the IRQ consumer from an IRQ producer * @stop: Perform any quiesce operations necessary prior to add/del (optio= nal) @@ -70,7 +71,7 @@ struct irq_bypass_producer { */ struct irq_bypass_consumer { struct list_head node; - void *token; + struct eventfd_ctx *eventfd; int (*add_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *); void (*del_producer)(struct irq_bypass_consumer *, @@ -79,9 +80,11 @@ struct irq_bypass_consumer { void (*start)(struct irq_bypass_consumer *); }; =20 -int irq_bypass_register_producer(struct irq_bypass_producer *); -void irq_bypass_unregister_producer(struct irq_bypass_producer *); -int irq_bypass_register_consumer(struct irq_bypass_consumer *); -void irq_bypass_unregister_consumer(struct irq_bypass_consumer *); +int irq_bypass_register_producer(struct irq_bypass_producer *producer, + struct eventfd_ctx *eventfd); +void irq_bypass_unregister_producer(struct irq_bypass_producer *producer); +int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, + struct eventfd_ctx *eventfd); +void irq_bypass_unregister_consumer(struct irq_bypass_consumer *consumer); =20 #endif /* IRQBYPASS_H */ diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 11e5d1e3f12e..5bc6abe30748 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c @@ -426,15 +426,14 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *a= rgs) =20 #if IS_ENABLED(CONFIG_HAVE_KVM_IRQ_BYPASS) if (kvm_arch_has_irq_bypass()) { - irqfd->consumer.token =3D (void *)irqfd->eventfd; irqfd->consumer.add_producer =3D kvm_arch_irq_bypass_add_producer; irqfd->consumer.del_producer =3D kvm_arch_irq_bypass_del_producer; irqfd->consumer.stop =3D kvm_arch_irq_bypass_stop; irqfd->consumer.start =3D kvm_arch_irq_bypass_start; - ret =3D irq_bypass_register_consumer(&irqfd->consumer); + ret =3D irq_bypass_register_consumer(&irqfd->consumer, irqfd->eventfd); if (ret) - pr_info("irq bypass consumer (token %p) registration fails: %d\n", - irqfd->consumer.token, ret); + pr_info("irq bypass consumer (eventfd %p) registration fails: %d\n", + irqfd->eventfd, ret); } #endif =20 diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 28a4d933569a..e8d7c420db52 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -77,30 +77,32 @@ static void __disconnect(struct irq_bypass_producer *pr= od, /** * irq_bypass_register_producer - register IRQ bypass producer * @producer: pointer to producer structure + * @eventfd: pointer to the eventfd context associated with the producer * * Add the provided IRQ producer to the list of producers and connect - * with any matching token found on the IRQ consumers list. + * with any matching eventfd found on the IRQ consumers list. */ -int irq_bypass_register_producer(struct irq_bypass_producer *producer) +int irq_bypass_register_producer(struct irq_bypass_producer *producer, + struct eventfd_ctx *eventfd) { struct irq_bypass_producer *tmp; struct irq_bypass_consumer *consumer; int ret; =20 - if (!producer->token) + if (WARN_ON_ONCE(producer->eventfd)) return -EINVAL; =20 mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { - if (tmp->token =3D=3D producer->token) { + if (tmp->eventfd =3D=3D eventfd) { ret =3D -EBUSY; goto out_err; } } =20 list_for_each_entry(consumer, &consumers, node) { - if (consumer->token =3D=3D producer->token) { + if (consumer->eventfd =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) goto out_err; @@ -108,6 +110,7 @@ int irq_bypass_register_producer(struct irq_bypass_prod= ucer *producer) } } =20 + producer->eventfd =3D eventfd; list_add(&producer->node, &producers); =20 mutex_unlock(&lock); @@ -131,26 +134,28 @@ void irq_bypass_unregister_producer(struct irq_bypass= _producer *producer) struct irq_bypass_producer *tmp; struct irq_bypass_consumer *consumer; =20 - if (!producer->token) + if (!producer->eventfd) return; =20 mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { - if (tmp->token !=3D producer->token) + if (tmp->eventfd !=3D producer->eventfd) continue; =20 list_for_each_entry(consumer, &consumers, node) { - if (consumer->token =3D=3D producer->token) { + if (consumer->eventfd =3D=3D producer->eventfd) { __disconnect(producer, consumer); break; } } =20 + producer->eventfd =3D NULL; list_del(&producer->node); break; } =20 + WARN_ON_ONCE(producer->eventfd); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); @@ -158,31 +163,35 @@ EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); /** * irq_bypass_register_consumer - register IRQ bypass consumer * @consumer: pointer to consumer structure + * @eventfd: pointer to the eventfd context associated with the consumer * * Add the provided IRQ consumer to the list of consumers and connect - * with any matching token found on the IRQ producer list. + * with any matching eventfd found on the IRQ producer list. */ -int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer) +int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, + struct eventfd_ctx *eventfd) { struct irq_bypass_consumer *tmp; struct irq_bypass_producer *producer; int ret; =20 - if (!consumer->token || - !consumer->add_producer || !consumer->del_producer) + if (WARN_ON_ONCE(consumer->eventfd)) + return -EINVAL; + + if (!consumer->add_producer || !consumer->del_producer) return -EINVAL; =20 mutex_lock(&lock); =20 list_for_each_entry(tmp, &consumers, node) { - if (tmp->token =3D=3D consumer->token || tmp =3D=3D consumer) { + if (tmp->eventfd =3D=3D eventfd) { ret =3D -EBUSY; goto out_err; } } =20 list_for_each_entry(producer, &producers, node) { - if (producer->token =3D=3D consumer->token) { + if (producer->eventfd =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) goto out_err; @@ -190,6 +199,7 @@ int irq_bypass_register_consumer(struct irq_bypass_cons= umer *consumer) } } =20 + consumer->eventfd =3D eventfd; list_add(&consumer->node, &consumers); =20 mutex_unlock(&lock); @@ -213,7 +223,7 @@ void irq_bypass_unregister_consumer(struct irq_bypass_c= onsumer *consumer) struct irq_bypass_consumer *tmp; struct irq_bypass_producer *producer; =20 - if (!consumer->token) + if (!consumer->eventfd) return; =20 mutex_lock(&lock); @@ -223,16 +233,18 @@ void irq_bypass_unregister_consumer(struct irq_bypass= _consumer *consumer) continue; =20 list_for_each_entry(producer, &producers, node) { - if (producer->token =3D=3D consumer->token) { + if (producer->eventfd =3D=3D consumer->eventfd) { __disconnect(producer, consumer); break; } } =20 + consumer->eventfd =3D NULL; list_del(&consumer->node); break; } =20 + WARN_ON_ONCE(consumer->eventfd); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FBA02820A1 for ; Fri, 16 May 2025 23:07:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436867; cv=none; b=QEyaCKDOGIApR8aHy/KGY78GaZUs+dfB20ulTkKOJvtFrJ7reV3kMzHmU2NaYb/rKolYpvD3WhxfLA3s8KV8aChSpWW2cO5qC9aQ2JzCuOdVHzRh9QLPLFYV7lxSvHhYlYOmtXhR2sZ2GlLs0dpkhdVBNOmTxfxuCTIOaMxfvHg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436867; c=relaxed/simple; bh=LXzlgHyJWhAACXWbAPkfKszMlKXyO2bFe2sK3lMkj8Y=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AbxU/HvhPy46iQOm98Pkwg4BvLEyG3xKY45djheF+iD1uE+5wW+vSdSr/wA+YxpDcIjnGECQfq0nNd3igdIOFq1MwfW1Cvl8W4aKwkC/Xhacf2yEx98jdHiOakBoS4zKEPkWPn93gbXepsTvlJ1lmGpmRU/p93s6qbHYxNlP3sM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=n04i6Q1F; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="n04i6Q1F" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7394792f83cso2011159b3a.3 for ; Fri, 16 May 2025 16:07:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436866; x=1748041666; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=+HnZi3oDQ4eOcZyXHAiIALwrX3oRAnjbvkn+7/oMfkg=; b=n04i6Q1FjF0oyxPU0NPPY1pHCvagfLJ+q0lPPc7y4T61k1nnWpD8lLB8EhtpU41RYM 6UGtz3tpghoZAFUlATDEp4EJjc47VNJk20kCZccOQYiA2J+chYUtLyG+cKOtBume9QZo 6F5lph35K86Vma3/YxP03vWV/tl5rn/LOsBs2v+M1w+ZWXyNgcG0bHf1vd0iPmA03aK7 RwkbMVsuJy2yTkN99623J9abxmubPEoMV7Qb2CVwtUAmnjocVz2CPLzI4G2pDUArx6gP bqwqRLP1aRzlZwjKsZj4aSKwZ6N5mgAS9hMW/tW6MF9xmRvj1f1VIcB9opVw/o9xp1wN HZ5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436866; x=1748041666; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+HnZi3oDQ4eOcZyXHAiIALwrX3oRAnjbvkn+7/oMfkg=; b=uJrtVEyfDkfwyaTg5IYA4y4uOjKxd60ni92DNHS2urDDN5iQJify6DbvEf1pdBPNhu 89187seYSZpUzT1/zPyfM9R7gluvGf05t0FRV3DOBID0mriRkH+XG60JoeIiYQswPdZW pBntlmDdIgd7JsEggr3LV9l2XciU/0atLOUVjBat7Mq9bUguXA3y/ZtOD1qJl9ri5qvx pGikM0hzN6+5OMInYlC45lEHsMSSpo1bWG4WXm1MdcG4b/t8eK+I5514vOsS7nPN3kuW 8z48OKe+ZLI2E8K5Awt1MbHcppbBFwJBRK1HyXusGaInjR9cd2KLQpnasd50nXSJ61k7 SezA== X-Forwarded-Encrypted: i=1; AJvYcCVJAx125xxb4iCQgEi6kk1npd+NQMw90P9OOYJ60CquesJsOQng7TNDsdmpZ1wLAntg5mDm3x6xW+rk++Y=@vger.kernel.org X-Gm-Message-State: AOJu0YycadysuPa+CUtaKRmlkDtcht5SJeqf/leh35yOwoUBoh5FlJ9s dbDktvwtDp3RtkI7ADKn9y4bTnaXh5jyQB0n3FVdE7Cg6Imtms2W3vP2YMP0MGFAghN2Ts9Qlkp Pvlw2bA== X-Google-Smtp-Source: AGHT+IEGr4DLQ/k+zVDPTA3QzCbhpesiuJ3Rc20pXKhfdxG6vKdbrJk/l1JnNXE3bXTLhq+xJb2nY6Mhx3U= X-Received: from pfbmc24.prod.google.com ([2002:a05:6a00:7698:b0:740:b53a:e67f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:ca:b0:742:aecc:c47c with SMTP id d2e1a72fcca58-742aeccc69cmr4693335b3a.7.1747436865717; Fri, 16 May 2025 16:07:45 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:30 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-5-seanjc@google.com> Subject: [PATCH v2 4/8] irqbypass: Explicitly track producer and consumer bindings From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Explicitly track IRQ bypass producer:consumer bindings. This will allow making removal an O(1) operation; searching through the list to find information that is trivially tracked (and useful for debug) is wasteful. Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- include/linux/irqbypass.h | 7 +++++++ virt/lib/irqbypass.c | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index 1b57d15ac4cf..b28197c87483 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -29,10 +29,13 @@ struct irq_bypass_consumer; * pairings are not supported. */ =20 +struct irq_bypass_consumer; + /** * struct irq_bypass_producer - IRQ bypass producer definition * @node: IRQ bypass manager private list management * @eventfd: eventfd context used to match producers and consumers + * @consumer: The connected consumer (NULL if no connection) * @irq: Linux IRQ number for the producer device * @add_consumer: Connect the IRQ producer to an IRQ consumer (optional) * @del_consumer: Disconnect the IRQ producer from an IRQ consumer (option= al) @@ -46,6 +49,7 @@ struct irq_bypass_consumer; struct irq_bypass_producer { struct list_head node; struct eventfd_ctx *eventfd; + struct irq_bypass_consumer *consumer; int irq; int (*add_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *); @@ -59,6 +63,7 @@ struct irq_bypass_producer { * struct irq_bypass_consumer - IRQ bypass consumer definition * @node: IRQ bypass manager private list management * @eventfd: eventfd context used to match producers and consumers + * @producer: The connected producer (NULL if no connection) * @add_producer: Connect the IRQ consumer to an IRQ producer * @del_producer: Disconnect the IRQ consumer from an IRQ producer * @stop: Perform any quiesce operations necessary prior to add/del (optio= nal) @@ -72,6 +77,8 @@ struct irq_bypass_producer { struct irq_bypass_consumer { struct list_head node; struct eventfd_ctx *eventfd; + struct irq_bypass_producer *producer; + int (*add_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *); void (*del_producer)(struct irq_bypass_consumer *, diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index e8d7c420db52..fdbf7ecc0c21 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -51,6 +51,10 @@ static int __connect(struct irq_bypass_producer *prod, if (prod->start) prod->start(prod); =20 + if (!ret) { + prod->consumer =3D cons; + cons->producer =3D prod; + } return ret; } =20 @@ -72,6 +76,9 @@ static void __disconnect(struct irq_bypass_producer *prod, cons->start(cons); if (prod->start) prod->start(prod); + + prod->consumer =3D NULL; + cons->producer =3D NULL; } =20 /** @@ -145,6 +152,7 @@ void irq_bypass_unregister_producer(struct irq_bypass_p= roducer *producer) =20 list_for_each_entry(consumer, &consumers, node) { if (consumer->eventfd =3D=3D producer->eventfd) { + WARN_ON_ONCE(producer->consumer !=3D consumer); __disconnect(producer, consumer); break; } @@ -234,6 +242,7 @@ void irq_bypass_unregister_consumer(struct irq_bypass_c= onsumer *consumer) =20 list_for_each_entry(producer, &producers, node) { if (producer->eventfd =3D=3D consumer->eventfd) { + WARN_ON_ONCE(consumer->producer !=3D producer); __disconnect(producer, consumer); break; } --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31C7628313A for ; Fri, 16 May 2025 23:07:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436869; cv=none; b=EtkC2AsKxwVLQ5shi8Q57BjDbRNQG+ZYAa3AJYcyQa7IRxQFFuP1EyYQQjx5dW0OUYuKAyvXHesnEzx8MHwgEnGIIZO21xsSUz7WKmxVxkPRUOKx3zrca76LAKk9WP0UVz3s3gQw/YxltJuorbOCVig8PhHu0ZEKiBpniZpw/rQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436869; c=relaxed/simple; bh=9fbaq6CwF6vLyggy/XV/8/w2/CV/cudq3CDw85TXlSE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=njWriK2u0OKtaY1j5GhCCutcT2WM/xVQaaedvYkq2nbvuJMmP5pRWh1mdadZJYtLubC3jJUan+Er4SdVUO1m8CXAGjkfSrADChihQ6+Xf+xmcd8gw2uH9UVxLkxfgfHia9zGOJRM7D3DKKAU8CuLjMq8zFwuRIhabpUFtXGalzA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Y7kY1pKJ; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Y7kY1pKJ" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-73dcce02a5cso1756740b3a.0 for ; Fri, 16 May 2025 16:07:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436867; x=1748041667; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=oe5thiWbXg0oQhkHd+uP+1sLcx+Gwe9eK60YPiQS+Fw=; b=Y7kY1pKJnFIDf1qHpybNFR4/E0j2z6oX/y1xW/ATRroSbZ7hmZEXBf7/eOhY5NkUh2 +Du3R2D7tR7Ik4wNPhgmPsyoAnYraDYJ1bCF4uyUlMe9Cmqq9NE0DY/x+2gyfrEMGajP xKMdIU9yKF1JxoRWSWgxGAi7tx8L6IvSYf3Z16VLOqVskEGpboSEzwHlDJA6yKGicWxq FrPV4EIJ+ATB5o/ziDxtPibMBDQCe3MDenYxenI7R1ecDlmoCaoGXlpFpFB93+fHxYZO SblxSlI3Llr9mBmdJag2fLpy8fz2mhgEvAmBzkBfPh1F7uG6Vw50qajc4eRllUka3t/W vaNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436867; x=1748041667; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=oe5thiWbXg0oQhkHd+uP+1sLcx+Gwe9eK60YPiQS+Fw=; b=gRCIx/CKZdfTqUdKCGlnegpThqdE0KvNTaYoi4c5k/q5jChbD5OdngM7JPa+K+zK8i bVmMq6pPWZgXqQJpTdU9aRTaN62v93az4ceHqxAYWm1z5GnwFG3srTWiJeX7maKFvAwS 5fjr+/SYoEFUC9j0CDtG7T84WrugjoaupjQK3kIse4oKhGLqtJsFtXp2zUZnsG2woIqu wj17ErkrF4A9pSKWu6NMIrEJ/y4eHgu2SogEW0V3Ogz3A20ONYw8drfhLFsUyswECdad B3fjTKsYGtdF5uFyIZVwse1Bdi99mn/bMlbXxsTvEx5s2oNuXlXcwEo1VjE53+3z9Zyv U8IQ== X-Forwarded-Encrypted: i=1; AJvYcCXkcLf0+tGWMNFyfVeNwxkcMZLB/eWIVaQKB76zTeX/Vr0hNNBtX4yMQtV1lwY2SzAB+JZX72SfQA6qYCw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx2JI6u1LkdgdTW86wN6dgiLZYzE10M48qePAq8hT3cpleyX970 bOt4ARFHDBDIwNCDTEH6K58NbR5oyjtYmhI5VhiDAU1z0cQCEXzsIyxg3WX69UfctN0zABtwmx7 0nS9ggg== X-Google-Smtp-Source: AGHT+IGwhN0lFa7qi9dcKhCQf1tbewsw4jw8vfokJ04Lk3TJnvb2OFxjdzkHkOC3oXEw4fYXmMusrSpK3XA= X-Received: from pjboi16.prod.google.com ([2002:a17:90b:3a10:b0:2fc:2ee0:d38a]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:7f96:b0:1f5:7280:1cf2 with SMTP id adf61e73a8af0-2170cc66b99mr5833370637.12.1747436867484; Fri, 16 May 2025 16:07:47 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:31 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-6-seanjc@google.com> Subject: [PATCH v2 5/8] irqbypass: Use paired consumer/producer to disconnect during unregister From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the paired consumer/producer information to disconnect IRQ bypass producers/consumers in O(1) time (ignoring the cost of __disconnect()). Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- virt/lib/irqbypass.c | 48 ++++++++------------------------------------ 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index fdbf7ecc0c21..6a183459dc44 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -138,32 +138,16 @@ EXPORT_SYMBOL_GPL(irq_bypass_register_producer); */ void irq_bypass_unregister_producer(struct irq_bypass_producer *producer) { - struct irq_bypass_producer *tmp; - struct irq_bypass_consumer *consumer; - if (!producer->eventfd) return; =20 mutex_lock(&lock); =20 - list_for_each_entry(tmp, &producers, node) { - if (tmp->eventfd !=3D producer->eventfd) - continue; + if (producer->consumer) + __disconnect(producer, producer->consumer); =20 - list_for_each_entry(consumer, &consumers, node) { - if (consumer->eventfd =3D=3D producer->eventfd) { - WARN_ON_ONCE(producer->consumer !=3D consumer); - __disconnect(producer, consumer); - break; - } - } - - producer->eventfd =3D NULL; - list_del(&producer->node); - break; - } - - WARN_ON_ONCE(producer->eventfd); + producer->eventfd =3D NULL; + list_del(&producer->node); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); @@ -228,32 +212,16 @@ EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); */ void irq_bypass_unregister_consumer(struct irq_bypass_consumer *consumer) { - struct irq_bypass_consumer *tmp; - struct irq_bypass_producer *producer; - if (!consumer->eventfd) return; =20 mutex_lock(&lock); =20 - list_for_each_entry(tmp, &consumers, node) { - if (tmp !=3D consumer) - continue; + if (consumer->producer) + __disconnect(consumer->producer, consumer); =20 - list_for_each_entry(producer, &producers, node) { - if (producer->eventfd =3D=3D consumer->eventfd) { - WARN_ON_ONCE(consumer->producer !=3D producer); - __disconnect(producer, consumer); - break; - } - } - - consumer->eventfd =3D NULL; - list_del(&consumer->node); - break; - } - - WARN_ON_ONCE(consumer->eventfd); + consumer->eventfd =3D NULL; + list_del(&consumer->node); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1AA952836B0 for ; Fri, 16 May 2025 23:07:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436871; cv=none; b=JRlS3TEMJMRaPJpl4NKf1RB7IxAwVNRzaqRIVnyrCXXtcwzriozqi3omfd/HkSWfktcQbsiWKZJzua0OpKVhoahVvIbsKQVF/cXfN4hJkBkCFHtorWzVqyWcon0DVTzyOVRCSwAjq9R7L7QOy/+wSLMcqEaD1kzyTDUIBiY6CbU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436871; c=relaxed/simple; bh=3eV70KuPSBCjK3Otg1fXvhrN4aUAqOQEKnpjeLf+MLY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=LpMRqv7+h1DE8zY3jC8Y/M99RDVV8+T4ve7Xn6zg8NGM4tRA1BnXnaXs9yrjz5nAm/p2yF75XtTUIaCsbc6Hm+jmd3g/D7Pg2njnoDf4dPBuWENSzUC+ga4jbr1DZ8CUBdJqZSHFSNCk0eZbLAm2oDmwyaqDtR8A5viING/RQj4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=p+hE2Wjf; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="p+hE2Wjf" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-30e8aec4689so864679a91.0 for ; Fri, 16 May 2025 16:07:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436869; x=1748041669; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=PToc7yVowqyTNBLhp6IJYYBJ3tIDF6DyMy5BFKXkP80=; b=p+hE2WjfdEAe1Ti02a6SlYDd04rA4649+me6OC/OD0O5mxHQSZUXOmjH0/Q2LCwkQS uJ4kn9MlG0dboTJEHLHQAM9yaGwZMRdiueHHHGf8A/1beknFBtJKf+NnqC9wiXbbZHht KHBjyXHFLtXVjyDxlRLD6nAELgpFyzZhy2qJZS3WQHhdYhYZfM+/V5CRMkCYwxD/XTOw vkPBfdmF7f4lKKVTj6BkjT9FsfWEjuev9Fr55XakyqYYZkaRYjBmX99C7lkuc+ct5G8P ryxerNEG5NbxOuDEGNebh6oZ9j1h3ya7pR3j8WE3hV2w09bK4XG1JACdD+5ooEal4rz3 wK8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436869; x=1748041669; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PToc7yVowqyTNBLhp6IJYYBJ3tIDF6DyMy5BFKXkP80=; b=nfPAR4EaJXGzsX1zi8LlaroN+kP+Wr0cvf9DOXQ4BRBQnF/u6BCIT9tmXIsG39k4xT saCTY2/uLokdMtnS4pAfYYkGRwOycDkUxmY4hAbJ1pzqmmqu+kU6p14p3bxddyirwJbk TGm4CgFWfUts6LhPayqnj9tN8DTNCJWTjXkqJTz1qDyIunUKlHRSzfit0/jwz5168SJE N6O/3gGIDv7mI8ry0V5Z2QsmV9d0k7tx6jGpu0V4cCJGW4jIDzIAgkkKrhXEflu0J8ul ccYkCHd/ZLpkg/ZG+hiak+DUop0tiUplStKransNqZzOWypH8/KPEfk8l0zDwGTG9WH0 i9oA== X-Forwarded-Encrypted: i=1; AJvYcCWaHk0yY86SH0ZCtj4J7DFI4qM9XFmHjFrTwOgpglfbdvYBGHM9hsN/0t5MrJ6UCFJhV4Qz0r78pNQ0QAA=@vger.kernel.org X-Gm-Message-State: AOJu0YxmkNsNC/1UnA4rCNqywKAGRz5J0kfa0Qb41iTvdx2Efx2rp7A2 xVVEh2S3ExdtIfbVjtUk4uJ7GS/nkNxyI7GRTojBQQDo4vxtX9E1n5BktnWwkKvFF+4R4Y3TfLY ZxE9xGw== X-Google-Smtp-Source: AGHT+IFMqF17coq6lIynvImodo9GEBI80OqIy5QNctbeCRw4yO4mG2Xb1BFvJbWtlWRj5T810Vi94FLEzzA= X-Received: from pjbqj4.prod.google.com ([2002:a17:90b:28c4:b0:308:861f:fddb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1c05:b0:301:6343:1626 with SMTP id 98e67ed59e1d1-30e7d4f91ccmr6639663a91.1.1747436869330; Fri, 16 May 2025 16:07:49 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:32 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-7-seanjc@google.com> Subject: [PATCH v2 6/8] irqbypass: Use guard(mutex) in lieu of manual lock+unlock From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use guard(mutex) to clean up irqbypass's error handling. Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- virt/lib/irqbypass.c | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 6a183459dc44..828556c081f5 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -99,33 +99,25 @@ int irq_bypass_register_producer(struct irq_bypass_prod= ucer *producer, if (WARN_ON_ONCE(producer->eventfd)) return -EINVAL; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 list_for_each_entry(tmp, &producers, node) { - if (tmp->eventfd =3D=3D eventfd) { - ret =3D -EBUSY; - goto out_err; - } + if (tmp->eventfd =3D=3D eventfd) + return -EBUSY; } =20 list_for_each_entry(consumer, &consumers, node) { if (consumer->eventfd =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) - goto out_err; + return ret; break; } } =20 producer->eventfd =3D eventfd; list_add(&producer->node, &producers); - - mutex_unlock(&lock); - return 0; -out_err: - mutex_unlock(&lock); - return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); =20 @@ -141,14 +133,13 @@ void irq_bypass_unregister_producer(struct irq_bypass= _producer *producer) if (!producer->eventfd) return; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 if (producer->consumer) __disconnect(producer, producer->consumer); =20 producer->eventfd =3D NULL; list_del(&producer->node); - mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); =20 @@ -173,33 +164,25 @@ int irq_bypass_register_consumer(struct irq_bypass_co= nsumer *consumer, if (!consumer->add_producer || !consumer->del_producer) return -EINVAL; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 list_for_each_entry(tmp, &consumers, node) { - if (tmp->eventfd =3D=3D eventfd) { - ret =3D -EBUSY; - goto out_err; - } + if (tmp->eventfd =3D=3D eventfd) + return -EBUSY; } =20 list_for_each_entry(producer, &producers, node) { if (producer->eventfd =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) - goto out_err; + return ret; break; } } =20 consumer->eventfd =3D eventfd; list_add(&consumer->node, &consumers); - - mutex_unlock(&lock); - return 0; -out_err: - mutex_unlock(&lock); - return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); =20 @@ -215,13 +198,12 @@ void irq_bypass_unregister_consumer(struct irq_bypass= _consumer *consumer) if (!consumer->eventfd) return; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 if (consumer->producer) __disconnect(consumer->producer, consumer); =20 consumer->eventfd =3D NULL; list_del(&consumer->node); - mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pf1-f202.google.com (mail-pf1-f202.google.com [209.85.210.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C9000283FE7 for ; Fri, 16 May 2025 23:07:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436873; cv=none; b=t1gpGU5AYaMI1jOXcu6XfK+fVta7XEHlZz56U8L1JJ7D3a9RITauP8Uwaae/C1IuNXvyxYOzdEy7NQBY1zQrEYmugDYRamxT3q2fCKNSVut0CFnGqhPTCLhfu2UiHoks29TPw/Y01sKpLifU1mVs5QXLldMaIHnYWtE2qLXMrIY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436873; c=relaxed/simple; bh=o6ojYocRmtbY7VPZ4gtOsMEHBN5PEdZ1+pPexJLlixI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=FUj/CbpdBDlfalBw6W564ATEztNjjDpiK/s9Fd3kT6RVrjKDW80COlqW2TlWKDRnuTb5V7Jh0G9yCmrOI7voAyvghgzjfJIqymRMl9nHurIMAE6Wfmn7sOsYASftpkUFLw1BHo8r+gLBBDIZX9qO2A9X/MPJqlhQdKzH3UwCU8o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=yk8f/R9/; arc=none smtp.client-ip=209.85.210.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="yk8f/R9/" Received: by mail-pf1-f202.google.com with SMTP id d2e1a72fcca58-742a969a4d0so1147509b3a.2 for ; Fri, 16 May 2025 16:07:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436871; x=1748041671; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=XqyZ4iRfRvJdneUtU4nKjIsAUcubAtsU20tcnlkHRMg=; b=yk8f/R9/10/o+V+mqFPbmDTjcc5F3kH2eRc7ZKQFjCqigsT8m4mYxRKzb5271/Miy6 PMeSWR1xXnfptt+4/BfFFv6uz6I+mDsOgWW9StLlWEffaJMUMKQpTXcjLTlfTMFFIzQs GMNR7mFg50btAaK0QyOTtddhS88Wt7jsJIzRHIMrLLvEBFvGkghIpsyVBDSYps3Vcigr EW2kaFYx7pb/h1mu9u05Wdy0To5VuKUSUitQOfreTuqAXLbG1/L8VLHOZhpEtT8b27iX 1m8eyTyXu30SULxKgct+qVQNZ2JzagmouRAc+v4L9Kuz2r/FEVLEJ0oHVnr0X3iUsjUC ryRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436871; x=1748041671; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=XqyZ4iRfRvJdneUtU4nKjIsAUcubAtsU20tcnlkHRMg=; b=XWBGvntKHeyKuLW7WmVh750fe0A/WUKYBo/cY8/dgq6zZA9xM4dnU3/lvaPDZrufN4 TzbfrTPSsY76g3q5G8kag8MI1AY2gXxgilVUYLxAfBNTIunl/x8ECSWk3rQ0+ioRv5Rj 0u5vVGLDqDfZ8DSiWWRx1/Fd1Q4SAjh2WjHRtQOoB3M8aDU/haZLk9UoDaUhiW6L90/q slzMcjpUHIHaDThBvbIq9RzWJZ0h1XmGT8mIfo4ZC2IUfGCVj+QX+qB16m1wCxwB/yaL SdOMI0H6js2l9Uq5b48RCwm28KJ1B/pA+gWdKtquK1IwS/QF4zWueZqyAjtg1A97+64U zPcQ== X-Forwarded-Encrypted: i=1; AJvYcCWJy06uHPK+htz9tKiotYktRJ+UKGZrFqO/dDAk9xPpWL3veilTCokBefb/a+wVZueGPolFMzNogLdajhA=@vger.kernel.org X-Gm-Message-State: AOJu0YwLoxkdYPXX9qdxuI9BJgQhM4sEed2dXWP/y0oKDCtwCtrqF3Fa AglYqsbN525TzUUM47T6ELKG9C96MuiMUpizrlVtTw/GJHCZotQwr4nNOx2jG/5fj/xjrDTpH3S PIHINbw== X-Google-Smtp-Source: AGHT+IEOTe7V8s8lR/GhvzQE3vyIAN+8Rwn8cNp7gsJp1bTOQBIyn/LL0P5IEeP4ehuA+V5KmZJSBIdW6ZM= X-Received: from pjb7.prod.google.com ([2002:a17:90b:2f07:b0:2ff:5516:6add]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:8cc1:b0:216:1ea0:a516 with SMTP id adf61e73a8af0-21621a0a546mr8110596637.41.1747436871129; Fri, 16 May 2025 16:07:51 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:33 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-8-seanjc@google.com> Subject: [PATCH v2 7/8] irqbypass: Use xarray to track producers and consumers From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Track IRQ bypass producers and consumers using an xarray to avoid the O(2n) insertion time associated with walking a list to check for duplicate entries, and to search for an partner. At low (tens or few hundreds) total producer/consumer counts, using a list is faster due to the need to allocate backing storage for xarray. But as count creeps into the thousands, xarray wins easily, and can provide several orders of magnitude better latency at high counts. E.g. hundreds of nanoseconds vs. hundreds of milliseconds. Cc: Oliver Upton Cc: David Matlack Cc: Like Xu Cc: Binbin Wu Reported-by: Yong He Closes: https://bugzilla.kernel.org/show_bug.cgi?id=3D217379 Link: https://lore.kernel.org/all/20230801115646.33990-1-likexu@tencent.com Reviewed-by: Kevin Tian Acked-by: Michael S. Tsirkin Signed-off-by: Sean Christopherson Reviewed-by: Alex Williamson --- include/linux/irqbypass.h | 4 --- virt/lib/irqbypass.c | 74 ++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index b28197c87483..cd64fcaa88fe 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -33,7 +33,6 @@ struct irq_bypass_consumer; =20 /** * struct irq_bypass_producer - IRQ bypass producer definition - * @node: IRQ bypass manager private list management * @eventfd: eventfd context used to match producers and consumers * @consumer: The connected consumer (NULL if no connection) * @irq: Linux IRQ number for the producer device @@ -47,7 +46,6 @@ struct irq_bypass_consumer; * for a physical device assigned to a VM. */ struct irq_bypass_producer { - struct list_head node; struct eventfd_ctx *eventfd; struct irq_bypass_consumer *consumer; int irq; @@ -61,7 +59,6 @@ struct irq_bypass_producer { =20 /** * struct irq_bypass_consumer - IRQ bypass consumer definition - * @node: IRQ bypass manager private list management * @eventfd: eventfd context used to match producers and consumers * @producer: The connected producer (NULL if no connection) * @add_producer: Connect the IRQ consumer to an IRQ producer @@ -75,7 +72,6 @@ struct irq_bypass_producer { * portions of the interrupt handling to the VM. */ struct irq_bypass_consumer { - struct list_head node; struct eventfd_ctx *eventfd; struct irq_bypass_producer *producer; =20 diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 828556c081f5..ea888b9203d2 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -22,8 +22,8 @@ MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("IRQ bypass manager utility module"); =20 -static LIST_HEAD(producers); -static LIST_HEAD(consumers); +static DEFINE_XARRAY(producers); +static DEFINE_XARRAY(consumers); static DEFINE_MUTEX(lock); =20 /* @lock must be held when calling connect */ @@ -86,13 +86,13 @@ static void __disconnect(struct irq_bypass_producer *pr= od, * @producer: pointer to producer structure * @eventfd: pointer to the eventfd context associated with the producer * - * Add the provided IRQ producer to the list of producers and connect - * with any matching eventfd found on the IRQ consumers list. + * Add the provided IRQ producer to the set of producers and connect with = the + * consumer with a matching eventfd, if one exists. */ int irq_bypass_register_producer(struct irq_bypass_producer *producer, struct eventfd_ctx *eventfd) { - struct irq_bypass_producer *tmp; + unsigned long index =3D (unsigned long)eventfd; struct irq_bypass_consumer *consumer; int ret; =20 @@ -101,22 +101,20 @@ int irq_bypass_register_producer(struct irq_bypass_pr= oducer *producer, =20 guard(mutex)(&lock); =20 - list_for_each_entry(tmp, &producers, node) { - if (tmp->eventfd =3D=3D eventfd) - return -EBUSY; - } + ret =3D xa_insert(&producers, index, producer, GFP_KERNEL); + if (ret) + return ret; =20 - list_for_each_entry(consumer, &consumers, node) { - if (consumer->eventfd =3D=3D eventfd) { - ret =3D __connect(producer, consumer); - if (ret) - return ret; - break; + consumer =3D xa_load(&consumers, index); + if (consumer) { + ret =3D __connect(producer, consumer); + if (ret) { + WARN_ON_ONCE(xa_erase(&producers, index) !=3D producer); + return ret; } } =20 producer->eventfd =3D eventfd; - list_add(&producer->node, &producers); return 0; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); @@ -125,11 +123,14 @@ EXPORT_SYMBOL_GPL(irq_bypass_register_producer); * irq_bypass_unregister_producer - unregister IRQ bypass producer * @producer: pointer to producer structure * - * Remove a previously registered IRQ producer from the list of producers - * and disconnect it from any connected IRQ consumer. + * Remove a previously registered IRQ producer (note, it's safe to call th= is + * even if registration was unsuccessful). Disconnect from the associated + * consumer, if one exists. */ void irq_bypass_unregister_producer(struct irq_bypass_producer *producer) { + unsigned long index =3D (unsigned long)producer->eventfd; + if (!producer->eventfd) return; =20 @@ -138,8 +139,8 @@ void irq_bypass_unregister_producer(struct irq_bypass_p= roducer *producer) if (producer->consumer) __disconnect(producer, producer->consumer); =20 + WARN_ON_ONCE(xa_erase(&producers, index) !=3D producer); producer->eventfd =3D NULL; - list_del(&producer->node); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); =20 @@ -148,13 +149,13 @@ EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); * @consumer: pointer to consumer structure * @eventfd: pointer to the eventfd context associated with the consumer * - * Add the provided IRQ consumer to the list of consumers and connect - * with any matching eventfd found on the IRQ producer list. + * Add the provided IRQ consumer to the set of consumers and connect with = the + * producer with a matching eventfd, if one exists. */ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, struct eventfd_ctx *eventfd) { - struct irq_bypass_consumer *tmp; + unsigned long index =3D (unsigned long)eventfd; struct irq_bypass_producer *producer; int ret; =20 @@ -166,22 +167,20 @@ int irq_bypass_register_consumer(struct irq_bypass_co= nsumer *consumer, =20 guard(mutex)(&lock); =20 - list_for_each_entry(tmp, &consumers, node) { - if (tmp->eventfd =3D=3D eventfd) - return -EBUSY; - } + ret =3D xa_insert(&consumers, index, consumer, GFP_KERNEL); + if (ret) + return ret; =20 - list_for_each_entry(producer, &producers, node) { - if (producer->eventfd =3D=3D eventfd) { - ret =3D __connect(producer, consumer); - if (ret) - return ret; - break; + producer =3D xa_load(&producers, index); + if (producer) { + ret =3D __connect(producer, consumer); + if (ret) { + WARN_ON_ONCE(xa_erase(&consumers, index) !=3D consumer); + return ret; } } =20 consumer->eventfd =3D eventfd; - list_add(&consumer->node, &consumers); return 0; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); @@ -190,11 +189,14 @@ EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); * irq_bypass_unregister_consumer - unregister IRQ bypass consumer * @consumer: pointer to consumer structure * - * Remove a previously registered IRQ consumer from the list of consumers - * and disconnect it from any connected IRQ producer. + * Remove a previously registered IRQ consumer (note, it's safe to call th= is + * even if registration was unsuccessful). Disconnect from the associated + * producer, if one exists. */ void irq_bypass_unregister_consumer(struct irq_bypass_consumer *consumer) { + unsigned long index =3D (unsigned long)consumer->eventfd; + if (!consumer->eventfd) return; =20 @@ -203,7 +205,7 @@ void irq_bypass_unregister_consumer(struct irq_bypass_c= onsumer *consumer) if (consumer->producer) __disconnect(consumer->producer, consumer); =20 + WARN_ON_ONCE(xa_erase(&consumers, index) !=3D consumer); consumer->eventfd =3D NULL; - list_del(&consumer->node); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.1112.g889b7c5bd8-goog From nobody Fri Dec 19 02:57:03 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 085DB285404 for ; Fri, 16 May 2025 23:07:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436877; cv=none; b=vGunZPQiPRRghRF/WhecyqjXGNdDODTHgh0AHM/cAK/oGSgUj4niBSs6RwkYdJUttMOopN4WNPc23xK0zQ9eU8U9XeRA068KsBbW7ZqSb3wIEz50n5YYB9SGo52lZ/WepDQGhBBEIMDPnskROxDUv3CJIMsCE6g6kt39Ww6CC0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747436877; c=relaxed/simple; bh=I3DHw0mSL3jtxx94vxk532QfN1TMtQ4UDQPBThuFuwI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OyH5Yosqm2Q7KC7NSuJOy8DjxCDgUyEe3gywCuzjoawQF/ti5uv6Arrn2Pz/9Df8/EBuXtLgdLEmK2vrHKJnud35L9J3XjrBSmHP+wNrzpJsjIw5wT4ZpJaX+ATUFOHwlADLKaJoxnEcX8bi4wQMJV9EPe/CpJswurnpoFaPG9s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=LSp7R1T9; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="LSp7R1T9" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-30e82e16f7fso1122119a91.1 for ; Fri, 16 May 2025 16:07:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747436875; x=1748041675; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=FAMbaUPPerspb7HApxfCN10SlBrRCAmzWKwokYGPr+8=; b=LSp7R1T9EbTgE9VggHC9Dh7dzgiG5ePNFmWgbF4q8+l/smBzPOIKpnwjIrmDFU2+v/ l/xWawYx43BJVvbmDO3RukXVBNC0RKGCLF/kDwR969OLrPpBweCmpMSWJ8vmEMcuHArH ORSSvUExEWKN99PXzyJiupgKFTdjVPW6bPP1wF5xFhREk6/TeWBCl1NAHjClGr7P62/S WKY2PdVtZ9oC0UpPKKBb+CdvkLkmzDFRsZ3AtwRrOmb2//AUTpsnpBQwX8mCcVJH0LV5 sELUbEmziWCfkDHck+d//iXwbo35YhyY9tfH3U04/JD8sMZuJYqiqUC5khj8jUtU60Sf Vy8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747436875; x=1748041675; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=FAMbaUPPerspb7HApxfCN10SlBrRCAmzWKwokYGPr+8=; b=v6yR8iNPuHlFgcsE4o9NR0hhx5cIsTbrglMmIkTqn4MQIbJmk2ZUpOkxVeDNELu6hO LLzUGX0FwMwbwi5g17f6ikclMFHcvcyeSPnLkNZyvqVCdSWNXdkXUDg+QfXGdruPWgqE IqBPxvI2jxm04qltfRwmxbhYesAeHMlkdz88a3/WWnpbOb/jXxwjHTeOFJhLW3igeJch cLnGU+jnwtpl+VNME6lAkjcvEe0ItiKtsmRKQpGzoFW1hQd/Nz3pwqZIBr5hkHQHZB8b 2HwzvKbTQZiTX9rN5Z04zP1aNdk2NdujcVRe+fM5PGSAUQZ8qLCBW6qqmkz8eCl7P+Vs pLFA== X-Forwarded-Encrypted: i=1; AJvYcCWSo62osR6r4PEgrCUyyRmXJ9z1OFA2Jb+/Q/xPgl1BcTT1iIz9LK+nVLTOqthSN1RvHLeifcs4ACReRl4=@vger.kernel.org X-Gm-Message-State: AOJu0YwMFxQk3a1VZB4jZgOVwbdVR6tIv+J4aRY3GBixIPEzXjyjjdEL 3+7YAPNxwG07kRlq3HR3YUxFlamzj7myAWOvvasFj6j/A6+9I4rXjSs1FhPZHoDW/tK2An1f5y4 vwSoVKw== X-Google-Smtp-Source: AGHT+IG0uMk9h30PFjbqxBOtiNTGzFAvu6anTRo/cSbV54uv+opaF4OQfdpyqDmtiu2fEcy4O6POnGBsS/I= X-Received: from pjwx4.prod.google.com ([2002:a17:90a:c2c4:b0:2fa:1fac:2695]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:33c2:b0:2ee:5c9b:35c0 with SMTP id 98e67ed59e1d1-30e7de63cdcmr6199653a91.9.1747436875261; Fri, 16 May 2025 16:07:55 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 16 May 2025 16:07:34 -0700 In-Reply-To: <20250516230734.2564775-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250516230734.2564775-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1112.g889b7c5bd8-goog Message-ID: <20250516230734.2564775-9-seanjc@google.com> Subject: [PATCH v2 8/8] irqbypass: Require producers to pass in Linux IRQ number during registration From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , "Michael S. Tsirkin" , Jason Wang , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian , Oliver Upton , David Matlack , Like Xu , Binbin Wu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Pass in the Linux IRQ associated with an IRQ bypass producer instead of relying on the caller to set the field prior to registration, as there's no benefit to relying on callers to do the right thing. Take care to set producer->irq before __connect(), as KVM expects the IRQ to be valid as soon as a connection is possible. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Alex Williamson --- drivers/vfio/pci/vfio_pci_intrs.c | 3 +-- drivers/vhost/vdpa.c | 4 ++-- include/linux/irqbypass.h | 2 +- virt/lib/irqbypass.c | 5 ++++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_= intrs.c index d87fe116762a..123298a4dc8f 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -505,8 +505,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_c= ore_device *vdev, if (ret) goto out_put_eventfd_ctx; =20 - ctx->producer.irq =3D irq; - ret =3D irq_bypass_register_producer(&ctx->producer, trigger); + ret =3D irq_bypass_register_producer(&ctx->producer, trigger, irq); if (unlikely(ret)) { dev_info(&pdev->dev, "irq bypass producer (eventfd %p) registration fails: %d\n", diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 7b265ffda697..af1e1fdfd9ed 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -212,8 +212,8 @@ static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa *= v, u16 qid) if (!vq->call_ctx.ctx) return; =20 - vq->call_ctx.producer.irq =3D irq; - ret =3D irq_bypass_register_producer(&vq->call_ctx.producer, vq->call_ctx= .ctx); + ret =3D irq_bypass_register_producer(&vq->call_ctx.producer, + vq->call_ctx.ctx, irq); if (unlikely(ret)) dev_info(&v->dev, "vq %u, irq bypass producer (eventfd %p) registration = fails, ret =3D %d\n", qid, vq->call_ctx.ctx, ret); diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index cd64fcaa88fe..ede1fa938152 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -84,7 +84,7 @@ struct irq_bypass_consumer { }; =20 int irq_bypass_register_producer(struct irq_bypass_producer *producer, - struct eventfd_ctx *eventfd); + struct eventfd_ctx *eventfd, int irq); void irq_bypass_unregister_producer(struct irq_bypass_producer *producer); int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, struct eventfd_ctx *eventfd); diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index ea888b9203d2..62c160200be9 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -85,12 +85,13 @@ static void __disconnect(struct irq_bypass_producer *pr= od, * irq_bypass_register_producer - register IRQ bypass producer * @producer: pointer to producer structure * @eventfd: pointer to the eventfd context associated with the producer + * @irq: Linux IRQ number of the underlying producer device * * Add the provided IRQ producer to the set of producers and connect with = the * consumer with a matching eventfd, if one exists. */ int irq_bypass_register_producer(struct irq_bypass_producer *producer, - struct eventfd_ctx *eventfd) + struct eventfd_ctx *eventfd, int irq) { unsigned long index =3D (unsigned long)eventfd; struct irq_bypass_consumer *consumer; @@ -99,6 +100,8 @@ int irq_bypass_register_producer(struct irq_bypass_produ= cer *producer, if (WARN_ON_ONCE(producer->eventfd)) return -EINVAL; =20 + producer->irq =3D irq; + guard(mutex)(&lock); =20 ret =3D xa_insert(&producers, index, producer, GFP_KERNEL); --=20 2.49.0.1112.g889b7c5bd8-goog