Description
In the Linux kernel, the following vulnerability has been resolved:

writeback: report a Tasks-RCU quiescent state per cgwb drain pass

cleanup_offline_cgwbs_workfn() drains a dying cgwb by calling
cleanup_offline_cgwb() until it returns false, with a cond_resched()
between passes. On a CONFIG_PREEMPTION kernel that cond_resched() does
nothing: _cond_resched() is a plain "return 0", and under PREEMPT_DYNAMIC
the full and lazy modes disable it. Since commit 7dadeaa6e851 ("sched:
Further restrict the preemption modes") those are the only two models on
the architectures with PREEMPT_LAZY support, arm64 and x86 among them, so
the drain loop never reports a Tasks-RCU quiescent state.

A worker draining a cgwb with millions of attached inodes runs for
minutes. On a 6.18 arm64 host in lazy mode the cgwb worker drained one
dying cgroup's writeback domain for over 11 minutes. A BPF program unlink
(bpf_trampoline_unlink_prog -> bpf_trampoline_update ->
unregister_ftrace_direct -> ftrace_shutdown -> synchronize_rcu_tasks())
waited on that grace period while holding the trampoline mutex, 42 tasks
queued behind it in D state, and the hung task detector fired at 614 s and
panicked the host. Any BPF or ftrace detach during a long drain inherits
the drain's length.

Fix this by calling cond_resched_tasks_rcu_qs() so we do not stall out
anybody who calls sycnrhonize_rcu_tasks(). We put this in a do { } while
loop because if we have many small cgroups cleanup_offline_cgwb() will
return false and we will never call cond_resched_tasks_rcu_qs(), creating
the same problem.
Published: 2026-10-18
Score: n/a
EPSS: n/a
KEV: No
Impact: Denial of Service
Action: Immediate Patch
AI Analysis

Impact

In the Linux kernel, the bug prevents RCU tasks from seeing a quiescent state during a writeback cgroup drain. A draining writeback worker can run for minutes, and while it holds the trampoline mutex, any BPF unlink or ftrace detach that calls synchronize_rcu_tasks() waits for the drain to finish. Because the drain loop never reports a quiescent state, synchronize_rcu_tasks() blocks indefinitely, which can trigger a hung task detector and cause a kernel panic. The flaw enables a denial‑of‑service condition that can be triggered by any process capable of initiating a lengthy writeback drain or detaching BPF/ftrace programs while the kernel is in PREEMPT_LAZY mode.

Affected Systems

Linux kernels on architectures that support PREEMPT_LAZY, such as arm64 and x86, are affected when CONFIG_PREEMPTION is enabled. The issue manifests in kernel versions where the preemption restriction commit is present, and the kernel drainer does not call cond_resched_tasks_rcu_qs(). The problem is tied to long‑running writeback drains on cgroups and becomes visible when BPF or ftrace detach operations are performed concurrently. No specific kernel release numbers are provided, but the example in the advisory shows the issue on kernel 6.18 arm64.

Risk and Exploitability

The vulnerability has a high potential impact because it can halt the entire system by causing a kernel panic after a prolonged writeback drain. Exploitation requires local access or the ability to trigger a long writeback drain and perform a BPF unlink or ftrace detach, which is feasible for privileged users or applications that use these features. The EPSS score is not available, and the vulnerability is not listed in CISA's KEV catalog, but the severity of an induced panic makes the risk substantial. Affected systems should treat this as a high‑risk issue and apply the fix promptly.

Generated by OpenCVE AI on October 18, 2026 at 23:18 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the kernel patch that routes the drain loop through cond_resched_tasks_rcu_qs (the commit referenced in the advisory).
  • If patching is not possible, avoid detaching BPF or ftrace programs while a writeback drain is in progress, or temporarily disable those features until the drain completes.
  • Consider configuring the kernel to use the full preemption model instead of lazy, which forces cond_resched to perform rescheduling and thus allows the drain to report quiescent states.
  • Monitor kernel logs for RCU sync hang or hung task detector messages, and reboot if such a hang is detected.

Generated by OpenCVE AI on October 18, 2026 at 23:18 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Sun, 18 Oct 2026 23:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-106

Sun, 18 Oct 2026 15:30:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: writeback: report a Tasks-RCU quiescent state per cgwb drain pass cleanup_offline_cgwbs_workfn() drains a dying cgwb by calling cleanup_offline_cgwb() until it returns false, with a cond_resched() between passes. On a CONFIG_PREEMPTION kernel that cond_resched() does nothing: _cond_resched() is a plain "return 0", and under PREEMPT_DYNAMIC the full and lazy modes disable it. Since commit 7dadeaa6e851 ("sched: Further restrict the preemption modes") those are the only two models on the architectures with PREEMPT_LAZY support, arm64 and x86 among them, so the drain loop never reports a Tasks-RCU quiescent state. A worker draining a cgwb with millions of attached inodes runs for minutes. On a 6.18 arm64 host in lazy mode the cgwb worker drained one dying cgroup's writeback domain for over 11 minutes. A BPF program unlink (bpf_trampoline_unlink_prog -> bpf_trampoline_update -> unregister_ftrace_direct -> ftrace_shutdown -> synchronize_rcu_tasks()) waited on that grace period while holding the trampoline mutex, 42 tasks queued behind it in D state, and the hung task detector fired at 614 s and panicked the host. Any BPF or ftrace detach during a long drain inherits the drain's length. Fix this by calling cond_resched_tasks_rcu_qs() so we do not stall out anybody who calls sycnrhonize_rcu_tasks(). We put this in a do { } while loop because if we have many small cgroups cleanup_offline_cgwb() will return false and we will never call cond_resched_tasks_rcu_qs(), creating the same problem.
Title writeback: report a Tasks-RCU quiescent state per cgwb drain pass
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-18T15:18:04.013Z

Reserved: 2026-09-25T10:25:14.355Z

Link: CVE-2026-98536

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-18T16:17:05.357

Modified: 2026-10-18T16:17:05.357

Link: CVE-2026-98536

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-18T23:30:14Z

Weaknesses
  • CWE-106

    Struts: Plug-in Framework not in Use