mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [RFC PATCH v2 0/9] rv: Verify generic IRQ context transitions
@ 2026-11-07 17:12 Karl Mehltretter
  2026-11-07 17:12 ` [RFC PATCH v2 1/9] tracing/irq: Add generic IRQ context boundary tracepoints Karl Mehltretter
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Karl Mehltretter @ 2026-11-07 17:12 UTC (permalink / raw)
  To: Steven Rostedt, Gabriele Monaco
  Cc: Karl Mehltretter, Masami Hiramatsu, Mathieu Desnoyers,
	Thomas Gleixner, Sebastian Andrzej Siewior, Clark Williams,
	Ingo Molnar, Peter Zijlstra, Andy Lutomirski, Juri Lelli,
	Vincent Guittot, Dietmar Eggemann, Ben Segall, Mel Gorman,
	Valentin Schneider, K Prateek Nayak, Jonathan Corbet, Shuah Khan,
	Randy Dunlap, Wen Yang, linux-trace-kernel, linux-rt-devel,
	linux-doc, linux-kernel

IRQ action tracepoints describe handlers, but not the lifetime of the
enclosing IRQ context. One context may run several actions, and an action
may be dispatched outside hardirq context. PREEMPT_RT may also enter
serving-softirq state without invoking an action. This leaves no generic
event stream from which an RV monitor can check IRQ-context transitions.

This RFC adds tracepoints at the generic hardirq and serving-softirq
boundaries. The irq:irqstate RV monitor checks their order and agreement
with live kernel state. irq:irqexit follows the owner of a
preempt_schedule_irq() invocation across task switches and CPU migration.

The hardirq tracepoints cover paths through irq_enter() or
irq_enter_rcu() and their matching exits. They do not cover direct
__irq_enter() and __irq_exit() users, raw paths, or architecture-specific
entry and return intervals. irqexit covers preempt_schedule_irq(), not
the complete interrupt-return path.

Boundary callbacks can raise softirq work after the pending-work check.
The series wakes ksoftirqd or ktimerd for remaining work. KUnit covers
nesting, monitor synchronization, PREEMPT_RT worker intervals, provenance
and late-work handoff.

Gabriele answered two of the v1 questions [1]:

  - The boundaries are now bare DECLARE_TRACE() tracepoints like the
    existing RV hooks in include/trace/events/sched.h, so they add no
    tracefs ABI.
  - irqstate and irqexit stay separate automata because one is per-CPU
    and the other per-task. A hardirq or non-RT softirq belongs to the
    CPU it interrupts. A preempt_schedule_irq() invocation belongs to
    the interrupted task, several tasks can be inside one at the same
    time, and it can migrate before it returns. Each RV automaton has a
    single monitor type. Both now sit under an irq container, so they
    are enabled together by default, and the irqentry/irqexit naming
    clash is gone.

Questions still open from v1:

  1. Are dedicated scheduler tracepoints the right way to follow
     preempt_schedule_irq() across task switches and migration?
  2. Is the KUnit-only hook for an empty ksoftirqd invocation
     acceptable? Outside a KUnit run, its worker checks take a disabled
     static-key path.

Patches 1-5 add the tracepoints, monitors and documentation. Patches 6-9
add KUnit coverage.

The series is based on v7.4-rc1, which contains the v1 prerequisite and
Wen Yang's reactor lockdep fix:

  commit feb5c9a2447a ("softirq: Preserve interrupt context on return from interrupt")
  commit 39ccedfd9e55 ("rv: Use LD_WAIT_SPIN as the reactor lockdep wait type")

The series is independent of the early-hardirq series [2], which
installs hardirq state before entry tracing. Both change
kernel/softirq.c, so applying one on top of the other needs a small
conflict resolution in __irq_exit_rcu().

Changes since v1:

  - Use bare DECLARE_TRACE() tracepoints instead of trace events
    (Gabriele)
  - Rename the irqentry container to irq (Gabriele)
  - Add text schematics of both models to the documentation (Gabriele)
  - Document why irqstate and irqexit are separate automata
  - Rebase onto v7.4-rc1

Testing on v7.4-rc1 with Clang 23.1.5, GCC 14.2 (x86) and GCC 16.2
(cross), and QEMU 10.0 TCG, with lockdep and the locking selftests:

  - Each patch builds with W=1 on x86_64 without new warnings.
    RV_MONITORS_KUNIT_TEST=m builds on x86_64 and arm64. kernel-doc
    reports no warnings for the changed headers.
  - The rv_mon KUnit suite and the reactor suites passed without
    failures on:

      x86_64   PREEMPT SMP4 and UP, PREEMPT with nohz_full=1-3 and
               threadirqs, PREEMPT_RT SMP4, PREEMPT_RT SMP8 with
               nohz_full=1-3
      arm64    PREEMPT, PREEMPT with nohz_full=1-3 and threadirqs,
               PREEMPT_RT, PREEMPT_RT SMP8 with nohz_full=1-3
      riscv64  PREEMPT
      ARMv7    UP

    Each configuration ran 13 to 21 of the 29 rv_mon cases. The others
    are skipped because they need a different configuration.
  - RV=n kernels boot on x86_64 and arm64.
  - On top of the early-hardirq series, the same suites passed on
    x86_64 (PREEMPT, PREEMPT_RT), arm64 (PREEMPT, PREEMPT_RT) and
    riscv64.

An LLM assisted with the patches and the testing.

v1: https://lore.kernel.org/all/20261022050712.75035-1-kmehltretter@gmail.com/

[1] https://lore.kernel.org/all/FACA54EC-F846-4051-9ADD-DB46E7665FAD@redhat.com/
[2] https://lore.kernel.org/all/20261028033127.82193-1-kmehltretter@gmail.com/

Karl Mehltretter (9):
  tracing/irq: Add generic IRQ context boundary tracepoints
  tracing/sched: Add IRQ preemption lifecycle tracepoints
  rv: Add a monitor for generic IRQ context transitions
  rv: Add a monitor for IRQ-exit scheduling ownership
  docs/rv: Document the IRQ monitors
  rv: Add KUnit coverage for IRQ context transitions
  rv: Add KUnit coverage for IRQ-exit scheduling
  rv: Test empty PREEMPT_RT softirq worker intervals
  rv: Test IRQ-exit softirq provenance and handoff

 Documentation/trace/rv/index.rst              |    1 +
 Documentation/trace/rv/monitor_irq.rst        |  475 ++++
 include/linux/interrupt.h                     |    8 +
 include/rv/kunit.h                            |   34 +-
 include/trace/events/irq.h                    |   56 +
 include/trace/events/sched.h                  |   26 +
 kernel/sched/core.c                           |    6 +
 kernel/softirq.c                              |  324 ++-
 kernel/trace/rv/Kconfig                       |   11 +-
 kernel/trace/rv/Makefile                      |    3 +
 kernel/trace/rv/monitors/irq/Kconfig          |   13 +
 kernel/trace/rv/monitors/irq/irq.c            |   35 +
 kernel/trace/rv/monitors/irq/irq.h            |    3 +
 kernel/trace/rv/monitors/irqexit/Kconfig      |   14 +
 kernel/trace/rv/monitors/irqexit/irqexit.c    |  172 ++
 kernel/trace/rv/monitors/irqexit/irqexit.h    |   85 +
 .../trace/rv/monitors/irqexit/irqexit_kunit.c |  540 ++++
 .../trace/rv/monitors/irqexit/irqexit_kunit.h |   21 +
 .../trace/rv/monitors/irqexit/irqexit_trace.h |   19 +
 kernel/trace/rv/monitors/irqstate/Kconfig     |   14 +
 kernel/trace/rv/monitors/irqstate/irqstate.c  |  289 ++
 kernel/trace/rv/monitors/irqstate/irqstate.h  |  139 +
 .../rv/monitors/irqstate/irqstate_kunit.c     | 2339 +++++++++++++++++
 .../rv/monitors/irqstate/irqstate_kunit.h     |   25 +
 .../rv/monitors/irqstate/irqstate_trace.h     |   15 +
 kernel/trace/rv/rv_monitors_test.c            |   30 +
 kernel/trace/rv/rv_trace.h                    |    2 +
 tools/verification/models/irq/irqexit.dot     |   21 +
 tools/verification/models/irq/irqstate.dot    |   32 +
 29 files changed, 4737 insertions(+), 15 deletions(-)
 create mode 100644 Documentation/trace/rv/monitor_irq.rst
 create mode 100644 kernel/trace/rv/monitors/irq/Kconfig
 create mode 100644 kernel/trace/rv/monitors/irq/irq.c
 create mode 100644 kernel/trace/rv/monitors/irq/irq.h
 create mode 100644 kernel/trace/rv/monitors/irqexit/Kconfig
 create mode 100644 kernel/trace/rv/monitors/irqexit/irqexit.c
 create mode 100644 kernel/trace/rv/monitors/irqexit/irqexit.h
 create mode 100644 kernel/trace/rv/monitors/irqexit/irqexit_kunit.c
 create mode 100644 kernel/trace/rv/monitors/irqexit/irqexit_kunit.h
 create mode 100644 kernel/trace/rv/monitors/irqexit/irqexit_trace.h
 create mode 100644 kernel/trace/rv/monitors/irqstate/Kconfig
 create mode 100644 kernel/trace/rv/monitors/irqstate/irqstate.c
 create mode 100644 kernel/trace/rv/monitors/irqstate/irqstate.h
 create mode 100644 kernel/trace/rv/monitors/irqstate/irqstate_kunit.c
 create mode 100644 kernel/trace/rv/monitors/irqstate/irqstate_kunit.h
 create mode 100644 kernel/trace/rv/monitors/irqstate/irqstate_trace.h
 create mode 100644 tools/verification/models/irq/irqexit.dot
 create mode 100644 tools/verification/models/irq/irqstate.dot


base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
-- 
2.39.5 (Apple Git-154)


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-11-07 17:13 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-07 17:12 [RFC PATCH v2 0/9] rv: Verify generic IRQ context transitions Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 1/9] tracing/irq: Add generic IRQ context boundary tracepoints Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 2/9] tracing/sched: Add IRQ preemption lifecycle tracepoints Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 3/9] rv: Add a monitor for generic IRQ context transitions Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 4/9] rv: Add a monitor for IRQ-exit scheduling ownership Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 5/9] docs/rv: Document the IRQ monitors Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 6/9] rv: Add KUnit coverage for IRQ context transitions Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 7/9] rv: Add KUnit coverage for IRQ-exit scheduling Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 8/9] rv: Test empty PREEMPT_RT softirq worker intervals Karl Mehltretter
2026-11-07 17:12 ` [RFC PATCH v2 9/9] rv: Test IRQ-exit softirq provenance and handoff Karl Mehltretter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®