{"id":"CVE-2026-99205","revision":null,"records":[{"revision":"a6e6547c11784ddfb8790743da82878a","observedAt":"2026-10-28T11:27:43.363+00:00","statement":{"source":"cve-program","id":"CVE-2026-99205","aliases":[],"title":"sched/core: Call wakeup_preempt() for queued tasks during class change","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nsched/core: Call wakeup_preempt() for queued tasks during class change\n\nPaul reported recent RCU changes exposed a lost resched where CPU idles\nwith a rcutorture thread waiting while being completely runnable.\n\nDumping the rq state at the time of idling with runnable tasks showed\nthe following:\n\n  rq->next_class = &fair_sched_class\n  rq->nr_running = 1\n  rq->cfs.h_nr_queued = 0\n  rq->rt.rt_nr_running = 1\n\nAlthough the waiting task was an RT task, \"rq->next_class\" did not point\nto rt_sched_class and was stuck at the lower priority fair_sched_class.\n\nInspecting sched_change_end() revealed the following race with\n__sched_setscheduler() for queued, but non-running tasks:\n\n    CPU0                                   CPU1\n    ====                                   ====\n\n  __schedule()\n\n    /*\n     * rq->donor is a fair task that blocks.\n     * rq->next_class = &fair_sched_class\n     */\n\n    rq_lock(rq0)\n\n    pick_next_task()\n      /* nr_running = 0 */\n      pick_task_fair()\n        sched_balance_newidle()\n          raw_spin_rq_unlock(rq0)\n                                    rq_lock(rq0)\n\n                                    activate_task(rq0, p)\n                                      /* p is a fair task */\n                                      rq0->nr_running++;\n                                      rq0->cfs.h_nr_queued++;\n                                      wakeup_preempt(rq, p)\n                                        rq->next_class = &fair_sched_class\n                                        resched_curr()\n\n                                    rq_unlock(rq0)\n\n                                    __sched_setscheduler(p)\n                                      /* p is moved to SCHED_RR */\n                                      task_rq_lock(p)\n                                      sched_change_begin()\n\n\t\t\t\t      rq0->cfs.h_nr_queued--;\n\t\t\t\t      rq0->rt.rt_nr_running++;\n\n                                      sched_change_end()\n                                        /*\n                                         * p->on_rq = 1 (ctx->queued)\n                                         * but p is not rq->donor\n                                         * (!ctx->running) hence\n                                         * resched_curr() is and\n                                         * rq->next_class upgrade is\n                                         * skipped.\n                                         */\n\n                                       task_rq_unlock()\n\n          raw_spin_rq_lock(rq0)\n\n          /*\n           * rq->nr_running = 1\n           * rq->cfs.h_nr_queued = 0\n           * rq->rt.rt_nr_running = 1\n           * rq->next_class = &fair_sched_class\n           */\n\n           if (rq->cfs.h_nr_queued && ...)\n             /* Above is false */\n\n           if (rq_modified_above(this_rq, &fair_sched_class))\n             /* Also false since rq->next_class is still fair */\n\n      /*\n       * sched_balance_newidle() is considered to\n       * have failed to pull any fair tasks and no\n       * other wakeups were detected.\n       */\n       return NULL; /* pick_task_fair() */\n\n    pick_task_idle()\n      return rq->idle;\n\n    next = rq->idle;\n\n    /* Preemption indicators are lost */\n    clear_tsk_need_resched(prev);\n    clear_preempt_need_resched();\n\n    rq->curr = rq->idle;\n\n  !!! rq->idle switches in with rq->running == 1 but !need_resched() !!!\n\nIn simple words, enqueue, followed by a class change of the newly queued\ntask goes unnoticed in rq->next_class indicator and\nsched_balance_newidle() sees no fair task, nor any higher priority task\nenqueued.\n\nThe above sequence will lead to CPU idling with a runnable task on the\nCPU.\n\nCall wakeup_preempt() for ctx->queued cases in sched_change_end() to\nre-evaluate rq->next_class after class change (ENQUEUE_CLASS) and set\nthe NEED_RESCHED indicator accordingly.\n\nNewidle balance will correctly see an enqueue of a higher priority\nt\n---truncated---","state":0,"publishedAt":"2026-10-28T10:35:59.093+00:00","modifiedAt":"2026-10-28T10:35:59.093+00:00","affected":[{"ecosystem":"Vendor product","name":"Linux","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"product\": \"Linux\",\n                    \"vendor\": \"Linux\",\n                    \"defaultStatus\": \"unaffected\",\n                    \"repo\": \"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\n                    \"programFiles\": [\n                        \"kernel/sched/core.c\"\n                    ],\n                    \"versions\": [\n                        {\n                            \"version\": \"704069649b5bfb7bf1fe32c0281fe9036806a59a\",\n                            \"lessThan\": \"ae89744c5ebf299bf55ac7581768fbd9f119a903\",\n                            \"status\": \"affected\",\n                            \"versionType\": \"git\"\n                        },\n                        {\n                            \"version\": \"704069649b5bfb7bf1fe32c0281fe9036806a59a\",\n                            \"lessThan\": \"118a2cf4ced60777a2408001e2b4838fed1cea55\",\n                            \"status\": \"affected\",\n                            \"versionType\": \"git\"\n                        }\n                    ]\n                }"},{"ecosystem":"Vendor product","name":"Linux","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"product\": \"Linux\",\n                    \"vendor\": \"Linux\",\n                    \"defaultStatus\": \"affected\",\n                    \"repo\": \"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\n                    \"programFiles\": [\n                        \"kernel/sched/core.c\"\n                    ],\n                    \"versions\": [\n                        {\n                            \"version\": \"7.0\",\n                            \"status\": \"affected\"\n                        },\n                        {\n                            \"version\": \"0\",\n                            \"lessThan\": \"7.0\",\n                            \"status\": \"unaffected\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"version\": \"7.2.13\",\n                            \"lessThanOrEqual\": \"7.2.*\",\n                            \"status\": \"unaffected\",\n                            \"versionType\": \"semver\"\n                        },\n                        {\n                            \"version\": \"7.3\",\n                            \"lessThanOrEqual\": \"*\",\n                            \"status\": \"unaffected\",\n                            \"versionType\": \"original_commit_for_fix\"\n                        }\n                    ]\n                }"}],"metrics":[],"references":["https://git.kernel.org/stable/c/ae89744c5ebf299bf55ac7581768fbd9f119a903","https://git.kernel.org/stable/c/118a2cf4ced60777a2408001e2b4838fed1cea55"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-99205","license":"CVE Program Terms of Use","key":"cve-program:CVE-2026-99205","identifiers":["CVE-2026-99205"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-10-31T14:05:03.5694547+00:00","complete":true,"records":1766,"lastAttemptAt":"2026-10-31T14:05:03.5694547+00:00","lastSuccessAt":"2026-10-31T14:05:03.9102612+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:03.910611+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-9266d7b009bf9c4a0ccdcb5cbdea7f905cb3c4d92fd3b41581ece16b2cfdc4e7-ec769fcf6e6e34bf3f0b54e1ac62cfffb542a122ab77efcad94c9e853e0b6490","complete":true,"records":417574,"lastAttemptAt":"2026-10-31T14:05:02.6830253+00:00","lastSuccessAt":"2026-10-31T13:33:54.3368861+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:02.6830253+00:00","snapshotPublishedAt":"2026-10-31T13:26:04+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-1ea90a365f5b43ef9a5b92be53fe0867","complete":true,"records":13565,"lastAttemptAt":"2026-10-31T14:05:07.41688+00:00","lastSuccessAt":"2026-10-31T11:34:32.033+00:00","error":null,"lastVerifiedAt":"2026-10-31T11:34:32.033+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13637,"expectedIdentifiers":13637,"failedIdentifiers":0},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-10-31T14:05:03.5694547+00:00","complete":true,"records":1094,"lastAttemptAt":"2026-10-31T14:05:03.5694547+00:00","lastSuccessAt":"2026-10-31T14:05:04.1115496+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:04.11155+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-fb26245244484b8385c58dbbcb23d928","complete":true,"records":13577,"lastAttemptAt":"2026-10-31T14:05:06.3072816+00:00","lastSuccessAt":"2026-10-31T14:05:06.296+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:06.296+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13637,"expectedIdentifiers":13637,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-21dcd6662970dfea02e4ea60ee637115e8d92664947484d2b9276b3f6568a84f","complete":true,"records":9815,"lastAttemptAt":"2026-10-31T14:05:03.2592715+00:00","lastSuccessAt":"2026-10-30T23:47:34.1817587+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:03.2592715+00:00","snapshotPublishedAt":"2026-10-30T23:33:17+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-2de9ccc5290f060c7aa63f89c25dd76f655a64ba1aba7c05c97fa3bee4f09899","complete":true,"records":1967,"lastAttemptAt":"2026-10-31T14:05:03.0514544+00:00","lastSuccessAt":"2026-10-28T20:55:34.2982937+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:03.0514544+00:00","snapshotPublishedAt":"2026-10-28T20:03:08+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-f95f76cd406ae5bae3de632ad37fd2d5160b44f5e6b51748ac6f8f0c0c88e72b","complete":true,"records":3028,"lastAttemptAt":"2026-10-31T14:05:03.3781277+00:00","lastSuccessAt":"2026-10-30T23:47:38.4914494+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:03.3781277+00:00","snapshotPublishedAt":"2026-10-30T23:18:12+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-d37f475fd4943f3910741120036649d396d0a133edf936fc0112d88abf9bb041","complete":true,"records":230993,"lastAttemptAt":"2026-10-31T14:05:03.1555417+00:00","lastSuccessAt":"2026-10-31T12:35:41.6420764+00:00","error":null,"lastVerifiedAt":"2026-10-31T14:05:03.1555417+00:00","snapshotPublishedAt":"2026-10-31T12:33:12+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}