From nobody Sat Sep 26 22:02:17 2026 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 74798327BFB for ; Sat, 29 Aug 2026 01:00:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.198 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965224; cv=none; b=qw5kxI7cAITEIdltSJ7z9HA3BacodXumDxCkYW+TJC0WVTJ2dNa551lz8OhWUromMMIILhbKDAiiQyyO30SqC0i4AM+V2sSuBbbXX0um/3M2pN5ncsEDt+Ip22giyNxZP08w4FDuzrafI+P7TLIjFo1axQEed8Gph/vblY+GQ/E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965224; c=relaxed/simple; bh=Vk/Mww83tU+iFDhSWljSMuGLoayHgkd/y+pTY0IaHJQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=aPRwK3qLscXE3sway3yUqhlVDznCcpUadh+xhYjf4BUPc7FQKlVmq8R80c2YkiLWs4TcSGlc7CijLvjScD8iIPgo1XVLOE5P/QiiJsWo+xYQHS1fmBlf8QjfmXRU3QWFkbDcW3UtEf7g/g21o5+W35N11dQ8QBsS7APKogT+/FQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Rq43wm58; arc=none smtp.client-ip=209.85.214.198 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Rq43wm58" Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2d733799ebfso23199255ad.2 for ; Fri, 28 Aug 2026 18:00:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787965223; x=1788570023; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xL/+Bog/PbUCDB7Xzp1U1OyiVez+C+McjX7yjYAmEss=; b=Rq43wm586fqFkuYYVuTeHk+wGxIkE3BTMnFq+J/2O8QH7sr0PRe398zELXs2wey90J p5xbZvBPLvypnkbDCTYwctI57vHwhixtHObcvmOLnAJSADFo8Eom+RILtiU79dJOxR3C EqY3HpjpUX6aEB34mLS+h4Ax54eP/3TtKgTbZEd5bsc+jUZ+vf9VibiCrEMI6kG859cN +7TLTnlI0q4+jHybDSWNNTucKjDCLh5cQ4JskhV095r6p15IviL63n1dkDKq6gqWccXR hROmfX7ec5ye7jeRi0E2h/PyHKLu7Qh+3dZ9IJcy5+SR5SmI1sMkRcW8anbeEjEyxDv/ fukg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787965223; x=1788570023; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=xL/+Bog/PbUCDB7Xzp1U1OyiVez+C+McjX7yjYAmEss=; b=oX1Y/WzJNjdC7/ZjdN8T01dkMQhRexW/0fsKBaUO8+s8XaY3V4vROpRm5RHCxKcz8K 0EiNB+TD6T54qJ/4ZCdSooea9OHabzk8zbZ14lhnGSZBGPQ6kRIFBQwCtaHI0hoVX5H3 0XOWOHAw4BUnqFR0xkkHqwg7Q84TfEShw1pcrpsRPM9rwTyKXeqYrRZR6UvSSAhozY4i 86PF/p1QdEYASJgcSUoBESgVxt6ETebUigV26soKjc/KKHZW+t9uIkS0PN1hsqPHZvHV lh5vq2zpm3Uj/Byw0aAaXYGGMZ3StWTwNtQnKLfoZT0WvPTWHW5MQ/gkq7ZjkucURXOZ m6yw== X-Forwarded-Encrypted: i=1; AKwUvBzIkSUw/hGicKNdhmZGR0Pq8lGHNs3yo9P5ULNTZPueFKyRdtkGK+riOLMK/DgdcKtcI74uucNGgbIBdgs=@vger.kernel.org X-Gm-Message-State: AFuF++m93OLsefBhvpGdx08fV2wrtlNChCHHkuHmi1lM+xygujnCUVO+ aOjVgILekvt/4qjLwQ8VE6RdamlQAxMJD7dWiCEyH6f6wQYKWV/HMaWbTwpaoRf415Ml7xHXSrX 1qE68vcXt7Q== X-Received: from dykg10.prod.google.com ([2002:a05:7300:578a:b0:311:55c2:34f4]) (user=mrungta job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:efd1:b0:2d6:f988:398f with SMTP id d9443c01a7336-2d74df00b5amr148874075ad.12.1787965222590; Fri, 28 Aug 2026 18:00:22 -0700 (PDT) Date: Fri, 28 Aug 2026 17:59:55 -0700 In-Reply-To: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> X-Developer-Key: i=mrungta@google.com; a=ed25519; pk=2Bjwbv/ibL10QnyvK9G7DoKpffXy7z6+M4NawEYgYDI= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787965218; l=3260; i=mrungta@google.com; s=20260212; h=from:subject:message-id; bh=Vk/Mww83tU+iFDhSWljSMuGLoayHgkd/y+pTY0IaHJQ=; b=r+cYTwTBM07TZP2PN6YtYuKf2jtaIvPMv1gCnumMdOaKjOUvDsutUzxk4hyjKzeL41KrK+y+z cNnoga5rZe6AJVMbhr3PdVGSMN1HtgsERee3b2G9kcuRoMpA0DQ4MUo X-Mailer: b4 0.14.3 Message-ID: <20260828-qcom-wdt-nmi-series-v2-1-363979fe6b6b@google.com> Subject: [PATCH v2 1/5] genirq: Synchronize in-flight handlers during NMI teardown From: Mayank Rungta To: Wim Van Sebroeck , Guenter Roeck , Thomas Gleixner , Radu Rendec Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, "Kirill A. Shutemov" , Douglas Anderson , Mayank Rungta Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When freeing an interrupt requested via request_nmi(), __cleanup_nmi() currently tears down the NMI and frees the irqaction structure without waiting for in-flight instances of the handler on other CPUs to complete, which can lead to use-after-free conditions on module unload. Because NMIs cannot acquire desc->lock or set IRQD_IRQ_INPROGRESS without risking deadlocks, synchronizing in-flight NMIs on other CPUs during teardown (__synchronize_hardirq) relies on querying the hardware controller state via __irq_get_irqchip_state(IRQCHIP_STATE_ACTIVE). Enforce that any interrupt controller claiming NMI support via IRQCHIP_SUPPORTS_NMI must implement ->irq_get_irqchip_state(). In __cleanup_nmi(), shut down the line, call __synchronize_hardirq(desc, true) to wait for in-flight handlers, and only then tear down the NMI configuration and deactivate the interrupt domain before freeing the action structure. Also add a WARN(in_interrupt()) check in free_nmi() matching __free_irq() to prevent freeing NMIs from atomic contexts since synchronization and resource cleanup can sleep and spin. Assisted-by: Antigravity:gemini Signed-off-by: Mayank Rungta --- kernel/irq/manage.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 2fbff2618a1e..61384925b921 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -1379,6 +1379,14 @@ static bool irq_supports_nmi(struct irq_desc *desc) if (d->chip->irq_bus_lock || d->chip->irq_bus_sync_unlock) return false; =20 + /* + * NMIs cannot set IRQD_IRQ_INPROGRESS because they cannot acquire + * spinlocks. Synchronous disable and teardown require querying the + * hardware state via ->irq_get_irqchip_state(). + */ + if (!d->chip->irq_get_irqchip_state) + return false; + return d->chip->flags & IRQCHIP_SUPPORTS_NMI; } =20 @@ -2035,10 +2043,6 @@ static const void *__cleanup_nmi(unsigned int irq, s= truct irq_desc *desc) const char *devname =3D NULL; =20 scoped_guard(raw_spinlock_irqsave, &desc->lock) { - irq_nmi_teardown(desc); - - desc->istate &=3D ~IRQS_NMI; - if (!WARN_ON(desc->action =3D=3D NULL)) { action =3D desc->action; irq_pm_remove_action(desc, action); @@ -2047,11 +2051,20 @@ static const void *__cleanup_nmi(unsigned int irq, = struct irq_desc *desc) desc->action =3D NULL; =20 irq_settings_clr_disable_unlazy(desc); - irq_shutdown_and_deactivate(desc); + irq_shutdown(desc); } =20 irq_proc_update_valid(desc); =20 + /* Ensure all in-flight NMI handlers on other CPUs complete before freein= g action */ + __synchronize_hardirq(desc, true); + + scoped_guard(raw_spinlock_irqsave, &desc->lock) { + irq_nmi_teardown(desc); + desc->istate &=3D ~IRQS_NMI; + irq_domain_deactivate_irq(&desc->irq_data); + } + if (action) unregister_handler_proc(irq, action); kfree(action); @@ -2068,6 +2081,8 @@ const void *free_nmi(unsigned int irq, void *dev_id) { struct irq_desc *desc =3D irq_to_desc(irq); =20 + WARN(in_interrupt(), "Trying to free NMI %d from IRQ context!\n", irq); + if (!desc || WARN_ON(!irq_is_nmi(desc))) return NULL; =20 --=20 2.55.0.897.gb25b4bd76c-goog From nobody Sat Sep 26 22:02:17 2026 Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 789BA3A783B for ; Sat, 29 Aug 2026 01:00:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.200 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965226; cv=none; b=G12A9jOjH3gfHc3Bay/1kS/Le+tWzJJzU787sCB3+O1R7kYtoMvxmM1pR6w3hAvzykla2vGh8c+KP0c+mPmDkMNUXX2p30GWg/C00ohivOBPrNWcS0cSKojx9ajl8qzco8RLtoPQaaqPb7Qaq25EfdexoxV59CwB/qCpWqYKhI0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965226; c=relaxed/simple; bh=YEjOxh3abV9nYYZexFyLXeBBibH2C1bqXkH2TfSE2G0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=L7N97DyamTNOr2BtStpFExR3JFANezcez0BgrVf6gH5+zHmRU/i7p5C2EEAOgCcVj1KsdR3wV0jm7GhZqxlkTG4j84RHUJiW5Ss1jC4GyT+MIfJC4e6hnVLixveAHgshIAy5iPT6eEqVwtKElsHdf2dPdK0TOgZN4Qj2DpUNFDg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ihBTkcbf; arc=none smtp.client-ip=209.85.215.200 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ihBTkcbf" Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cc15155cde2so2033037a12.2 for ; Fri, 28 Aug 2026 18:00:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787965225; x=1788570025; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ffPiTixVm2rFGoJCgY8dBo6+b5XD1+apcgvg2E1whV4=; b=ihBTkcbfhnHkUoWi4L95f1UsVPVIVnq7DrfnSCIFd34e2Edmpulot0rAR16WhXdNvp ftlxOBE4a+emWAyO9bVGztmOlCyQINN/e1/SEodG37WicfZMmknVn/cPukSEcXiSRIVo QuHnULvlnGHhm/flf85U7QnEJ6X2N7WBhQCicDA/dOZeTpPFcZGFZsUjQ7qc+fqvig/e jjtg923laeP+ZKuG7JhVJXwQ0SXC2Pd7XXOueZy7pw3FkjSO3/Xw90DpOZXm4quy/bcr qD7OauL6SyA3UhQqQFK9yBPPF1RBDXRCB8B9ro7VX1lG3hjTPohaS6rxeSZdx9fn4HHz YX2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787965225; x=1788570025; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ffPiTixVm2rFGoJCgY8dBo6+b5XD1+apcgvg2E1whV4=; b=bUMYXwUzounVGxPW18Owo3/3yAfqDU6ik9qiDE/xJ2oCJ5OqH0Mjw0SMAVwFX4Jcr6 SZV0+jKTPMO1+aOg6MgA13dpCEfowmFSPAaL+aFKz482jymf+A4JyVpNVI2E9j0A6myO zWPzd1Ou/cOfmFFbt6oh7u/8Nc51s7KpP9AW3TmXF1Pk2vM6lDdi0zKbgivDLgEEleW9 887ubJ5tI/LSUio//q4+ZIMTtd65bIM3nt7K3lzP/eNtp8dTaMRRQ6e16wRkxToJIR+Q yZKsUg/9OhDwguRAe8FVzSQb8rV2XOZDpkJrPVYn+3FlXGZ4RabxOgvfPY/dAQyy3mpZ A77g== X-Forwarded-Encrypted: i=1; AHgh+RriOJ4eY4RoeDpzSk0gH5CBbtTyTdGEgqaS/+hwCc1uG2S7fevRHGWIXWiWskpXSnlnWOCjwKh4wfqFbZ0=@vger.kernel.org X-Gm-Message-State: AFuF++noCSAsADSdTAMOFzmPNj519+4f0+GxmhnLm+GP2NlmzX4ckwdU crN2gzDyCTuakZVAvx6g/LAy8o5RKrnzGHhHyYDJBqzCdLDgdkavqnUpzUBNv+RITnCOwjo4u0u ck1lZpJ8UNA== X-Received: from dldyr20-n2.prod.google.com ([2002:a05:701b:4514:20b0:13f:c741:a50b]) (user=mrungta job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a20:4326:b0:3c4:3112:45 with SMTP id adf61e73a8af0-3d3bf1583f5mr4114750637.1.1787965224379; Fri, 28 Aug 2026 18:00:24 -0700 (PDT) Date: Fri, 28 Aug 2026 17:59:56 -0700 In-Reply-To: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> X-Developer-Key: i=mrungta@google.com; a=ed25519; pk=2Bjwbv/ibL10QnyvK9G7DoKpffXy7z6+M4NawEYgYDI= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787965218; l=1887; i=mrungta@google.com; s=20260212; h=from:subject:message-id; bh=YEjOxh3abV9nYYZexFyLXeBBibH2C1bqXkH2TfSE2G0=; b=MqlBZa9OrFvnbU3ImY1iRbCpQUFfONMZGfbOxNY18pw74YyrjcchXgMwTR2uL+113EMHY5BGH kfYSKCrY/wpDgzdmEim6bAlxBtdA9MGkRJxoAdTGePXZ5OkarKEaRYh X-Mailer: b4 0.14.3 Message-ID: <20260828-qcom-wdt-nmi-series-v2-2-363979fe6b6b@google.com> Subject: [PATCH v2 2/5] genirq: Implement synchronous disable_nmi() From: Mayank Rungta To: Wim Van Sebroeck , Guenter Roeck , Thomas Gleixner , Radu Rendec Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, "Kirill A. Shutemov" , Douglas Anderson , Mayank Rungta Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Currently, disable_nmi_nosync() is the only interface to disable an NMI line. Drivers stopping their devices in process context need a synchronous variant that guarantees any running instance of the NMI handler has completed on other CPUs before returning. Implement disable_nmi() by wrapping disable_irq(). Assisted-by: Antigravity:gemini Signed-off-by: Mayank Rungta Reviewed-by: Douglas Anderson --- include/linux/interrupt.h | 1 + kernel/irq/manage.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 3bf969ad8fe0..f13b3ab3829a 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -243,6 +243,7 @@ DEFINE_LOCK_GUARD_1(disable_irq, int, disable_irq(*_T->lock), enable_irq(*_T->lock)) =20 extern void disable_nmi_nosync(unsigned int irq); +extern void disable_nmi(unsigned int irq); extern void disable_percpu_nmi(unsigned int irq); extern void enable_nmi(unsigned int irq); extern void enable_percpu_nmi(unsigned int irq, unsigned int type); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 61384925b921..40013aa94481 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -767,6 +767,21 @@ void disable_nmi_nosync(unsigned int irq) disable_irq_nosync(irq); } =20 +/** + * disable_nmi - disable an nmi and wait for any pending handlers + * @irq: Interrupt to disable + * + * Disable the selected interrupt line. Disables and enables are nested. + * + * The interrupt to disable must have been requested through request_nmi. + * This function ensures existing instances of the NMI handler have + * completed before returning. + */ +void disable_nmi(unsigned int irq) +{ + disable_irq(irq); +} + void __enable_irq(struct irq_desc *desc) { switch (desc->depth) { --=20 2.55.0.897.gb25b4bd76c-goog From nobody Sat Sep 26 22:02:17 2026 Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4921B3A6B92 for ; Sat, 29 Aug 2026 01:00:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.71 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965230; cv=none; b=NiqVo0fFJNQikLBCeMEy1v4fk7V0Dc6BYAxkxb0T90crDiwjPKpro4OaAg4ru8eycRm4ApiQ+hFeAbJDKl4Z5oOyxjc3gSBk3UZGK3svhkM1N5YEVIPDPeN9/2AUktMbToeAy6Wm7f7o2vttLgI5x4pQb3feTTDE3sV6W1kb+WA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965230; c=relaxed/simple; bh=YCBb6JCBz9uYY2aQS0mNeRjnKbSKsvsyrD2Dfk1TJ64=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=mOU4eXP+uh2MNULWQxV1r1T/JCzRTc3OxbnfYsXoAu8b2bFGEtT/DZ2RKmaymA5tuxMqdJeFFsBfEB3xNVxHZFY0yb+3lr3tyJ0YGXemYMX0P6767KnUGJNmGbjDOTZGjKMMR2ClDE1VKE9xkjiWUPkpTPv+FEouIUOCzP8lorc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=hRRx87hD; arc=none smtp.client-ip=209.85.216.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="hRRx87hD" Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38f57e31b6eso1654676a91.1 for ; Fri, 28 Aug 2026 18:00:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787965226; x=1788570026; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=lOCsF+Q/dEN9C/W+xZWUHpAFMeTYzX55pmMwwrUJKsE=; b=hRRx87hDYI0IiaSLgSLJ768W/kTd9QGs68+uhoIX9MwVQZHKR/JfzLUKakIqcCfgxj dZ5A2nVj6xdDj8vI8q6Q4ggzYgXG0FW59ggOE/QN2IMssxBT8t6KSPlVHCq8+lOoX0hR 6G9y44OE8Ae9DdcFOaBU3MbUauvWsCWC+rtrYFAYOFMjPFukJSM2Z+2u3PGmpkdYWgto i+Kyy7OjPQGljlq1NVmFmcnuvUM7u73r/ZjnRY2Q3WxrqTnX7Sr46mOxagvX0QXXmZK5 TaLys9FiOOxXVtQ1WRaSodz+PT+LtAMcdN8JNH0zOC63Fa36RmiJpNBUv8XrGkP/LjSE frFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787965226; x=1788570026; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lOCsF+Q/dEN9C/W+xZWUHpAFMeTYzX55pmMwwrUJKsE=; b=lhTidxdcLOR4/oX25VYxqwl/9Z6soCa4xsnXwsiCbY0Iqflu58B6YTPVXnbbyYusIP D87OHfR0nGhiW7/FD5KAPhPyA5biPdfMkv0YSw7CojTa/EjMA2eeEkTckwGfpo/rN+ti SLZgyAolmo4Vq+F9XfJxrRbL+dilcGXg8OEGbMrHYm0tanVnalzgNeW/1Pgos/mBvrwe vqaYw4TmIwQqCPqyWVvIGYgyAxe8z85O6RdNyM3+AGJy7lOiNB64QNjIX82PBmyi0Y9Q p3wsMRKhcOz92RjnOe1zKFcDnz2rl+BVW6FdQUG1p85EQzVuDKFtFkx5KskFyHBIYqfG 5Vog== X-Forwarded-Encrypted: i=1; AKwUvBw/xiGCwh9MIXAHDFypSYoGYmqX7NP9l4bQTortzwn1OfMF261SDhsW9p6MBkrILslSYzy1rbSCpjbiPhI=@vger.kernel.org X-Gm-Message-State: AFuF++kDXQuOJiPIY1r190BOAf9lwL2EdM/A9nLTUzEVMxX/JN3EsTbh eiBqkl6xjdcPl2m7Hml1I8Owls+g/vcQwEoICiY3e5XbCuhBRRwAlu0FBvqha3D72qtQZcbPdrH 29NrP/pzhfg== X-Received: from dlah10.prod.google.com ([2002:a05:701b:260a:b0:13b:9fe2:1c73]) (user=mrungta job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:2f0f:b0:380:540:d499 with SMTP id 98e67ed59e1d1-396d0ed0023mr21152806a91.6.1787965226318; Fri, 28 Aug 2026 18:00:26 -0700 (PDT) Date: Fri, 28 Aug 2026 17:59:57 -0700 In-Reply-To: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> X-Developer-Key: i=mrungta@google.com; a=ed25519; pk=2Bjwbv/ibL10QnyvK9G7DoKpffXy7z6+M4NawEYgYDI= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787965218; l=1613; i=mrungta@google.com; s=20260212; h=from:subject:message-id; bh=YCBb6JCBz9uYY2aQS0mNeRjnKbSKsvsyrD2Dfk1TJ64=; b=r+FkIG3uoRHWf8zvZBgP2LQJplrrII+2fgmGZr8wQQQ2+GsRnMTGG35UZNGl1Z6BWeBhh1pd5 K/xVzdb6L/HA8PJvG3/1noyvj3CcVRcUDkjd0lgDrkwGqB+4wjn32oy X-Mailer: b4 0.14.3 Message-ID: <20260828-qcom-wdt-nmi-series-v2-3-363979fe6b6b@google.com> Subject: [PATCH v2 3/5] genirq: Export NMI APIs From: Mayank Rungta To: Wim Van Sebroeck , Guenter Roeck , Thomas Gleixner , Radu Rendec Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, "Kirill A. Shutemov" , Douglas Anderson , Mayank Rungta Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Currently, request_nmi(), free_nmi(), enable_nmi(), disable_nmi_nosync(), and disable_nmi() are restricted to built-in kernel code because they are not exported. Export these symbols with EXPORT_SYMBOL_GPL so loadable kernel modules can register and manage NMIs. Assisted-by: Antigravity:gemini Signed-off-by: Mayank Rungta Reviewed-by tag: Reviewed-by: Douglas Anderson --- kernel/irq/manage.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 40013aa94481..ded8cc33381c 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -766,6 +766,7 @@ void disable_nmi_nosync(unsigned int irq) { disable_irq_nosync(irq); } +EXPORT_SYMBOL_GPL(disable_nmi_nosync); =20 /** * disable_nmi - disable an nmi and wait for any pending handlers @@ -781,6 +782,7 @@ void disable_nmi(unsigned int irq) { disable_irq(irq); } +EXPORT_SYMBOL_GPL(disable_nmi); =20 void __enable_irq(struct irq_desc *desc) { @@ -848,6 +850,7 @@ void enable_nmi(unsigned int irq) { enable_irq(irq); } +EXPORT_SYMBOL_GPL(enable_nmi); =20 static int set_irq_wake_real(unsigned int irq, unsigned int on) { @@ -2110,6 +2113,7 @@ const void *free_nmi(unsigned int irq, void *dev_id) =20 return __cleanup_nmi(irq, desc); } +EXPORT_SYMBOL_GPL(free_nmi); =20 /** * request_threaded_irq - allocate an interrupt line @@ -2372,6 +2376,7 @@ int request_nmi(unsigned int irq, irq_handler_t handl= er, =20 return retval; } +EXPORT_SYMBOL_GPL(request_nmi); =20 void enable_percpu_irq(unsigned int irq, unsigned int type) { --=20 2.55.0.897.gb25b4bd76c-goog From nobody Sat Sep 26 22:02:17 2026 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 538AF330652 for ; Sat, 29 Aug 2026 01:00:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.199 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965231; cv=none; b=ukMMTGQqm7AZjmZHrTFYXupj4ZsFUCoBqVt99N6vBH2kf39tqd9rD6d+3McrmueiIMjE3WoVTOOfUlHj52IDaByrihnGYy55Fh21lbvCQs6dq9DE8gvwWz1qNVH9kIofLEm25bb3hq0/uivUtYfneHTg9US1RrCsqdKD48xcCqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965231; c=relaxed/simple; bh=VRMP7JkkrsgtGCqNZ8apRQnntFni3AQp0Jl77stRJ70=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=UqyUQFd4Nd+QwPXdGPaUtl8Ev3KBW07rzKTiXTjtqjR21B09Nw01aRB+M1Lz7KrY+TDKV7VZnMAitZKka/ugX9RcLImxvCyUssQpM4yiQUQ9JqCrs8FN+xjgROZoZxzrKfK4Gx6I8PZy+jeIin1K6zfQCnUqlLWRs79Q1MfJPfk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=WW9OtZjO; arc=none smtp.client-ip=209.85.214.199 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="WW9OtZjO" Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2d6f73d0f89so27726325ad.0 for ; Fri, 28 Aug 2026 18:00:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787965228; x=1788570028; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Xqu55i/xt2SdtDol/u9w0q9bCB+z+btqRC0BIY7IKUs=; b=WW9OtZjOqTJvoRWEO9MA1HjrFqSF1YUN7FvplJPkmyYJnNMz8gY0oJPdSbbBA1rAyN Vc5V3FXAiYVOoKZRSNXgGgS3fyvP+/GSyUM3Z3Rs0NZoh+9cZfdwu8WG7JhQnTK4MClV Hhzg2J3zEXspyetyrwtnQ3HFX85YvepWQZAm1pfb0aOTbgrMjdKAaPPT6jXl6X12mZWS m8kIFELngB1H83HqcVOYIftYU72z2WqaOqk00EZK9wVWYzu1dV1nK1jefUgDGnZpNsLj fAvav/0PH4qdAC+KhVpjN1wgYLIW38y7pynwbo42mku2pPMzlSRowc0ed1vzqb3Wl8BS 58Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787965228; x=1788570028; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Xqu55i/xt2SdtDol/u9w0q9bCB+z+btqRC0BIY7IKUs=; b=VIiRBe3dlKh/eUe/bsKaaTdyLRCDixgJ3+4Agwk3/6aXTqzO3IWnJkjYRKQuaTshYG XQ8z2oJL0e9I50LMBn9zuly8d3MSSMfb8KvVNiA5jeLvVEQQQ0JNra/WE9JF6T5TeCL9 jlXwTArGWuM4AvvQlHMm4l/nhq2ULv6d2hQPNw+MGlC+zFZPXsQidR+uZpgPJK/kRJpU 5OUK8ypR3kUKDGY4ugArGQZBrU/3LW4f8rRLn7YpTkg9uI11BwPIXo12bf2dmVFg9aWO 9mnh2t3YgSVYLVfWqyrNKErublv37B8CWIWC8Ua/ZXPfDKRAoJnY11YmcePxjEnuQ2Qe kv2g== X-Forwarded-Encrypted: i=1; AKwUvBx2EERY2VwI0aHWJdKVbZMeqE4+mSUidSBrpNmWdk4OHw5FByNXwQVkRh+aWNeCRbgx4W9rTev8N96rWyg=@vger.kernel.org X-Gm-Message-State: AFuF++n7zfpD47By1pGSPs4atSWZgWq+VuifbARs9+gd8kXEoylAeZBe vWZip1ubvV5GEYclnf95sKnKq+YVJcJIgU5w2b8FaYvpq0Fzcil9MmSlS8eFZVCkJjc0GjJCyeG bzYM2NPS24g== X-Received: from dybqs1.prod.google.com ([2002:a05:7301:6501:b0:311:50ef:5b3a]) (user=mrungta job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:228a:b0:2cf:9347:f445 with SMTP id d9443c01a7336-2d74ddc705cmr171196165ad.10.1787965228149; Fri, 28 Aug 2026 18:00:28 -0700 (PDT) Date: Fri, 28 Aug 2026 17:59:58 -0700 In-Reply-To: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> X-Developer-Key: i=mrungta@google.com; a=ed25519; pk=2Bjwbv/ibL10QnyvK9G7DoKpffXy7z6+M4NawEYgYDI= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787965218; l=4776; i=mrungta@google.com; s=20260212; h=from:subject:message-id; bh=VRMP7JkkrsgtGCqNZ8apRQnntFni3AQp0Jl77stRJ70=; b=CQZHeEJJRpzMeZ+Luy30tTlvb62nDg6Gs9sbPGqt+ftDk3VVsUC5Aylz4w4wA7a6YMiEL7Nja 3ybUFt+GL+rCXWFMnkIgUGWRattx0hVGNakUrC6EVg1JO6A8CIPtMN6 X-Mailer: b4 0.14.3 Message-ID: <20260828-qcom-wdt-nmi-series-v2-4-363979fe6b6b@google.com> Subject: [PATCH v2 4/5] watchdog: pretimeout: Protect governor access with RCU for NMI safety From: Mayank Rungta To: Wim Van Sebroeck , Guenter Roeck , Thomas Gleixner , Radu Rendec Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, "Kirill A. Shutemov" , Douglas Anderson , Mayank Rungta Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When watchdog pretimeout interrupts are configured as NMIs (or pseudo-NMIs), pretimeout handlers execute in NMI context. Accessing the watchdog governor via spinlocks in watchdog_notify_pretimeout() is unsafe in NMI context and can cause deadlocks if an NMI arrives while a spinlock is held. Protect governor assignment and dereference with RCU instead of spinlocks, allowing lockless, NMI-safe governor notifications while preserving safe runtime governor switching. Assisted-by: Antigravity:gemini Signed-off-by: Mayank Rungta Reviewed-by: Douglas Anderson --- drivers/watchdog/watchdog_pretimeout.c | 45 +++++++++++++++++++-----------= ---- include/linux/watchdog.h | 2 +- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/drivers/watchdog/watchdog_pretimeout.c b/drivers/watchdog/watc= hdog_pretimeout.c index 02e09b9e396d..7fb586c77403 100644 --- a/drivers/watchdog/watchdog_pretimeout.c +++ b/drivers/watchdog/watchdog_pretimeout.c @@ -4,6 +4,7 @@ */ =20 #include +#include #include #include #include @@ -67,12 +68,14 @@ int watchdog_pretimeout_available_governors_get(char *b= uf) =20 int watchdog_pretimeout_governor_get(struct watchdog_device *wdd, char *bu= f) { + const struct watchdog_governor *gov; int count =3D 0; =20 - spin_lock_irq(&pretimeout_lock); - if (wdd->gov) - count =3D sysfs_emit(buf, "%s\n", wdd->gov->name); - spin_unlock_irq(&pretimeout_lock); + rcu_read_lock(); + gov =3D rcu_dereference(wdd->gov); + if (gov) + count =3D sysfs_emit(buf, "%s\n", gov->name); + rcu_read_unlock(); =20 return count; } @@ -91,7 +94,7 @@ int watchdog_pretimeout_governor_set(struct watchdog_devi= ce *wdd, } =20 spin_lock_irq(&pretimeout_lock); - wdd->gov =3D priv->gov; + rcu_assign_pointer(wdd->gov, priv->gov); spin_unlock_irq(&pretimeout_lock); =20 mutex_unlock(&governor_lock); @@ -101,16 +104,13 @@ int watchdog_pretimeout_governor_set(struct watchdog_= device *wdd, =20 void watchdog_notify_pretimeout(struct watchdog_device *wdd) { - unsigned long flags; + const struct watchdog_governor *gov; =20 - spin_lock_irqsave(&pretimeout_lock, flags); - if (!wdd->gov) { - spin_unlock_irqrestore(&pretimeout_lock, flags); - return; - } - - wdd->gov->pretimeout(wdd); - spin_unlock_irqrestore(&pretimeout_lock, flags); + rcu_read_lock(); + gov =3D rcu_dereference(wdd->gov); + if (gov) + gov->pretimeout(wdd); + rcu_read_unlock(); } EXPORT_SYMBOL_GPL(watchdog_notify_pretimeout); =20 @@ -140,8 +140,8 @@ int watchdog_register_governor(struct watchdog_governor= *gov) default_gov =3D gov; =20 list_for_each_entry(p, &pretimeout_list, entry) - if (!p->wdd->gov) - p->wdd->gov =3D default_gov; + if (!rcu_access_pointer(p->wdd->gov)) + rcu_assign_pointer(p->wdd->gov, default_gov); spin_unlock_irq(&pretimeout_lock); } =20 @@ -170,11 +170,14 @@ void watchdog_unregister_governor(struct watchdog_gov= ernor *gov) if (default_gov =3D=3D gov) default_gov =3D NULL; list_for_each_entry(p, &pretimeout_list, entry) - if (p->wdd->gov =3D=3D gov) - p->wdd->gov =3D default_gov; + if (rcu_dereference_protected(p->wdd->gov, + lockdep_is_held(&pretimeout_lock)) =3D=3D gov) + rcu_assign_pointer(p->wdd->gov, default_gov); spin_unlock_irq(&pretimeout_lock); =20 mutex_unlock(&governor_lock); + + synchronize_rcu(); } EXPORT_SYMBOL(watchdog_unregister_governor); =20 @@ -192,7 +195,7 @@ int watchdog_register_pretimeout(struct watchdog_device= *wdd) spin_lock_irq(&pretimeout_lock); list_add(&p->entry, &pretimeout_list); p->wdd =3D wdd; - wdd->gov =3D default_gov; + rcu_assign_pointer(wdd->gov, default_gov); spin_unlock_irq(&pretimeout_lock); =20 return 0; @@ -206,7 +209,7 @@ void watchdog_unregister_pretimeout(struct watchdog_dev= ice *wdd) return; =20 spin_lock_irq(&pretimeout_lock); - wdd->gov =3D NULL; + rcu_assign_pointer(wdd->gov, NULL); =20 list_for_each_entry_safe(p, t, &pretimeout_list, entry) { if (p->wdd =3D=3D wdd) { @@ -216,4 +219,6 @@ void watchdog_unregister_pretimeout(struct watchdog_dev= ice *wdd) } } spin_unlock_irq(&pretimeout_lock); + + synchronize_rcu(); } diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 29cd03686154..5a3c35968cc8 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -105,7 +105,7 @@ struct watchdog_device { const struct attribute_group **groups; const struct watchdog_info *info; const struct watchdog_ops *ops; - const struct watchdog_governor *gov; + const struct watchdog_governor __rcu *gov; unsigned int bootstatus; unsigned int timeout; unsigned int pretimeout; --=20 2.55.0.897.gb25b4bd76c-goog From nobody Sat Sep 26 22:02:17 2026 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C64B3A59A3 for ; Sat, 29 Aug 2026 01:00:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.70 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965233; cv=none; b=XWdaZhrxY2smZKrol4v37Wf4RLJrVlvvgwDjaMPFDQc0WIPSqQ0AVdCTIrWgaNaLjsFEgSNY0NURClqYv/GITSO1Tj0bqbPIcvF6600wrwutFPbYtNALzlncIK/54tSWGjSBb5lvSacbf/Wne+sS+it73otRO/dewUUUeYfumDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787965233; c=relaxed/simple; bh=AdywQK2vtYiSsYhi6sIq4NfA3XpXoE4VXMIiQOI8gj4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=efwCPYkLF0tStS0OLrZtGVZUk7HVzaDdnVN+D+ePufqZo9hgMnPu9d6toLBBODi1V3IUaBIHhDTuJYtlS9+M4tGZ8b1DNZY79fsVEsNKtOpe0Dhtan+6Rkf7GIajPgQ5RIyYMu8iwf4Sf6i3CbfDICfGsP0t/E3LJgU8lN8upec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=HAHX1gHA; arc=none smtp.client-ip=209.85.216.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--mrungta.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="HAHX1gHA" Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-381250979d5so2024324a91.0 for ; Fri, 28 Aug 2026 18:00:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20251104; t=1787965231; x=1788570031; darn=vger.kernel.org; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:from:to:cc:subject:date:message-id:reply-to :content-type; bh=MDHpM2Mouytn9B02GRyIXBlE0tDWaaixXQnYQVljoqg=; b=HAHX1gHAsfjoiMzvMQudbX4+Se/YwgEMbpyQl7eDfVvw6msEnw6PF1abOJUk71587U mQhmJK7bHwZl/6hSlBkUrMT9Ftfzi9R1inUx2oPMFyUZITV637oK1cWEGuv+TxiROszn kKmgUkT5cf+8UTUdfmsrHg4JWjy168E/gm2OCvNU8iPOLkT0F99EbFnfEzr23TzlqD7r hlgMGIcPWJYUIkkxXfmpfl8oTvrvvZnwf3B0qzF64lenwof/JDnQXK1r6TWRaheHimPD G8ZnDkWDp/WpHv72IwZWokffLrE5vZWXEAzcyl0W8a9X1LrWjRZN+GLJcF4eFyGNGQkZ wyzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787965231; x=1788570031; h=content-type:cc:to:from:subject:message-id:references:mime-version :in-reply-to:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=MDHpM2Mouytn9B02GRyIXBlE0tDWaaixXQnYQVljoqg=; b=hj2QZi/aS5nGaHcCq43zmLpnoYd+S4eJTSG46nm5eIntyRylXI/IBLWZk0Z4Gu/W4W LFHHkaLebgCzZVHhwE2SRdID8uL9JZAJ2GBYQmJ0FtWlBNyi3ffAyHbsKOexewScSi/M /VBF76kw1KGoCN2r3Gh3rTyIWViiVPb8W887fo6n6jrXK9lBHu+BUfxa79Nhm0W3fBIT QE76W5RgJrlf8Zg/Up+p2UyxTJbS1c9EIl9C7vxwkml6sp95PC55zvRBElHRJ+kBgkJq meC/m4MwYb6+Gxdvnld90kQCJD/1OWdepLDP8d/IL8Crmo+PG8shpaeMULVeY6TD5az8 lsxA== X-Forwarded-Encrypted: i=1; AKwUvBxteVpo4TkdeDD5E0IvLXaYkIMoJFlzNVqTK6Gcl89f3ebJg4oGxWKf5NaWlIOYaM6t+UR1wBshd6CQq5M=@vger.kernel.org X-Gm-Message-State: AFuF++mug2OWMfft3ySL7dcS61l0yKvfL97YM55HNwISK3xVmgk/TqAP fkQVIcjQaks8TlL24OV/TMOO2fwgcmLlLSYYi+XJFMZ3abb2GZMi8qai1N5coB7tAjCVvQgg56D bBmu+YcwLtg== X-Received: from dybcu36.prod.google.com ([2002:a05:7300:ad24:b0:327:dccf:72c8]) (user=mrungta job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:3e43:b0:37f:fd1f:d30f with SMTP id 98e67ed59e1d1-396d0f67646mr20132797a91.12.1787965230440; Fri, 28 Aug 2026 18:00:30 -0700 (PDT) Date: Fri, 28 Aug 2026 17:59:59 -0700 In-Reply-To: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20260828-qcom-wdt-nmi-series-v2-0-363979fe6b6b@google.com> X-Developer-Key: i=mrungta@google.com; a=ed25519; pk=2Bjwbv/ibL10QnyvK9G7DoKpffXy7z6+M4NawEYgYDI= X-Developer-Signature: v=1; a=ed25519-sha256; t=1787965218; l=3708; i=mrungta@google.com; s=20260212; h=from:subject:message-id; bh=AdywQK2vtYiSsYhi6sIq4NfA3XpXoE4VXMIiQOI8gj4=; b=kxYNMe8TIaM84CWHv8NQ/UaaZjYbEr5I+gGXw5xbYW95jwNEn3HR03JRZYZYYTFOMdblLLspb aMj71QLA8ZeAc/oA4IK9jOf3TD9fsjxJeyd2tYbIfiLIXbBs045csQF X-Mailer: b4 0.14.3 Message-ID: <20260828-qcom-wdt-nmi-series-v2-5-363979fe6b6b@google.com> Subject: [PATCH v2 5/5] watchdog: qcom: Register pretimeout interrupt as NMI From: Mayank Rungta To: Wim Van Sebroeck , Guenter Roeck , Thomas Gleixner , Radu Rendec Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, "Kirill A. Shutemov" , Douglas Anderson , Mayank Rungta Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable When a system is completely unresponsive due to an interrupt storm or deadlocked CPU cores with standard interrupts disabled, a standard watchdog pretimeout bark interrupt will fail to execute, preventing the pretimeout governor from capturing CPU backtraces before the hardware reset bite. Attempt to request the Qualcomm watchdog pretimeout bark interrupt as an NMI (or pseudo-NMI) using request_nmi(). If NMI registration is not supported on the platform (e.g. pseudo-NMIs are disabled), gracefully fall back to a standard interrupt via devm_request_irq(). When NMI is used, register a devres cleanup action to free the NMI upon driver unbind, and use enable_nmi() and disable_nmi() during start and stop. Assisted-by: Antigravity:gemini Signed-off-by: Mayank Rungta --- drivers/watchdog/qcom-wdt.c | 52 +++++++++++++++++++++++++++++++++++++++++= ---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c index 4eb1bf979012..82eaf8786426 100644 --- a/drivers/watchdog/qcom-wdt.c +++ b/drivers/watchdog/qcom-wdt.c @@ -52,6 +52,8 @@ struct qcom_wdt { unsigned long rate; void __iomem *base; const u32 *layout; + int irq; + bool is_nmi; }; =20 static void __iomem *wdt_addr(struct qcom_wdt *wdt, enum wdt_reg reg) @@ -74,6 +76,28 @@ static irqreturn_t qcom_wdt_isr(int irq, void *arg) return IRQ_HANDLED; } =20 +static void qcom_wdt_enable_irq(struct qcom_wdt *wdt) +{ + if (wdt->is_nmi && wdt->irq > 0) + enable_nmi(wdt->irq); +} + +static void qcom_wdt_disable_irq(struct qcom_wdt *wdt) +{ + if (wdt->is_nmi && wdt->irq > 0) + disable_nmi(wdt->irq); +} + +static void qcom_wdt_free_nmi(void *arg) +{ + struct qcom_wdt *wdt =3D arg; + + if (watchdog_active(&wdt->wdd)) + qcom_wdt_disable_irq(wdt); + + free_nmi(wdt->irq, &wdt->wdd); +} + static int qcom_wdt_start(struct watchdog_device *wdd) { struct qcom_wdt *wdt =3D to_qcom_wdt(wdd); @@ -84,6 +108,8 @@ static int qcom_wdt_start(struct watchdog_device *wdd) writel(bark * wdt->rate, wdt_addr(wdt, WDT_BARK_TIME)); writel(wdd->timeout * wdt->rate, wdt_addr(wdt, WDT_BITE_TIME)); writel(QCOM_WDT_ENABLE, wdt_addr(wdt, WDT_EN)); + + qcom_wdt_enable_irq(wdt); return 0; } =20 @@ -91,6 +117,8 @@ static int qcom_wdt_stop(struct watchdog_device *wdd) { struct qcom_wdt *wdt =3D to_qcom_wdt(wdd); =20 + qcom_wdt_disable_irq(wdt); + writel(0, wdt_addr(wdt, WDT_EN)); return 0; } @@ -256,6 +284,7 @@ static int qcom_wdt_probe(struct platform_device *pdev) u32 percpu_offset; int irq, ret; struct clk *clk; + unsigned long irq_flags; =20 data =3D of_device_get_match_data(dev); if (!data) { @@ -311,10 +340,25 @@ static int qcom_wdt_probe(struct platform_device *pde= v) if (irq < 0 && irq !=3D -ENXIO) return irq; if (irq > 0) { - ret =3D devm_request_irq(dev, irq, qcom_wdt_isr, 0, - "wdt_bark", &wdt->wdd); - if (ret) - return ret; + wdt->irq =3D irq; + irq_flags =3D IRQF_PERCPU | IRQF_NOBALANCING | + IRQF_NO_AUTOEN | IRQF_NO_THREAD; + + ret =3D request_nmi(irq, qcom_wdt_isr, irq_flags, + "wdt_bark", &wdt->wdd); + if (ret) { + /* Fallback to normal interrupt if NMI not supported */ + ret =3D devm_request_irq(dev, irq, qcom_wdt_isr, 0, + "wdt_bark", &wdt->wdd); + if (ret) + return ret; + } else { + wdt->is_nmi =3D true; + ret =3D devm_add_action_or_reset(dev, qcom_wdt_free_nmi, + wdt); + if (ret) + return ret; + } =20 wdt->wdd.info =3D &qcom_wdt_pt_info; wdt->wdd.pretimeout =3D 1; --=20 2.55.0.897.gb25b4bd76c-goog