From nobody Sun Feb 8 09:32:23 2026 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.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 92A4721859F for ; Fri, 4 Apr 2025 21:15:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801308; cv=none; b=lduPXy6xXjLmrNBietn4rR/jCv0/hraK+bRQJDj20NBQeI1mUzOs6Fe5pUfHtzLYpZhWUt5HjW5k+z4SsCOBUK2xDSbtdj0npSl7aY4WdqxOfBRXEkx5U0aehVSMlVtwSk3YLkVBG/pK9gd0QA1WQR84by4VimOjX9kAOtFAKfE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801308; c=relaxed/simple; bh=3eQJAa9cubM3sOJ48FmMAgTG/qqYFR22T28SrTWB6pw=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=txU/Nx/16FdOk4jtMi0SDP1GJlEDF/Au6HV/zdkygHMC5eDnkQBp7KIBIB127F8xRemmCMOKy/Rqvn2Oc10bAE/hVQWEJfhWk6uZSbEa1jZBhGzmSqJWc5GUI23V/By6fmrzcR8KYVVJ6sWNxEnCKLx4TIu5ECy9pJsJPlkiCk4= 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=EfOsY+J3; arc=none smtp.client-ip=209.85.214.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="EfOsY+J3" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-227e2faab6dso21315385ad.1 for ; Fri, 04 Apr 2025 14:15:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801306; x=1744406106; 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=BV0n160bdAMJIwF9gIdsee0gSXMixk7gnYOIwMBSkTY=; b=EfOsY+J3Evu+cdhO1HPL7EDI03ImmRIYF1A7PuHvIEFMhk5UvDwD522hXpb0XwDHJW nzvVcLngrduWzo7d9x+x0diqFCq6iGo9FFNuEWI+86kSKSKTHx/sOLEt0M4cW+brQVBY uiroOjTm5+Jiwia87wnXKX+5bWN+/mawF9sfZJhrEm+Xy5wHM6vvJsuVtud1J5bB6XKg pOaLmA91rZv6OWfZDHKcPap1yWOIqTCrvDuIgW77EtiiKOcjoBo8WhiHT7pvUAcvfjnm /BaoeKPccn0D7xL6mdd3bGO2S5CN8leinwGIfALc5NfI0OE7NFyXQ8IhNndIauMeDX+f 3Nww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801306; x=1744406106; 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=BV0n160bdAMJIwF9gIdsee0gSXMixk7gnYOIwMBSkTY=; b=h025eg5BeWmvAJjPU/MwF46K027pLVDnUt8hyGexSGhLTl9k+soCOGwfpPQ06+hhY0 7zkmbCfM/hacgogdB0qjaQYulmG6vycafKEvCoc+P+gpaSuQksOiAyRU1/D1i/7XJh6b pvaIEYTn4GrwOYPZJP+OpRcH7bP9x+/mCkHhknF1cn1Fi9mefxHRsy3dUhfpdITCOW4U 17JW05ohcug1E/thZpFUB2LYaVZAuMkOt9Wo+TJzSFgpYOAMyXQ+iaog92zOkOz5Egkh RBCkWZeNMJVqAfNssnnnrDTFjxyMosI5bmQrRnqUqG/oqX5wTjoMEPweaKBmcCBYHkSL B3Sw== X-Forwarded-Encrypted: i=1; AJvYcCW67Pt6dX5/czYZ3ruUqqh6fDz11G5f84VKF8KRj0Atg48aOIr1DOMA2/OP8ZcRiWlo3WtBkAb6nS0ZA1I=@vger.kernel.org X-Gm-Message-State: AOJu0YzCmdrHdqrMyECP8nu9MRkNcMF57PN0cvnFKErPg38jSITtmtJx av4YsSKfgLxCWvvbLGh90gCyO7r4aYiKa+1QnSUOBHHX5rcYw8JcNAMKsx8SeQ5oZZq7Y3kEZmb jjQ== X-Google-Smtp-Source: AGHT+IHGnE8XslHm/Dp26htMuuamh5CyH4BkTccpSE3E94306LmR6+QWCeFh1nKaosRJPLYDlX1yhMluHf0= X-Received: from pfcf1.prod.google.com ([2002:a05:6a00:2381:b0:732:858a:729f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:e883:b0:224:255b:c932 with SMTP id d9443c01a7336-22a8a04a526mr44725315ad.3.1743801305822; Fri, 04 Apr 2025 14:15:05 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:43 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-2-seanjc@google.com> Subject: [PATCH 1/7] irqbypass: Drop pointless and misleading THIS_MODULE get/put From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , 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. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- 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.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.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 6C02421D5BC for ; Fri, 4 Apr 2025 21:15:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801310; cv=none; b=jfNhI7mDFDghvruu6dck6/TNOO6atGSynqLKaSnFU+hpI/ZvAWjXz4ZYPPGhc7aK2IglvNSRsErKvp7VrmsTraBVdmsRweJAk2X46tVN/6O96G/IE2c3KUzHOYU6xNpiikbHyldK/9YOFKFGjmDRKGOfKZHSDxcXRrMR9I30XSQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801310; c=relaxed/simple; bh=lt3v4NByeuFhsRflhATM2AU2H0rLtGPyZ6uc0g0P4aA=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=JWPFlyvRTd+YHNDqU7vNC+JVTdAAqlAEXhRN7xiG0bJNCJRTh8VEdMccbSxjkaaGVSO5mXxWCO2wIavtFkzz6wZkgdmzv1vY/Y3KPuXH/KMlSGGFdL0rxn34ZNHC4UjHPGLjH+xRIA5n/WZfVh139d8HXZQtxqaNHPnLIgCyfvA= 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=I6hKXNN3; arc=none smtp.client-ip=209.85.215.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="I6hKXNN3" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-af91ea9e885so2162071a12.3 for ; Fri, 04 Apr 2025 14:15:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801307; x=1744406107; 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=Uj98VhLI5wUP0/dBD7V9/B8uk5MsLM5FlS2oO+5uLWg=; b=I6hKXNN33W6fvlYWWn1oGiSxM3RrDcFoDvq8grXNLQUld+mA8s1zWeg924FpZkYXd1 s7/1Qfa3FhzA6ERTjNsRhJSW2V3j466Wb9ojTb76tOmWteyZZkvpbRMOh+VDzcSWIZkE kyFxyQlgFR0nvn82xlUU4qTa3Gjop6aFKBDrlCCcRQOnfDw/Cq/9+/ew/9JdJg5Q5sTC cDZzd04jFIWz8xZOZCHeCb5b4O6VgWxIicjcHQJn1uls4pP+fHRqGKy4kUf3t1Hr9EIx RhbZmEDw+B8uSLiOwig5SCG5n4Et7XKmNMWLbKRx4mcOl+Nx2obnGPKS/hlCVPqQxSfR JA7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801307; x=1744406107; 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=Uj98VhLI5wUP0/dBD7V9/B8uk5MsLM5FlS2oO+5uLWg=; b=uNkmDi1l1q2N/mCXPlyOTNizvqde1RICs+iIar6/sVeNbeEcvZ/1ax7JuKWyuq33M6 fUj+SCV8pFYcV+CvbQkmhHhWqIPhObtSf6ycPEJ3Xocn4KYfwovH4mtpYH2u2+TG9hDF 2AObP5zzHChlfEGJM3haB8uBYdZlsT6QgDOSOIxNsk78ezMd1b8C0/hym/IgpL7+88tO 6Moi5nckNrXT9S/QhM+0ZaEmaQJqnInwmNmTYcxijkw8hm0/hp+g34vKKD7doMJJTfXx CNHJNz7AE9Gf/0PBK6stvv7hRY714qi6WGfjrYqBOgKlz3/kfb0EBG6Ksfzqz+ErPsdr n0CQ== X-Forwarded-Encrypted: i=1; AJvYcCXOdRDVrnVjVoOT9M5cSOWzXRJO3S4J3grC34PRqE4/eBKwFjbWWAYvdqChGv3uZTStTQsTG8ySsu7xflA=@vger.kernel.org X-Gm-Message-State: AOJu0Ywf1vouA6mLtFjBi1UpWFPAYKC3uBjVUehimRADLcy4rJtj8ASa VfGbAg6bneNRoNYc8Wyq6DSnL6dQv9iZe5rMakkttC/xR6o4yXwLNL4U0sVW+mzU1IZZc1bvoC1 uSw== X-Google-Smtp-Source: AGHT+IFMRINuT3JO84ktvwx/JXf2G4VgNPaO3sJJsL1cqLAvtapdb4dYJmi4mlrlNRrGxzPd+4aTdmn2mM0= X-Received: from pjboe14.prod.google.com ([2002:a17:90b:394e:b0:2fc:e37d:85dc]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3d47:b0:2f6:f32e:90ac with SMTP id 98e67ed59e1d1-306a6154f18mr5792179a91.11.1743801307592; Fri, 04 Apr 2025 14:15:07 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:44 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-3-seanjc@google.com> Subject: [PATCH 2/7] irqbypass: Drop superfluous might_sleep() annotations From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , 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. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- 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.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 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 296F819924E for ; Fri, 4 Apr 2025 21:15:09 +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=1743801312; cv=none; b=TEtynt+IhIQDWA4kFV85fAkhB/uUEr3TKAHwV3HfGq2FIRYAbDwFxfPj+J4Ovleluo0bfyCJsy9LO5nLBUG/mwHLh7JavpC574jMcEFZUx5/4q9IRuobBw5xqbpwAppz82iujeN09GdcsZkrzcDDjoYMT7Qux6IEht7wkfCUCvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801312; c=relaxed/simple; bh=8YRrcSuqZ2X6elO3mJMg4SsPMd3wcuYxZDV9OuSa3es=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=QEfXQYGceMYKn86EvxZY1O0ltgfTbR/dt32yvgRjcc1wa0zuAE8B456Rq12E3i9+FXq353AUZaegboc5Kuai45cQVpEBSK8yNPeQ1HVQQaa+8jcdlaUplMRIumjbqz9mFxVKkyCnrhvzJ0RYRyZeYX6n7d3ceAfiM5pyAZ6ktPo= 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=jOsLhL8b; 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="jOsLhL8b" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3011bee1751so2347925a91.1 for ; Fri, 04 Apr 2025 14:15:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801309; x=1744406109; 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=9QlPfYoNUHN0npkNqAREwoXYlnO6YkPNvJYmSOd9TNs=; b=jOsLhL8b/9t3v1EmL9arzdQZwBPyrhvzElSxUQkQZ4gt22qTZc8R7st1njULiKSkeU auxG/e79guVNomsLDQ2+nlf9Gc5IFu4k/ZVLwPED+Ok39TKjdzW+YPn63yLCtXhT+pHH zau8dS/Ri/EoEPBnjRT3Q7/su/IWnF/ScL2u5aBNo3xV2AbePT2a3849JYi84noKwGVx x5M9mjOtlqVoggRoVCC9Az1DBg9ap9gmnO23P1Qv1njUENYHOe0DEc+wBRJejlrYdGNB nmYW92OVnTIKcHjz94yNUDdUhRI54QvRHb6jBHw6VGH1DxspP++uSx3562kVhF81D7Mc KJ9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801309; x=1744406109; 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=9QlPfYoNUHN0npkNqAREwoXYlnO6YkPNvJYmSOd9TNs=; b=WzDkfGiRQXCzt/JeyFByFmTJrvTncNRjwxIcNUQKRripNdhGIMKW1113NKezYbKCWF GVRH7XphjzGGMgzDTj3wHTy9fqq9jDI+IhZzYCmTHVQEQa+mcWRSw3oyCubmbGTOuQzp GsRxTqvHCJn9DaUJT6npYtZoXNNgepe1K9POdXWQk+fsFewPzlloPn/rW0rWYUbUB3cH cUuZ7yLx/7b5TfFt70o0gbCvHfXn+xiP/RUp/i1t0W8WQXhgIuuCCpT5K4xsQhOfdKjh 6rH9Z+ebN2eHdeClG5HJbizZZkKjli9LU4utC/QaY8RgOUxLLc+1AkjKyioKZIB9N6KP Yy/w== X-Forwarded-Encrypted: i=1; AJvYcCUgKbv3zOd96Dm+1RfR27JGp14ZVekzxVJ/4yJzCctslPxSqHZuPPmRXK9k6l0kVofS23Bb4swwrCufOoY=@vger.kernel.org X-Gm-Message-State: AOJu0YxlQMkjj6WrD9tjqRGJsd5HwCfraW+8/m6pE7/h55h8WW7bkzCp yJVzwrWi1QEo1xYzLMnRl+BcJTMeYq8tJYAQi9yDF2CxyYIChP/rLiFJIlyLIfIKVUvXdZMq650 sLA== X-Google-Smtp-Source: AGHT+IFG/HHiS7U1SE6A/tzvJJ9amzcONWj17eofMzEa4fVAsgAjCRMKGaMbI4EF0SCoGNkBCkXglKNNX8c= X-Received: from pjbov5.prod.google.com ([2002:a17:90b:2585:b0:301:2679:9aa]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:51cd:b0:2ee:f80c:6889 with SMTP id 98e67ed59e1d1-306a492209bmr7867881a91.33.1743801309333; Fri, 04 Apr 2025 14:15:09 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:45 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-4-seanjc@google.com> Subject: [PATCH 3/7] irqbypass: Take ownership of producer/consumer token tracking From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , 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. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- drivers/vfio/pci/vfio_pci_intrs.c | 5 +---- drivers/vhost/vdpa.c | 4 +--- include/linux/irqbypass.h | 31 +++++++++++++++++-------------- virt/kvm/eventfd.c | 3 +-- virt/lib/irqbypass.c | 30 +++++++++++++++++++++--------- 5 files changed, 41 insertions(+), 32 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_= intrs.c index 8382c5834335..c852643d8359 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; } ctx->trigger =3D trigger; =20 diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c index 5a49b5a6d496..2749290f892d 100644 --- a/drivers/vhost/vdpa.c +++ b/drivers/vhost/vdpa.c @@ -213,7 +213,7 @@ 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); @@ -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..379725b9a003 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 independen= tly. + * When a producer and consumer are paired, i.e. a token match is found, t= he + * 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. Match tokens must be unique per producer/consume= r, + * 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) + * @token: IRQ bypass manage private token 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) @@ -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) + * @token: IRQ bypass manage private token 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) @@ -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 249ba5b72e9b..afdbac0d0b9f 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c @@ -426,12 +426,11 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *a= rgs) =20 #ifdef 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); diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 28a4d933569a..98bf76d03078 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. */ -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->token)) return -EINVAL; =20 mutex_lock(&lock); =20 list_for_each_entry(tmp, &producers, node) { - if (tmp->token =3D=3D producer->token) { + if (tmp->token =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->token =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->token =3D eventfd; list_add(&producer->node, &producers); =20 mutex_unlock(&lock); @@ -147,10 +150,12 @@ void irq_bypass_unregister_producer(struct irq_bypass= _producer *producer) } } =20 + producer->token =3D NULL; list_del(&producer->node); break; } =20 + WARN_ON_ONCE(producer->token); 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. */ -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->token)) + 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->token =3D=3D eventfd || tmp =3D=3D consumer) { ret =3D -EBUSY; goto out_err; } } =20 list_for_each_entry(producer, &producers, node) { - if (producer->token =3D=3D consumer->token) { + if (producer->token =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->token =3D eventfd; list_add(&consumer->node, &consumers); =20 mutex_unlock(&lock); @@ -229,10 +239,12 @@ void irq_bypass_unregister_consumer(struct irq_bypass= _consumer *consumer) } } =20 + consumer->token =3D NULL; list_del(&consumer->node); break; } =20 + WARN_ON_ONCE(consumer->token); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.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 A8B752206A7 for ; Fri, 4 Apr 2025 21:15:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801313; cv=none; b=doFRy0NQvWCGSSBjCzndAsAXP+mRjOk5iC2e/Ely9RO4XLW6u60TGl2Y2WmlYioJ20sN/dSUPlcE63b8fDtlHniryqta2uPAEh6ghriXvnpQJGOV8HjufC7HV/H6VOqbwWjDXBInxY/ofbMzOlF+X7WUwUpW5sNWUC3hEwBursQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801313; c=relaxed/simple; bh=ln0aTW/Mog3QiYUyYj6SaLIFRtDT+yAljImMR/4auLY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=EsXwrdbGehX4Dq78YFg/6hSW8kdsI34tW/Xoza9G7YtJ7Ty5ujJGxnTXc5IhfIdNRy6V2f9tIWEbpsPjcS+7c/yOz7ROAR7OOhB9edo1fkbC1m0Ufv8McE9AIioZMRmFASq3FqWKSq/mM7qHHrMI+BYNDA27h4jij34sEWagWrg= 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=L467cp+L; arc=none smtp.client-ip=209.85.215.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="L467cp+L" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-af8d8e0689eso2579368a12.2 for ; Fri, 04 Apr 2025 14:15:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801311; x=1744406111; 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=Ue20B1Tzy5G0qxMoWwTOp7P/8+RIOeWrrJYBbIRxnEc=; b=L467cp+LC0tNGVIBBlMqArN0f3t1bsiw7xl7U8QWsu87bANbRJB6fJJiDDCe/7GIlV vaifY6mzETxWZSimArxRXWQs88VjU4Be9g8HxbV3cQAWo0Y/izwmzCTabS3aPdb8Uv/f IYIapwpxFoQ4sVDS34LD5tm9HHcTD7GDtCdc5xBW83TtmoyZf7E9R+nEA6Ad0oFIVVDx TbRy+w8z8hBdPdmysoFqaRhYb+JS4iO8SZqdxk9i+BlbamNQlIeBa80YhMToVlAoYjFS VUUCTWVd2RKwHP/3C/o5Gcg51YsdSJlrkjoNjWs0KnVfj6oqjKTM15rxAlovYb76XSv3 RKEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801311; x=1744406111; 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=Ue20B1Tzy5G0qxMoWwTOp7P/8+RIOeWrrJYBbIRxnEc=; b=Q2PJXYxJL731PL+QCsj+JiI1W/cBj9k0T13TKRgEtbNnbCtbJ3iGRJ5r9LGNayCo0f +OqPA6ZUR/yDAcT6Yhc+0tnlJMPKUEA7EqTrKF09ZgB0cg3ZO/HXA/ThQOyqvui82DYA bSF3d/9aBKYZ4U5SDkUYzBuA3ibATh8agLU8SAomS4H0Iattp6OMFjPkeYs52hcoFKZX jcjX6GuYbPf+uMHEETeXTRIyv77PynfvMYJ+WZNxyXlxy4djSeZDh5SSNiXnhPfW/3OT 6UH33O1/MXnPmAUFZru8htA2ONyMp9ryGNlYLG2WMpLuPQSoODLeeKaodZhasTDn5ulw g1uw== X-Forwarded-Encrypted: i=1; AJvYcCVdfa9mvTygqyHcNsbxhWw83vL8XugmsnJGedWS7aC9seIez7DnUHKSDXTj4e+icfoZ3Eo8JqOSnCNMxGc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9LCakWOxEbN7HHx4ttvGQkw/xbKCfYLllzqPTP1J6vcpf6OFe lQVji+qTDT9hvyfFfuSV2bP20DGAGIoa6I3vMoJQX7Y/ByLSDAXUFCMHIpg6rznQjwkkxOStPfV Yiw== X-Google-Smtp-Source: AGHT+IFis7TOzLrl3LJaRKq/QGPjgSup5fUiygS7yEG7/cr8vy90lgR7IWQgZT0YqXwXkXorjxg8Vt14/hk= X-Received: from pjbpb5.prod.google.com ([2002:a17:90b:3c05:b0:2e0:915d:d594]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2649:b0:2ee:53b3:3f1c with SMTP id 98e67ed59e1d1-306a61208bdmr5711511a91.5.1743801311080; Fri, 04 Apr 2025 14:15:11 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:46 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-5-seanjc@google.com> Subject: [PATCH 4/7] irqbypass: Explicitly track producer and consumer bindings From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , 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. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- include/linux/irqbypass.h | 5 +++++ virt/lib/irqbypass.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index 379725b9a003..6d4e4882843c 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -29,6 +29,8 @@ struct irq_bypass_consumer; * 1:N pairings are not supported. */ =20 +struct irq_bypass_consumer; + /** * struct irq_bypass_producer - IRQ bypass producer definition * @node: IRQ bypass manager private list management @@ -46,6 +48,7 @@ struct irq_bypass_consumer; struct irq_bypass_producer { struct list_head node; void *token; + struct irq_bypass_consumer *consumer; int irq; int (*add_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *); @@ -72,6 +75,8 @@ struct irq_bypass_producer { struct irq_bypass_consumer { struct list_head node; void *token; + 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 98bf76d03078..4c912c30b7e6 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->token =3D=3D producer->token) { + 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->token =3D=3D consumer->token) { + WARN_ON_ONCE(consumer->producer !=3D producer); __disconnect(producer, consumer); break; } --=20 2.49.0.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 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 7AE781F0E5C for ; Fri, 4 Apr 2025 21:15:13 +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=1743801315; cv=none; b=lvH9AwWm7yPqVqlagWq1iLG+2gQradPCDkgRbaJAlboRQdmVoTnYJb/j6Oj8ZsuZ95bE998leQjURCrD38+06dUGnSgmLobRxM17SF/trHXvRGyiea/ddzN93ndPiI5raT58moVZN9cPEO9dDgCst5D9B3wrmXKUhJb3Guuc5nY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801315; c=relaxed/simple; bh=R8NuUhmI02N5n1m2zQQJmYcq/tgo+PabOiQg+/IuxGk=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=AsZ2HjXfm1mDhDmnqLglOeyyciuuxlJ0em13K1UbonN8M49u/hC7lno/MKAMaSiMuToIF1yCyvIij0o0j3GaKDm1ANrvh94W3vhf9nRMsNyBCvGCS6ZG5Y2AsncdKH5nNxaLId3pYM6CKj7qrHP/dPu7OuWBGeppU3pDZdwXXLo= 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=RyGi+dNm; 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="RyGi+dNm" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-739071bdf2eso1856253b3a.2 for ; Fri, 04 Apr 2025 14:15:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801313; x=1744406113; 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=+c3CamxlMu4cATASgv0Iy6Lf5d+wt8ucP9dRv+3+Crg=; b=RyGi+dNmo0BgsZBqodEkGGcqn0l+ZJrVdlX7al2r9GPIi19p6iyazBVfXdySUcHaEl zOEoHdJpGRcaJTnYuAN5JmIiHHJz7M2q48GfsBGM9IOqtNWW74TxTXydWrQ3nAK5L8gq cAUsWSrFsiVwL1U/ucLoqqoftVTzb//eb3UuZPJP2uj7zkYFxV2g/6zHBTIT8Zy/+t2v Pq/ltO/mVHbKWO1zBGF7cl9KmqurvTNyjin4K0lhN2WBifk4qY2FSBNQSMWiuFvcM/nV VHZBXV3EqBtZ0LrluCHA61GI38r2D4MHjzVc2PGZrNzmoiop9U4vTS1V7N3L5QAP4VH2 u5PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801313; x=1744406113; 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=+c3CamxlMu4cATASgv0Iy6Lf5d+wt8ucP9dRv+3+Crg=; b=CASXbXbBbu/yTJ7w4ILw4jqzZLcGfR8TV/IFk1z2OaW+su6B1jIdU5lvPgU0TOBdcU fvNXKWPPYaF+v1IfV23ReEh98kM5Qh4OYJKNP7gCk7SgZbI6du+qWFN5nQkDQVYpc9QG CZst45pgLVPzwaOy8aSZvi+JMl3kiXUmuSPzzzHKioNTYe7v/f0S8mwUDtuO6dMpZ4cu 0OFV/1jXMtbOyRLv+OXe8cxPTmOdzh3MM5HpGAZnZl44umH6t1pFAOJB0ABMp80HwNTy K2e5R6/lOvSg/axLmyShx2YWsxCn8Yg7WrNKWf/unqjqYgyzwuSYAdNic3icqphrEduy S4yg== X-Forwarded-Encrypted: i=1; AJvYcCXnbUpRK/6wJBmxeaJ/44a/05wMWti2mfFCU6FazO4Ai/0Vi4GVB3QaVvJG8hX5SzhW6ixEDxapN9vQB1Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8+nyQ1hea5blJUoTKbu7K3AVnZrhrbHAFZPkpEhwRyHlR/okF Dr4Zbrc5Gpw1VqiZ502norpgmmZiDRbOySzfZn0ozOylajiDt9xvpYl1G0n1tqHJOh8xaP+XDBU cLw== X-Google-Smtp-Source: AGHT+IF1tacFrLaohc7CkMS1gtWVWkDqbIHHrrY0gCvWvfr9O5duisiiz3XdJWCovxvuLreYisa8S4H6eT8= X-Received: from pfbhg1.prod.google.com ([2002:a05:6a00:8601:b0:736:3d80:706e]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:32a2:b0:1f5:75a9:5257 with SMTP id adf61e73a8af0-20113c57dfcmr1150484637.13.1743801312641; Fri, 04 Apr 2025 14:15:12 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:47 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-6-seanjc@google.com> Subject: [PATCH 5/7] irqbypass: Use paired consumer/producer to disconnect during unregister From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , 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()). Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- virt/lib/irqbypass.c | 50 +++++++------------------------------------- 1 file changed, 8 insertions(+), 42 deletions(-) diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 4c912c30b7e6..6d68a0f71dd9 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->token) return; =20 mutex_lock(&lock); =20 - list_for_each_entry(tmp, &producers, node) { - if (tmp->token !=3D producer->token) - continue; + if (producer->consumer) + __disconnect(producer, producer->consumer); =20 - list_for_each_entry(consumer, &consumers, node) { - if (consumer->token =3D=3D producer->token) { - WARN_ON_ONCE(producer->consumer !=3D consumer); - __disconnect(producer, consumer); - break; - } - } - - producer->token =3D NULL; - list_del(&producer->node); - break; - } - - WARN_ON_ONCE(producer->token); + producer->token =3D NULL; + list_del(&producer->node); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); @@ -173,8 +157,6 @@ 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 token found on the IRQ producer list. */ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, struct eventfd_ctx *eventfd) @@ -228,32 +210,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->token) 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->token =3D=3D consumer->token) { - WARN_ON_ONCE(consumer->producer !=3D producer); - __disconnect(producer, consumer); - break; - } - } - - consumer->token =3D NULL; - list_del(&consumer->node); - break; - } - - WARN_ON_ONCE(consumer->token); + consumer->token =3D NULL; + list_del(&consumer->node); mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 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 237F62222A3 for ; Fri, 4 Apr 2025 21:15:14 +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=1743801316; cv=none; b=bDy/rojHI2zqBwYEuh9GnzJdUY6UzarTTcPkNRs1/KJHhGF0SIM+ITWFQOBi2LROGB6I+9s6n+msKsEbHoxt/M2zJ/Sx80VjMgOXuiDNmEXu07mXA+uz22ivYzEwZ3NssA6pp2+C660iK/zo25t9qlVU3Q5A8BmcsggM/lRNqns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801316; c=relaxed/simple; bh=v2ORapDpafgERkpHUzPjtrfKBhCT/RFfLsP2a6B2+4U=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=BclMzSgNxnbwHy8mDu0ptOy8QLW0qFCyn0a9KM3NbUMVyhk/f1VYTCNFHVaSyHJirZhApaUVxNATCAwFwVEEFpJmLu+xhIBRDtRztNxyYmWmYT4FmGygMsjUWqjZcOl/DDcfYMefA/ApGFujSl2v6pJ+A8FYRbUVtPujYIgcYwk= 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=g73MrNpI; 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="g73MrNpI" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7394792f83cso1937957b3a.3 for ; Fri, 04 Apr 2025 14:15:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801314; x=1744406114; 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=ucS1cIhi1yvIAjPfmLIaKa4ZPwFGctQlvybswzj8SS0=; b=g73MrNpIqjV6llDwzck5xMyNaPj+gJCrxdjKFGua1JJ3npcyJpsbbWxC4A349jzGi6 72+JzYcEhzsvr7UFvPAv1ZqhBAN6aHInFev+F1bIm+M3BSpiLxgwTk+3NljVbHQ/j8w8 W0Zlsuu+o5IP4K7IwssqHsg3gtUZOdC+z2y3TVvp936zJF5HnQuxrfUjTKJ9RS5ysnEl 1q1Y+99Cu0ltzA5x6VxCLF9ax+3Hk/gngRFckSYb3oqfKaUw9PJ7qACWDxZ/Zw19skgw KhbUzUsMtQtbO14ofmCTgsyXLZbUGHRYAzdKCDZyRthE1cJAtTS84s7SpbCgG2X3SUkx hM9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801314; x=1744406114; 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=ucS1cIhi1yvIAjPfmLIaKa4ZPwFGctQlvybswzj8SS0=; b=MRKovDWBc3pErbphNr6vLnXjO0G08QsfkIRDxnoQ2X7EO6W1IFBQsEfmayMA+wvBV1 Q+3BtzkzdhCK7gVI35Bs/IZyn+iGvtXIqcV1Zm1ECvr6XNq+4la4mkWt6uNXpH1GXQGh Yma62ZgI4Op5i0RqiQ7a1MXlDygRBjHowXR1sucQomXuzRudwgCIuS87kjxFTIqB8Akn 3vH4q2DFDFjM+mrzoEI2tpD5gntQD0y3caFLEUd3kbbY4IeVuvMh7wN4gNKHVtQd6ZjU wtRyjgLIaTcm9Hye5BqjkSa3vGMR1SqYrVHAl4VJuo0Gfsy9OcAi4+aWnCMXOCYFTNSz R+gg== X-Forwarded-Encrypted: i=1; AJvYcCVJkdIZfV+K5qECoIo0CIaHeRDBN6IKbUbtW6WIS6RrKN8oeE/GRtS38ODED6LSGzxAF8JmH687OEv9UBQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5RmuXJthHPmzoWR5DZRyfWuBIZ+v4oa+PAetC4xWppPFzmAxn h+AUPl4eDEXSkvGz6iZK1Wp9egWfwRfmhyKVCV35ArOaeOxuPss5sbMhsGT4VgetlYvLrS8wTB9 vUQ== X-Google-Smtp-Source: AGHT+IEDdhL+lnjtcVL1Ed1bGzXYhiIsJzjfh13+tnkRQcRgpIirVPKBZIbe1qE7JT7XC/jfJQDJSp2S8E0= X-Received: from pjbqn8.prod.google.com ([2002:a17:90b:3d48:b0:2fa:1803:2f9f]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2cd0:b0:2ff:784b:ffe with SMTP id 98e67ed59e1d1-306af71b814mr1108191a91.11.1743801314494; Fri, 04 Apr 2025 14:15:14 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:48 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-7-seanjc@google.com> Subject: [PATCH 6/7] irqbypass: Use guard(mutex) in lieu of manual lock+unlock From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use guard(mutex) to clean up irqbypass's error handling. Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- 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 6d68a0f71dd9..261ef77f6364 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->token)) return -EINVAL; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 list_for_each_entry(tmp, &producers, node) { - if (tmp->token =3D=3D eventfd) { - ret =3D -EBUSY; - goto out_err; - } + if (tmp->token =3D=3D eventfd) + return -EBUSY; } =20 list_for_each_entry(consumer, &consumers, node) { if (consumer->token =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) - goto out_err; + return ret; break; } } =20 producer->token =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->token) return; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 if (producer->consumer) __disconnect(producer, producer->consumer); =20 producer->token =3D NULL; list_del(&producer->node); - mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); =20 @@ -171,33 +162,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->token =3D=3D eventfd || tmp =3D=3D consumer) { - ret =3D -EBUSY; - goto out_err; - } + if (tmp->token =3D=3D eventfd || tmp =3D=3D consumer) + return -EBUSY; } =20 list_for_each_entry(producer, &producers, node) { if (producer->token =3D=3D eventfd) { ret =3D __connect(producer, consumer); if (ret) - goto out_err; + return ret; break; } } =20 consumer->token =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 @@ -213,13 +196,12 @@ void irq_bypass_unregister_consumer(struct irq_bypass= _consumer *consumer) if (!consumer->token) return; =20 - mutex_lock(&lock); + guard(mutex)(&lock); =20 if (consumer->producer) __disconnect(consumer->producer, consumer); =20 consumer->token =3D NULL; list_del(&consumer->node); - mutex_unlock(&lock); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.504.g3bcea36a83-goog From nobody Sun Feb 8 09:32:23 2026 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 B03D52222DD for ; Fri, 4 Apr 2025 21:15:16 +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=1743801318; cv=none; b=NACANcHYDOSMCBe6/0ujw+0rbtFxEa6ifd4Uph+kAshRiGVQTUeDl2JyOjoF1Ii/Zcd7lcw4yoh65Fckdjrl3rt62VQyjoPIx0Q6NQsSqWPvi3+QmkxeXCX6XKJ+thb7qteoaxQ+vqkvE16V+/pyJRDH9c7fgu8RSiwsDGYsv/E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743801318; c=relaxed/simple; bh=55FJ1JjxJzEfvUCR32CEmuDHX8lAqsLw2GiyIQNI/6o=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=ujmJ19UmC/x1JRPebW2S0sj+J/PE0mxOxShrk3cLqLnYWkpSgBktEcrJssESMyeziAo5iAc1Ly1DOj11HlWeovM8EE26N3GxfEJQS1ffa1RJMg2+Zr12ANcGlRsFTa9XKmP06CpsIAkkIPOxdimQOu7qvaDvts5K5ZDz5EfweCY= 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=pUgg2ASs; 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="pUgg2ASs" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-73009f59215so2987518b3a.1 for ; Fri, 04 Apr 2025 14:15:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1743801316; x=1744406116; 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=rEQ6YbC3KUJ/CgEiqQT3YCqcj84Bba/mdzyHX1dIlKQ=; b=pUgg2ASs+PFlkWR65Uy9K10Xx7g0Ejg/VlahFor9bYWRMBxbrdzhq56PqySiMY27sf oTvNc//FQB72zkuNn7okhP5ZJSjlissTqt4BB9kAM9yrh0QIMWZpvxpmMbV8qHOJ+tm9 ol2kCaLR+2adiE+Ilutjlx6UcCpdx4kIguHg7B0RmZHY1E1du6vtrZq9QitNHom2kLDz Ve7QLGx/QSwnQQ07eSKTkqqPwyWNkH2fIqunCfN6r9CHCz4jdeWp8dr3twFCYYy2WGBK ywOxGKhhoYpTEGRfrC8DahsCZU270LHUmicOjeyoEKuDE16/APpmJ5gJmEEstxszUAJO l4cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743801316; x=1744406116; 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=rEQ6YbC3KUJ/CgEiqQT3YCqcj84Bba/mdzyHX1dIlKQ=; b=faLGPuipLvzc/XO06NHNYU+U/p5y8z/0nPJkhpbAKG3tRgi6sGgTn8/Eaj0ormHnSR rLEdOSON3ZngArPiCK23XaDiIJDPL43IBtxPWi8VJ0e9M9hKSimYX8U2xIoKPQhXbcEx JTh8NZi+eUu6rElAGjt+aBkzc0FNlvJnYeB0XZZxENSzLOBIYJDsEtVD7znjIkE4mosw rmrctHLCrkKqM6JHI1mBGx7MoZe2a70YLU8AfERGv3nTpgRmiL2eSgISYAH57WY4cpFT WgyUKF97+lVNM03gy4khSRqwAIuAF/3CmYbYWkVmwBjflJWmrO84Y9OONgiAtnDWtU4o zI/Q== X-Forwarded-Encrypted: i=1; AJvYcCX5/34tKQd6/BTKVmZJfsdtREAAXlraG3otD4aV8YAdbqgCkLlFdceOPbfaDicXIanU8cVtTM6deKaW4xs=@vger.kernel.org X-Gm-Message-State: AOJu0Yx910rxBeqfudjjD+fn0E18DHNpgTcVX8HIWgDR3CtlzsVS6N4x QjPrpp++hcSz8Bq2RmPazfbXacwrw/oS2Q+/+DTSM5uf4W83+rv5k1cSCOJGw+nCLChcC6hFiGE r7A== X-Google-Smtp-Source: AGHT+IGUhjY+14rjdTSJuxJSMCqc7vFux5KSB5bEGhNoAp0wfj/KsmOLIl+ozqTri6qlvIxKd+yGGWBdPPo= X-Received: from pgbfe28.prod.google.com ([2002:a05:6a02:289c:b0:af7:3f89:85dc]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:ce43:b0:1f5:a3e8:64c1 with SMTP id adf61e73a8af0-20107c3bbadmr6045725637.0.1743801315957; Fri, 04 Apr 2025 14:15:15 -0700 (PDT) Reply-To: Sean Christopherson Date: Fri, 4 Apr 2025 14:14:49 -0700 In-Reply-To: <20250404211449.1443336-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: <20250404211449.1443336-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250404211449.1443336-8-seanjc@google.com> Subject: [PATCH 7/7] irqbypass: Use xarray to track producers and consumers From: Sean Christopherson To: "Michael S. Tsirkin" , Jason Wang , Paolo Bonzini , Alex Williamson Cc: kvm@vger.kernel.org, virtualization@lists.linux.dev, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Sean Christopherson , Oliver Upton , David Matlack , Like Xu , Yong He Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Track IRQ bypass produsers 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 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 Signed-off-by: Sean Christopherson Acked-by: Michael S. Tsirkin Reviewed-by: Kevin Tian --- include/linux/irqbypass.h | 2 -- virt/lib/irqbypass.c | 68 +++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/include/linux/irqbypass.h b/include/linux/irqbypass.h index 6d4e4882843c..e9d9485eaf99 100644 --- a/include/linux/irqbypass.h +++ b/include/linux/irqbypass.h @@ -46,7 +46,6 @@ struct irq_bypass_consumer; * for a physical device assigned to a VM. */ struct irq_bypass_producer { - struct list_head node; void *token; struct irq_bypass_consumer *consumer; int irq; @@ -73,7 +72,6 @@ struct irq_bypass_producer { * portions of the interrupt handling to the VM. */ struct irq_bypass_consumer { - struct list_head node; void *token; struct irq_bypass_producer *producer; =20 diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 261ef77f6364..3f7734e63d0f 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 token found on the IRQ consumers list. + * Add the provided IRQ producer to the set of producers and connect with = the + * consumer with a matching token, if one exists. */ int irq_bypass_register_producer(struct irq_bypass_producer *producer, struct eventfd_ctx *eventfd) { - struct irq_bypass_producer *tmp; + unsigned long token =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->token =3D=3D eventfd) - return -EBUSY; - } + ret =3D xa_insert(&producers, token, producer, GFP_KERNEL); + if (ret) + return ret; =20 - list_for_each_entry(consumer, &consumers, node) { - if (consumer->token =3D=3D eventfd) { - ret =3D __connect(producer, consumer); - if (ret) - return ret; - break; + consumer =3D xa_load(&consumers, token); + if (consumer) { + ret =3D __connect(producer, consumer); + if (ret) { + WARN_ON_ONCE(xa_erase(&producers, token) !=3D producer); + return ret; } } =20 producer->token =3D eventfd; - list_add(&producer->node, &producers); return 0; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); @@ -125,8 +123,9 @@ 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) { @@ -138,8 +137,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, (unsigned long)producer->token) !=3D pr= oducer); producer->token =3D NULL; - list_del(&producer->node); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_producer); =20 @@ -148,11 +147,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 set of consumer and connect with t= he + * producer with a matching token, if one exists. */ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer, struct eventfd_ctx *eventfd) { - struct irq_bypass_consumer *tmp; + unsigned long token =3D (unsigned long)eventfd; struct irq_bypass_producer *producer; int ret; =20 @@ -164,22 +165,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->token =3D=3D eventfd || tmp =3D=3D consumer) - return -EBUSY; - } + ret =3D xa_insert(&consumers, token, consumer, GFP_KERNEL); + if (ret) + return ret; =20 - list_for_each_entry(producer, &producers, node) { - if (producer->token =3D=3D eventfd) { - ret =3D __connect(producer, consumer); - if (ret) - return ret; - break; + producer =3D xa_load(&producers, token); + if (producer) { + ret =3D __connect(producer, consumer); + if (ret) { + WARN_ON_ONCE(xa_erase(&consumers, token) !=3D consumer); + return ret; } } =20 consumer->token =3D eventfd; - list_add(&consumer->node, &consumers); return 0; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); @@ -188,8 +187,9 @@ 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) { @@ -201,7 +201,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, (unsigned long)consumer->token) !=3D co= nsumer); consumer->token =3D NULL; - list_del(&consumer->node); } EXPORT_SYMBOL_GPL(irq_bypass_unregister_consumer); --=20 2.49.0.504.g3bcea36a83-goog