[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] xen/drivers/char: fix SCIF IRQ registration failure propagation
- To: "Orzel, Michal" <michal.orzel@xxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
- From: Oleksii Moisieiev <oleksii_moisieiev@xxxxxxxx>
- Date: Thu, 9 Apr 2026 16:06:12 +0300
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=k0Ly5MxtLFFmTRQKhDZ5zQHPP4uEQId4cHluN4LiXi8=; b=AA1MMxwL0osopM2G1JRM9hggvNjAKsQ8bNSbH3+TgMdm4YV3EzjdeFrVOeF0rzXHb9YXXiQ8zibvewK8gYXQHaglZWLsWhl12WXngsqQQlbNHiebBzgmbbsHpgO8DwMCu0iaCLdCddLmodOF6tCL9QfdqLZF7yeAdUdbkOwGaUKBEYjmJrzBP+T9A0NRDODAOcavfD3ZoR34gNx3nulZpJI4l5Zx0ctbYrxbfZnydeamSZFzVk8BwjCYwRlPPt9DdFJGRwoRy30g3/eayuuqCyVwfiaKlN/NJhnklDO12slgZxGZz/yioFnlHWNQ7mQTxQbuEiKzAV3BjNM3mSohZA==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=F4lVvO4qL/Bgl/GmU8uk7soZBf8UvM3OS77gePxT8Fmq8i11iOk7vjDh6bWkCUZRhHrX4Bcs+mL3E0+cSitlzrlM2CAEgPHWCxoI/yz43b3xW5CDkhGmzLNt3jm+RgnFInGHZyRYODrNpGrjZGxJDbnDR9LwqnBTcyotgMg+QTfh5Pemy5YOSErs1hQvgABAQXawmcLklENyUW21pOf+ufl8ORxuEmBnJE30Qy7lGpisN4djpIBNG83Mpi8iKXkpacYQN01CRdHf3Sy7KY0XiS0nL+FWdcLpcfvZAaTDw7g8iMP2Kno+ISDYOGM/3YbuhnPBey/chogxaIQNXDPqhg==
- Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=epam.com header.i="@epam.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
- Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
- Cc: Bertrand Marquis <bertrand.marquis@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
- Delivery-date: Thu, 09 Apr 2026 13:06:25 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
Hi Michal,
I'll prepare v2 with the fixes.
--
Oleksii
On 09/04/2026 11:17, Orzel, Michal wrote:
On 08/04/2026 19:03, Oleksii Moisieiev wrote:
In scif_uart_init_postirq(), when setup_irq() returns an error the
failure was only logged via dprintk() and execution continued,
unconditionally writing TIE|RIE|REIE into the Serial Control Register
(SCSCR). This armed all three hardware interrupt lines (TX FIFO empty,
RX data ready, receive error) with no handler registered to service
them. On platforms where the GIC receives these asserted lines, the
result is either repeated spurious-interrupt warnings or an unhandled
interrupt fault.
The fix adds an early return inside the error branch. The
interrupt-enable write to SCSCR is skipped entirely when no handler is
registered.
SCIF TX continues to operate correctly after this change. The Xen
serial framework never calls serial_async_transmit() for SCIF, so
port->txbuf is always NULL. This causes __serial_putc() to take the
synchronous finite-capacity path, which polls the SCFSR_TDFE hardware
flag directly and does not depend on the interrupt mechanism.
NIT: It would be nice to at least mention that there will be no serial RX
without interrupts.
As a secondary clean-up, the hardware error-flag clearing sequence is
moved to before the setup_irq() call so that error bits accumulated
since init_preirq() are cleared unconditionally, regardless of whether
IRQ registration succeeds.
Signed-off-by: Oleksii Moisieiev <oleksii_moisieiev@xxxxxxxx>
That's a good catch. I can see most of our drivers already use that.
Reviewed-by: Michal Orzel <michal.orzel@xxxxxxx>
That said, I can see that we have exactly the same issue for pl011, cadence and
exynos. I can either take your patch as is (no more work for you) and submit the
patch fixing remaining drivers or you can send a v2 fixing all at once. It's up
to you.
~Michal
---
xen/drivers/char/scif-uart.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/xen/drivers/char/scif-uart.c b/xen/drivers/char/scif-uart.c
index 888821a3b8..673a2d3800 100644
--- a/xen/drivers/char/scif-uart.c
+++ b/xen/drivers/char/scif-uart.c
@@ -187,16 +187,24 @@ static void __init scif_uart_init_postirq(struct
serial_port *port)
uart->irqaction.name = "scif_uart";
uart->irqaction.dev_id = port;
- if ( (rc = setup_irq(uart->irq, 0, &uart->irqaction)) != 0 )
- dprintk(XENLOG_ERR, "Failed to allocated scif_uart IRQ %d\n",
- uart->irq);
-
/* Clear all errors */
if ( scif_readw(uart, params->status_reg) & params->error_mask )
scif_writew(uart, params->status_reg, ~params->error_mask);
if ( scif_readw(uart, params->overrun_reg) & params->overrun_mask )
scif_writew(uart, params->overrun_reg, ~params->overrun_mask);
+ if ( (rc = setup_irq(uart->irq, 0, &uart->irqaction)) != 0 )
+ {
+ dprintk(XENLOG_ERR, "Failed to allocated scif_uart IRQ %d\n",
+ uart->irq);
+ /*
+ * If the IRQ handler could not be installed (setup_irq failed),
+ * do not enable TX/RX or error interrupts. Serial transmit will
+ * fall back to polling mode.
+ */
+ return;
+ }
+
/* Enable TX/RX and Error Interrupts */
scif_writew(uart, SCIF_SCSCR, scif_readw(uart, SCIF_SCSCR) |
params->irq_flags);
|