Linux USB
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Basavaraj Natikar" <Basavaraj.Natikar@amd.com>
Cc: linux-usb@vger.kernel.org
Subject: Re: [PATCH 3/3] thunderbolt: Add quirk to reset host interface for AMD USB4 routers
Date: Tue, 06 Oct 2026 16:49:54 +0000	[thread overview]
Message-ID: <sashiko-outbox-162270@kernel.org> (raw)
In-Reply-To: <26ea33592937dcd93d06c901443a9b938cc24caf.1790854235.git.Basavaraj.Natikar@amd.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] thunderbolt: NULL pointer dereference in nhi_reset_work() due to late dev_set_drvdata()
--

commit 9823327103fd3f6d1af1a55c73b76fed9264dad0
Author: Basavaraj Natikar <Basavaraj.Natikar@amd.com>

thunderbolt: Add quirk to reset host interface for AMD USB4 routers

This commit adds a quirk for AMD USB4 routers to reset the host interface
before reprogramming a reused DMA HopID, preventing TX ring hangs. The reset
operation waits for DMA rings to stop while leaving other tunnels intact.

> diff --git a/drivers/thunderbolt/pci.c b/drivers/thunderbolt/pci.c
> index 4408229d8ac7b..b26f5b39e923b 100644
> --- a/drivers/thunderbolt/pci.c
> +++ b/drivers/thunderbolt/pci.c
[ ... ]
> @@ -63,6 +63,27 @@ static void nhi_pci_check_quirks(struct tb_nhi_pci *nhi_pci)
>  			nhi->quirks |= QUIRK_E2E;
>  			break;
>  		}
> +	} else if (pdev->vendor == PCI_VENDOR_ID_AMD) {
> +		switch (pdev->device) {
[ ... ]
> +		case PCI_DEVICE_ID_AMD_1AH_M70H_NHI0:
> +		case PCI_DEVICE_ID_AMD_1AH_M70H_NHI1:
> +			/*
> +			 * These hosts may hang the Tx ring if its HopID is
> +			 * programmed again without a host interface reset
> +			 * in between.
> +			 */
> +			nhi->quirks |= QUIRK_RESET_DMA_ON_REUSE;

[Severity: High]
Does adding this quirk expose a race condition during probe that leads to a
NULL pointer dereference in nhi_reset_work()?

When QUIRK_RESET_DMA_ON_REUSE is set, it seems nhi_reset_work() can be queued
when a DMA ring stops. However, looking at the initialization sequence in
nhi_probe(), drvdata is set very late:

drivers/thunderbolt/nhi.c:nhi_probe() {
	...
	res = tb_domain_add(tb, host_reset);
	if (res) {
		...
	}
	dev_set_drvdata(dev, tb);
	...
}

During tb_domain_add(), event processing is started and the lock is dropped
before returning:

drivers/thunderbolt/domain.c:tb_domain_add() {
	...
	/* This starts event processing */
	mutex_unlock(&tb->lock);

	device_init_wakeup(&tb->dev, true);
	...
}

Because tb_domain_add() allows asynchronous events (like DMA ring start/stop
operations) to execute before returning to nhi_probe(), nhi_reset_work() can
be scheduled while drvdata is still NULL. If this happens, it leads to a crash
when trying to acquire the lock:

drivers/thunderbolt/nhi.c:nhi_reset_work() {
	struct tb *tb = dev_get_drvdata(nhi->dev);

	/* The connection manager must be blocked over the reset */
	guard(mutex)(&tb->lock);
	...
}

Can we ensure drvdata is set before enabling event processing, or otherwise
prevent the reset work from running before tb_domain_add() finishes?

> +			break;
> +		}
>  	}
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1790854235.git.Basavaraj.Natikar@amd.com?part=3

      reply	other threads:[~2026-10-06 16:49 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-05 13:43 [PATCH 0/3] thunderbolt: Reset affected AMD host interfaces before DMA HopID reuse Basavaraj Natikar
2026-10-05 13:43 ` [PATCH 1/3] thunderbolt: Allow tb_ring_start() to fail Basavaraj Natikar
2026-10-06  4:27   ` Mika Westerberg
2026-10-06 16:24   ` sashiko-bot
2026-10-05 13:43 ` [PATCH 2/3] thunderbolt: Reset the host interface before reusing a DMA HopID Basavaraj Natikar
2026-10-05 14:35   ` Mika Westerberg
2026-10-05 15:12     ` Mario Limonciello
2026-10-05 16:50     ` Basavaraj Natikar
2026-10-06  4:33   ` Mika Westerberg
2026-10-06 14:47     ` Basavaraj Natikar
2026-10-06 16:35   ` sashiko-bot
2026-10-05 13:43 ` [PATCH 3/3] thunderbolt: Add quirk to reset host interface for AMD USB4 routers Basavaraj Natikar
2026-10-06 16:49   ` sashiko-bot [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-162270@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=Basavaraj.Natikar@amd.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox