aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Hibbits <jhibbits@FreeBSD.org>2025-10-26 02:45:26 +0000
committerJustin Hibbits <jhibbits@FreeBSD.org>2025-10-27 14:33:49 +0000
commitcb38499303621553c977fd7dd7f18d12731fcd9c (patch)
treee88162636653e0222f455c740bec13f99a5cba8c
parent1a679fb907962843f01b103ec672136a8f8d8edb (diff)
x86/intr: Handle case of disabling MSI after release
Once an interrupt source is registered it's never deregistered. However, when an MSI is released the pointer for it becomes NULLed out, resulting in a NULL pointer dereference when attempting to disable the now-released MSI source. Add NULL check to avoid this. Reviewed by: kib Sponsored by: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D51624
-rw-r--r--sys/x86/x86/msi.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/x86/x86/msi.c b/sys/x86/x86/msi.c
index 9d5a51f9753c..b38247bf6e45 100644
--- a/sys/x86/x86/msi.c
+++ b/sys/x86/x86/msi.c
@@ -219,6 +219,14 @@ msi_disable_intr(struct intsrc *isrc)
struct msi_intsrc *msi = (struct msi_intsrc *)isrc;
msi = msi->msi_first;
+
+ /*
+ * Interrupt sources are always registered, but never unregistered.
+ * Handle the case where MSIs have all been unregistered.
+ */
+ if (msi == NULL)
+ return;
+
msi->msi_enabled--;
if (msi->msi_enabled == 0) {
for (u_int i = 0; i < msi->msi_count; i++)