From: Vishwaroop A <va@nvidia.com>
To: Thierry Reding <thierry.reding@kernel.org>,
Jonathan Hunter <jonathanh@nvidia.com>,
Mark Brown <broonie@kernel.org>
Cc: Vishwaroop A <va@nvidia.com>, Breno Leitao <leitao@debian.org>,
"Laxman Dewangan" <ldewangan@nvidia.com>,
Sowjanya Komatineni <skomatineni@nvidia.com>,
Suresh Mangipudi <smangipudi@nvidia.com>,
"Krishna Yarlagadda" <kyarlagadda@nvidia.com>,
<linux-tegra@vger.kernel.org>, <linux-spi@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: [PATCH v3 0/3] spi: tegra210-quad: Improve interrupt handling for loaded systems
Date: Wed, 20 May 2026 19:24:02 +0000 [thread overview]
Message-ID: <20260520192405.70469-1-va@nvidia.com> (raw)
The current threaded IRQ implementation in spi-tegra210-quad suffers from
scheduler-induced latency on heavily loaded systems. Because threaded IRQ
handlers are subject to CFS scheduling, they can be delayed long enough to
trigger transfer timeouts even though hardware completes in microseconds.
This results in false timeout errors and WARN_ON splats during normal
operation.
This series addresses the problem in three steps:
1. Convert the threaded IRQ handler to a hard IRQ + high-priority unbound
workqueue model. The hard IRQ does the minimum: verify interrupt
ownership, cache status registers, clear and mask interrupts. The
workqueue bottom-half handles the rest in process context and can run
on any available CPU, avoiding the CPU0 bottleneck inherent in threaded
IRQs.
2. Cache QSPI_TRANS_STATUS in the ISR before clearing it. This allows the
timeout handler to distinguish between a real hardware timeout (QSPI_RDY
not set) and a delayed workqueue (QSPI_RDY set), preventing false
timeout errors when hardware has already completed.
3. Process small PIO transfers (≤ FIFO depth, 256 bytes) directly in
hard IRQ context. This eliminates workqueue scheduling overhead for
latency-sensitive devices like TPMs, reducing completion latency from
potentially seconds to microseconds.
Changes since v2:
- Added cancel_work_sync() in remove to flush pending work before devm
tears down the workqueue (Jon Hunter)
- Rewrote patch 2 commit message to describe the race in terms of the
workqueue model rather than referencing the old threaded IRQ (Jon)
- s/NULLed/cleared/ in code comment (Jon)
Changes since v1:
- Switched to devm_alloc_workqueue() and devm_request_irq() for resource
management, simplifying error paths and remove (Jon Hunter)
- Improved patch 2 commit message to explain the timeout race scenario
and clarify that the issue pre-exists the workqueue conversion (Jon)
- Removed unnecessary local variable in tegra_qspi_handle_timeout (Jon)
- Moved "workqueue was delayed" comment updates from patch 2 to patch 1,
since patch 1 introduces the workqueue (Jon)
Tested on TH500 with TPM and QSPI flash devices under sustained load.
Vishwaroop A (3):
spi: tegra210-quad: Convert to hard IRQ with high-priority workqueue
spi: tegra210-quad: Cache TRANS_STATUS in ISR for timeout handler
spi: tegra210-quad: Process small PIO transfers in hard IRQ context
drivers/spi/spi-tegra210-quad.c | 166 +++++++++++++++++++++-----------
1 file changed, 112 insertions(+), 54 deletions(-)
--
2.17.1
next reply other threads:[~2026-05-20 19:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 19:24 Vishwaroop A [this message]
2026-05-20 19:24 ` [PATCH v3 1/3] spi: tegra210-quad: Convert to hard IRQ with high-priority workqueue Vishwaroop A
2026-05-20 19:24 ` [PATCH v3 2/3] spi: tegra210-quad: Cache TRANS_STATUS in ISR for timeout handler Vishwaroop A
2026-05-20 19:24 ` [PATCH v3 3/3] spi: tegra210-quad: Process small PIO transfers in hard IRQ context Vishwaroop A
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=20260520192405.70469-1-va@nvidia.com \
--to=va@nvidia.com \
--cc=broonie@kernel.org \
--cc=jonathanh@nvidia.com \
--cc=kyarlagadda@nvidia.com \
--cc=ldewangan@nvidia.com \
--cc=leitao@debian.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-spi@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=skomatineni@nvidia.com \
--cc=smangipudi@nvidia.com \
--cc=thierry.reding@kernel.org \
/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