{"id":41008,"date":"2026-10-19T00:31:48","date_gmt":"2026-10-18T16:31:48","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98536"},"modified":"2026-10-19T00:31:48","modified_gmt":"2026-10-18T16:31:48","slug":"cve-2026-98536","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98536","title":{"rendered":"CVE-2026-98536 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nwriteback: report a T"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>writeback: report a Tasks-RCU quiescent state per cgwb drain pass<\/p>\n<p>cleanup_offline_cgwbs_workfn() drains a dying cgwb by calling<br \/>\ncleanup_offline_cgwb() until it returns false, with a cond_resched()<br \/>\nbetween passes.  On a CONFIG_PREEMPTION kernel that cond_resched() does<br \/>\nnothing: _cond_resched() is a plain &#8220;return 0&#8221;, and under PREEMPT_DYNAMIC<br \/>\nthe full and lazy modes disable it.  Since commit 7dadeaa6e851 (&#8220;sched:<br \/>\nFurther restrict the preemption modes&#8221;) those are the only two models on<br \/>\nthe architectures with PREEMPT_LAZY support, arm64 and x86 among them, so<br \/>\nthe drain loop never reports a Tasks-RCU quiescent state.<\/p>\n<p>A worker draining a cgwb with millions of attached inodes runs for<br \/>\nminutes.  On a 6.18 arm64 host in lazy mode the cgwb worker drained one<br \/>\ndying cgroup&#8217;s writeback domain for over 11 minutes.  A BPF program unlink<br \/>\n(bpf_trampoline_unlink_prog -&gt; bpf_trampoline_update -&gt;<br \/>\nunregister_ftrace_direct -&gt; ftrace_shutdown -&gt; synchronize_rcu_tasks())<br \/>\nwaited on that grace period while holding the trampoline mutex, 42 tasks<br \/>\nqueued behind it in D state, and the hung task detector fired at 614 s and<br \/>\npanicked the host.  Any BPF or ftrace detach during a long drain inherits<br \/>\nthe drain&#8217;s length.<\/p>\n<p>Fix this by calling cond_resched_tasks_rcu_qs() so we do not stall out<br \/>\nanybody who calls sycnrhonize_rcu_tasks().  We put this in a do { } while<br \/>\nloop because if we have many small cgroups cleanup_offline_cgwb() will<br \/>\nreturn false and we will never call cond_resched_tasks_rcu_qs(), creating<br \/>\nthe same problem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>writeback: report a Tasks-RCU quiescent state per cgwb drain pass<\/p>\n<p>cleanup_offline_cgwbs_workfn() drains a dying cgwb by calling<br \/>\ncl<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-41008","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/41008","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=41008"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=41008"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=41008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}