<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Sun, 04 Oct 2026 09:30:45 +0000</lastBuildDate>
    <item>
      <title>CVE-2025-39744 — rcu: Fix rcu_read_unlock() deadloop due to IRQ work</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2025-39744</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;rcu: Fix rcu_read_unlock() deadloop due to IRQ work&lt;/p&gt;
&lt;p&gt;During rcu_read_unlock_special(), if this happens during irq_exit(), we
can lockup if an IPI is issued. This is because the IPI itself triggers
the irq_exit() path causing a recursive lock up.&lt;/p&gt;
&lt;p&gt;This is precisely what Xiongfeng found when invoking a BPF program on
the trace_tick_stop() tracepoint As shown in the trace below. Fix by
managing the irq_work state correctly.&lt;/p&gt;
&lt;p&gt;irq_exit()
  __irq_exit_rcu()
    /* in_hardirq() returns false after this */
    preempt_count_sub(HARDIRQ_OFFSET)
    tick_irq_exit()
      tick_nohz_irq_exit()
	    tick_nohz_stop_sched_tick()
	      trace_tick_stop()  /* a bpf prog is hooked on this trace point */
		   __bpf_trace_tick_stop()
		      bpf_trace_run2()
			    rcu_read_unlock_special()
                              /* will send a IPI to itself */
			      irq_work_queue_on(&amp;amp;rdp-&amp;gt;defer_qs_iw, rdp-&amp;gt;cpu);&lt;/p&gt;
&lt;p&gt;A simple reproducer can also be obtained by doing the following in
tick_irq_exit(). It will hang on boot without the patch:&lt;/p&gt;
&lt;p&gt;static inline void tick_irq_exit(void)
  {
 +	rcu_read_lock();
 +	WRITE_ONCE(current-&amp;gt;rcu_read_unlock_special.b.need_qs, true);
 +	rcu_read_unlock();
 +&lt;/p&gt;
&lt;p&gt;[neeraj: Apply Frederic&amp;#39;s suggested fix for PREEMPT_RT]&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;rcu: Fix rcu_read_unlock() deadloop due to IRQ work&lt;/p&gt;
&lt;p&gt;During rcu_read_unlock_special(), if this happens during irq_exit(), we
can lockup if an IPI is issued. This is because the IPI itself triggers
the irq_exit() path causing a recursive lock up.&lt;/p&gt;
&lt;p&gt;This is precisely what Xiongfeng found when invoking a BPF program on
the trace_tick_stop() tracepoint As shown in the trace below. Fix by
managing the irq_work state correctly.&lt;/p&gt;
&lt;p&gt;irq_exit()
  __irq_exit_rcu()
    /* in_hardirq() returns false after this */
    preempt_count_sub(HARDIRQ_OFFSET)
    tick_irq_exit()
      tick_nohz_irq_exit()
	    tick_nohz_stop_sched_tick()
	      trace_tick_stop()  /* a bpf prog is hooked on this trace point */
		   __bpf_trace_tick_stop()
		      bpf_trace_run2()
			    rcu_read_unlock_special()
                              /* will send a IPI to itself */
			      irq_work_queue_on(&amp;amp;rdp-&amp;gt;defer_qs_iw, rdp-&amp;gt;cpu);&lt;/p&gt;
&lt;p&gt;A simple reproducer can also be obtained by doing the following in
tick_irq_exit(). It will hang on boot without the patch:&lt;/p&gt;
&lt;p&gt;static inline void tick_irq_exit(void)
  {
 +	rcu_read_lock();
 +	WRITE_ONCE(current-&amp;gt;rcu_read_unlock_special.b.need_qs, true);
 +	rcu_read_unlock();
 +&lt;/p&gt;
&lt;p&gt;[neeraj: Apply Frederic&amp;#39;s suggested fix for PREEMPT_RT]&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2025-39744</guid>
    </item>
  </channel>
</rss>
