From nobody Wed Oct 29 18:56:42 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4cxc0p3QDKz6F8nL; Wed, 29 Oct 2025 18:56:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4cxc0p1C7pz3rCx; Wed, 29 Oct 2025 18:56:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1761764202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jn2eT6iU12cpBGH6o4L+75yhTJCdrfMfAFl6pdmxCZY=; b=pGMiBD3TPC87NHGIyYuvJXnZx9PBpjvgOXID7P5KTEl2NaaBInlLL7GXDUssw/7wW94A0K /D/Zz40sjPAoysA2aBb4Hqz8xnweviTJIGDrc01e2mewFg2YjBDK9nSYy9IONd0IrNtkMC mIvTFPJHQhWPiYfRXgh7M+Qmq5qLTcTFFyvL5U73KXmKMkxH/zGdbXfwWtP45AjXphorV6 1lBzHD7X+RuVlERHqgXpoOD1Aw6XPHUV+VF3MN1NF/vfZnyNz5wcK9SKe9fzfmrJHU9a+e i8S1zRMYyUOcPSaTgJchDH3s8X++/TLa3VxNozB6gr228JBe3pRKwQXJIhNF2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1761764202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=jn2eT6iU12cpBGH6o4L+75yhTJCdrfMfAFl6pdmxCZY=; b=F5EgWZ7Am51yCSTgx1UzQY1RV3WBjlXWwsmlS+ch+RsmxqFT7VBfx87bgJ8Tpgy/PMiPgJ k9VlQ9QshnnmkGeinvmGmN6jWgPhqRw3SwqQVtzbVq5vrCQYl1HJdMwarMpcpYaSL/Ui7/ uYdf9vY9VGHXvdZSj04WQtv4mknpfLUU2pbIzFJGnaLrC106rIbpjpNW6Cmjio2pd0J09y BYjjJeI7ouBGxzc2V70bdHspQcs0wYJuQWoPNeOPePzgG0f/whg794ZZPiWz3NfG8kkx2u +ZvDYpX9Ap56OszUocg5QgHoY6uvLkjn2AfabcBT/lMVME2YpHnyNlWJI7yqBw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1761764202; a=rsa-sha256; cv=none; b=heqNKezXX2kTV8+jiPTHSgJAQPQvO16+qmwoFPlNoU5GZtoG9RlW5/exJs7TJ8cAgrJ1xM yHpJP/yUG9oqSZjfYZbEs8wGPNoGoZjhlulLTYsnPs1WqLB3GIzo/9iO8qLm1QW7x8MQhd z5ICCKPDPdoIs5JoPtiYJFfkt5paG1GHnl6F37xyD7LAhKjymkakWiYfLdH+VmmzaH0lTV 4OWz8oX1MbO52UDVxz7kQsYEajyTuCvoRJtqlYLCuiRm546qX7im94rtI7Lqbo1ZmY/Dv/ bCGqhHCNnw7/FGjQ3I584wk8kqNnzOSeBAqYvCecokIuLNT0hZMC6zqpIHEHIQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4cxc0p0nMDzp38; Wed, 29 Oct 2025 18:56:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 59TIug2r008835; Wed, 29 Oct 2025 18:56:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 59TIuguW008832; Wed, 29 Oct 2025 18:56:42 GMT (envelope-from git) Date: Wed, 29 Oct 2025 18:56:42 GMT Message-Id: <202510291856.59TIuguW008832@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 561571d48067 - main - nhi: Fix a race with interrupt teardown during detach List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 561571d480679933287a6d21c6929c39a7963857 Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=561571d480679933287a6d21c6929c39a7963857 commit 561571d480679933287a6d21c6929c39a7963857 Author: John Baldwin AuthorDate: 2025-10-29 18:56:17 +0000 Commit: John Baldwin CommitDate: 2025-10-29 18:56:17 +0000 nhi: Fix a race with interrupt teardown during detach When nhi fails to attach on one of my systems (X1 Carbon 6th gen), an interrupt races with the teardown code such that the rings have been freed by nhi_detach() before an interrupt triggers. At the time of the crash, the thread invoking nhi_attach() is blocked in bus_teardown_intr() from nhi_pci_free() waiting for the interrupt thread to finish executing the handler. To fix, don't just disable the interrupts in nhi_detach(), but actually tear the handlers down and disable MSI-X before freeing the rings. Reviewed by: obiwac Differential Revision: https://reviews.freebsd.org/D53201 --- sys/dev/thunderbolt/nhi.c | 1 + sys/dev/thunderbolt/nhi_pci.c | 10 +++++++--- sys/dev/thunderbolt/nhi_var.h | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sys/dev/thunderbolt/nhi.c b/sys/dev/thunderbolt/nhi.c index 205e69c16253..30a72652535a 100644 --- a/sys/dev/thunderbolt/nhi.c +++ b/sys/dev/thunderbolt/nhi.c @@ -322,6 +322,7 @@ nhi_detach(struct nhi_softc *sc) tbdev_remove_interface(sc); nhi_pci_disable_interrupts(sc); + nhi_pci_free_interrupts(sc); nhi_free_ring0(sc); diff --git a/sys/dev/thunderbolt/nhi_pci.c b/sys/dev/thunderbolt/nhi_pci.c index 7dacff523cef..865963e275ec 100644 --- a/sys/dev/thunderbolt/nhi_pci.c +++ b/sys/dev/thunderbolt/nhi_pci.c @@ -67,7 +67,7 @@ static int nhi_pci_suspend(device_t); static int nhi_pci_resume(device_t); static void nhi_pci_free(struct nhi_softc *); static int nhi_pci_allocate_interrupts(struct nhi_softc *); -static void nhi_pci_free_interrupts(struct nhi_softc *); +static void nhi_pci_free_resources(struct nhi_softc *); static int nhi_pci_icl_poweron(struct nhi_softc *); static device_method_t nhi_methods[] = { @@ -253,7 +253,7 @@ static void nhi_pci_free(struct nhi_softc *sc) { - nhi_pci_free_interrupts(sc); + nhi_pci_free_resources(sc); if (sc->parent_dmat != NULL) { bus_dma_tag_destroy(sc->parent_dmat); @@ -307,7 +307,7 @@ nhi_pci_allocate_interrupts(struct nhi_softc *sc) return (error); } -static void +void nhi_pci_free_interrupts(struct nhi_softc *sc) { int i; @@ -319,7 +319,11 @@ nhi_pci_free_interrupts(struct nhi_softc *sc) } pci_release_msi(sc->dev); +} +static void +nhi_pci_free_resources(struct nhi_softc *sc) +{ if (sc->irq_table != NULL) { bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->irq_table_rid, sc->irq_table); diff --git a/sys/dev/thunderbolt/nhi_var.h b/sys/dev/thunderbolt/nhi_var.h index 2b9e878af47d..e79ecc954c1f 100644 --- a/sys/dev/thunderbolt/nhi_var.h +++ b/sys/dev/thunderbolt/nhi_var.h @@ -217,6 +217,7 @@ struct nhi_dispatch { int nhi_pci_configure_interrupts(struct nhi_softc *sc); void nhi_pci_enable_interrupt(struct nhi_ring_pair *r); void nhi_pci_disable_interrupts(struct nhi_softc *sc); +void nhi_pci_free_interrupts(struct nhi_softc *sc); int nhi_pci_get_uuid(struct nhi_softc *sc); int nhi_read_lc_mailbox(struct nhi_softc *, u_int reg, uint32_t *val); int nhi_write_lc_mailbox(struct nhi_softc *, u_int reg, uint32_t val);