{
  "affected": [
    {
      "ecosystem_specific": {
        "urgency": "not yet assigned"
      },
      "package": {
        "ecosystem": "Debian:14",
        "name": "linux"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "details": "In the Linux kernel, the following vulnerability has been resolved:  sched/core: Call wakeup_preempt() for queued tasks during class change  Paul reported recent RCU changes exposed a lost resched where CPU idles with a rcutorture thread waiting while being completely runnable.  Dumping the rq state at the time of idling with runnable tasks showed the following:    rq-\u003enext_class = \u0026fair_sched_class   rq-\u003enr_running = 1   rq-\u003ecfs.h_nr_queued = 0   rq-\u003ert.rt_nr_running = 1  Although the waiting task was an RT task, \"rq-\u003enext_class\" did not point to rt_sched_class and was stuck at the lower priority fair_sched_class.  Inspecting sched_change_end() revealed the following race with __sched_setscheduler() for queued, but non-running tasks:      CPU0                                   CPU1     ====                                   ====    __schedule()      /*      * rq-\u003edonor is a fair task that blocks.      * rq-\u003enext_class = \u0026fair_sched_class      */      rq_lock(rq0)      pick_next_task()       /* nr_running = 0 */       pick_task_fair()         sched_balance_newidle()           raw_spin_rq_unlock(rq0)                                     rq_lock(rq0)                                      activate_task(rq0, p)                                       /* p is a fair task */                                       rq0-\u003enr_running++;                                       rq0-\u003ecfs.h_nr_queued++;                                       wakeup_preempt(rq, p)                                         rq-\u003enext_class = \u0026fair_sched_class                                         resched_curr()                                      rq_unlock(rq0)                                      __sched_setscheduler(p)                                       /* p is moved to SCHED_RR */                                       task_rq_lock(p)                                       sched_change_begin()  \t\t\t\t      rq0-\u003ecfs.h_nr_queued--; \t\t\t\t      rq0-\u003ert.rt_nr_running++;                                        sched_change_end()                                         /*                                          * p-\u003eon_rq = 1 (ctx-\u003equeued)                                          * but p is not rq-\u003edonor                                          * (!ctx-\u003erunning) hence                                          * resched_curr() is and                                          * rq-\u003enext_class upgrade is                                          * skipped.                                          */                                         task_rq_unlock()            raw_spin_rq_lock(rq0)            /*            * rq-\u003enr_running = 1            * rq-\u003ecfs.h_nr_queued = 0            * rq-\u003ert.rt_nr_running = 1            * rq-\u003enext_class = \u0026fair_sched_class            */             if (rq-\u003ecfs.h_nr_queued \u0026\u0026 ...)              /* Above is false */             if (rq_modified_above(this_rq, \u0026fair_sched_class))              /* Also false since rq-\u003enext_class is still fair */        /*        * sched_balance_newidle() is considered to        * have failed to pull any fair tasks and no        * other wakeups were detected.        */        return NULL; /* pick_task_fair() */      pick_task_idle()       return rq-\u003eidle;      next = rq-\u003eidle;      /* Preemption indicators are lost */     clear_tsk_need_resched(prev);     clear_preempt_need_resched();      rq-\u003ecurr = rq-\u003eidle;    !!! rq-\u003eidle switches in with rq-\u003erunning == 1 but !need_resched() !!!  In simple words, enqueue, followed by a class change of the newly queued task goes unnoticed in rq-\u003enext_class indicator and sched_balance_newidle() sees no fair task, nor any higher priority task enqueued.  The above sequence will lead to CPU idling with a runnable task on the CPU.  Call wakeup_preempt() for ctx-\u003equeued cases in sched_change_end() to re-evaluate rq-\u003enext_class after class change (ENQUEUE_CLASS) and set the NEED_RESCHED indicator accordingly.  Newidle balance will correctly see an enqueue of a higher priority t ---truncated---",
  "id": "DEBIAN-CVE-2026-99205",
  "modified": "2026-10-29T05:47:22.159231244Z",
  "published": "2026-10-28T11:17:41.773Z",
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://security-tracker.debian.org/tracker/CVE-2026-99205"
    }
  ],
  "upstream": [
    "CVE-2026-99205"
  ]
}