{"api_version":"1","generated_at":"2026-09-11T22:59:42+00:00","cve":"CVE-2026-89517","urls":{"html":"https://cve.report/CVE-2026-89517","api":"https://cve.report/api/cve/CVE-2026-89517.json","docs":"https://cve.report/api","cve_org":"https://www.cve.org/CVERecord?id=CVE-2026-89517","nvd":"https://nvd.nist.gov/vuln/detail/CVE-2026-89517"},"summary":{"title":"sched_ext: Fix rq->core_pick corruption under core scheduling","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nsched_ext: Fix rq->core_pick corruption under core scheduling\n\nCore scheduling's pick_next_task() picks what to run on every SMT sibling of\nthe core in a single pass under the shared core-wide rq lock. The selection\nstate is consistent only while the lock is held continuously, so\n->pick_task() originally could not release it. However, since 4c95380701f5\n(\"sched/ext: Fold balance_scx() into pick_task_scx()\"), sched_ext runs\ndispatch from inside the pick and dispatching can drop the rq lock. To\nsupport this, pick_next_task() has been updated to restart the whole\nselection when a pick returns RETRY_TASK after releasing the lock.\n\nWhen selections on the same core interleave through the dropped lock, they\ncorrupt each other's state: one clears the other's rq->core_pick leading to\na NULL deref, or invalidates its keep-the-previous-task decision leaving a\ndequeued task running, which deadlocks the next wakeup and matches the\nreported hard hangs. A cookied ping-pong load on an SMT machine makes the\ninterleavings frequent and kills the kernel within seconds.\n\nFix it by making the pick return RETRY_TASK whenever dispatch released the\nrq lock, so that a selection only ever commits picks made under a\ncontinuously held lock. The previous patch's rq->scx.lock_drop_seq counts\nthe releases. A dispatch that touched nothing never releases the lock and\nits verdict, including \"nothing to run\", stands: retries are bounded, each\nfollowing a dispatch that actually did something, and an idle CPU does not\nloop.\n\nIf another dispatch is already in flight on the rq, skip dispatching and\npick from what is already queued locally - the in-flight dispatch has\nreleased the lock, so its own selection will retry and re-pick this rq,\nwhile returning RETRY_TASK here would only spin on the lock that dispatch\nneeds to finish.\n\nBalance callbacks must run in the context that queued them, so they can only\nbe queued on the CPU's own rq. When dispatching for another rq, run the\ndeferred work directly instead - that rq may consume all its picks through\nthe core-sched fast path and never queue the callback itself.\n\nThe put_prev_task_scx() warning about a runnable task being left behind\nassumed that dispatch ran as part of the very pick that is switching away.\nThat now only holds on the non-core path, so gate it and drop the\ncookie-match test, which is always true without core scheduling, from its\ncondition.","state":"PUBLISHED","assigner":"Linux","published_at":"2026-09-11 20:19:34","updated_at":"2026-09-11 20:19:34"},"problem_types":[],"metrics":[],"references":[{"url":"https://git.kernel.org/stable/c/cdafb68155bee2d5c4e50c12e4606323e9334e6b","name":"https://git.kernel.org/stable/c/cdafb68155bee2d5c4e50c12e4606323e9334e6b","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://git.kernel.org/stable/c/d954004205c1a1d3f59ce8482b559266c15600fa","name":"https://git.kernel.org/stable/c/d954004205c1a1d3f59ce8482b559266c15600fa","refsource":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","tags":[],"title":"","mime":"","httpstatus":"","archivestatus":"0"},{"url":"https://www.cve.org/CVERecord?id=CVE-2026-89517","name":"CVE Program record","refsource":"CVE.ORG","tags":["canonical"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-89517","name":"NVD vulnerability detail","refsource":"NVD","tags":["canonical","analysis"]}],"affected":[{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 4c95380701f58b8112f0b891de8d160e4199e19d cdafb68155bee2d5c4e50c12e4606323e9334e6b git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 4c95380701f58b8112f0b891de8d160e4199e19d d954004205c1a1d3f59ce8482b559266c15600fa git","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"affected 6.19","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 6.19 semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.2.4 7.2.* semver","platforms":[]},{"source":"CNA","vendor":"Linux","product":"Linux","version":"unaffected 7.3-rc1 * original_commit_for_fix","platforms":[]}],"timeline":[],"solutions":[],"workarounds":[],"exploits":[],"credits":[],"nvd_cpes":[],"vendor_comments":[],"enrichments":{"kev":null,"epss":null,"legacy_qids":[]},"source_records":{"cve_program":{"containers":{"cna":{"affected":[{"defaultStatus":"unaffected","product":"Linux","programFiles":["kernel/sched/ext/ext.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"lessThan":"cdafb68155bee2d5c4e50c12e4606323e9334e6b","status":"affected","version":"4c95380701f58b8112f0b891de8d160e4199e19d","versionType":"git"},{"lessThan":"d954004205c1a1d3f59ce8482b559266c15600fa","status":"affected","version":"4c95380701f58b8112f0b891de8d160e4199e19d","versionType":"git"}]},{"defaultStatus":"affected","product":"Linux","programFiles":["kernel/sched/ext/ext.c"],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","vendor":"Linux","versions":[{"status":"affected","version":"6.19"},{"lessThan":"6.19","status":"unaffected","version":"0","versionType":"semver"},{"lessThanOrEqual":"7.2.*","status":"unaffected","version":"7.2.4","versionType":"semver"},{"lessThanOrEqual":"*","status":"unaffected","version":"7.3-rc1","versionType":"original_commit_for_fix"}]}],"cpeApplicability":[{"nodes":[{"cpeMatch":[{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.2.4","versionStartIncluding":"6.19","vulnerable":true},{"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionEndExcluding":"7.3-rc1","versionStartIncluding":"6.19","vulnerable":true}],"negate":false,"operator":"OR"}]}],"descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nsched_ext: Fix rq->core_pick corruption under core scheduling\n\nCore scheduling's pick_next_task() picks what to run on every SMT sibling of\nthe core in a single pass under the shared core-wide rq lock. The selection\nstate is consistent only while the lock is held continuously, so\n->pick_task() originally could not release it. However, since 4c95380701f5\n(\"sched/ext: Fold balance_scx() into pick_task_scx()\"), sched_ext runs\ndispatch from inside the pick and dispatching can drop the rq lock. To\nsupport this, pick_next_task() has been updated to restart the whole\nselection when a pick returns RETRY_TASK after releasing the lock.\n\nWhen selections on the same core interleave through the dropped lock, they\ncorrupt each other's state: one clears the other's rq->core_pick leading to\na NULL deref, or invalidates its keep-the-previous-task decision leaving a\ndequeued task running, which deadlocks the next wakeup and matches the\nreported hard hangs. A cookied ping-pong load on an SMT machine makes the\ninterleavings frequent and kills the kernel within seconds.\n\nFix it by making the pick return RETRY_TASK whenever dispatch released the\nrq lock, so that a selection only ever commits picks made under a\ncontinuously held lock. The previous patch's rq->scx.lock_drop_seq counts\nthe releases. A dispatch that touched nothing never releases the lock and\nits verdict, including \"nothing to run\", stands: retries are bounded, each\nfollowing a dispatch that actually did something, and an idle CPU does not\nloop.\n\nIf another dispatch is already in flight on the rq, skip dispatching and\npick from what is already queued locally - the in-flight dispatch has\nreleased the lock, so its own selection will retry and re-pick this rq,\nwhile returning RETRY_TASK here would only spin on the lock that dispatch\nneeds to finish.\n\nBalance callbacks must run in the context that queued them, so they can only\nbe queued on the CPU's own rq. When dispatching for another rq, run the\ndeferred work directly instead - that rq may consume all its picks through\nthe core-sched fast path and never queue the callback itself.\n\nThe put_prev_task_scx() warning about a runnable task being left behind\nassumed that dispatch ran as part of the very pick that is switching away.\nThat now only holds on the non-core path, so gate it and drop the\ncookie-match test, which is always true without core scheduling, from its\ncondition."}],"providerMetadata":{"dateUpdated":"2026-09-11T19:44:00.576Z","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","shortName":"Linux"},"references":[{"url":"https://git.kernel.org/stable/c/cdafb68155bee2d5c4e50c12e4606323e9334e6b"},{"url":"https://git.kernel.org/stable/c/d954004205c1a1d3f59ce8482b559266c15600fa"}],"title":"sched_ext: Fix rq->core_pick corruption under core scheduling","x_generator":{"engine":"bippy-1.2.0"}}},"cveMetadata":{"assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","assignerShortName":"Linux","cveId":"CVE-2026-89517","datePublished":"2026-09-11T19:44:00.576Z","dateReserved":"2026-09-11T19:38:34.717Z","dateUpdated":"2026-09-11T19:44:00.576Z","state":"PUBLISHED"},"dataType":"CVE_RECORD","dataVersion":"5.2"},"nvd":{"publishedDate":"2026-09-11 20:19:34","lastModifiedDate":"2026-09-11 20:19:34","problem_types":[],"metrics":[],"configurations":[]},"legacy_mitre":{"record":{"CveYear":"2026","CveId":"89517","Ordinal":"1","Title":"sched_ext: Fix rq->core_pick corruption under core scheduling","CVE":"CVE-2026-89517","Year":"2026"},"notes":[{"CveYear":"2026","CveId":"89517","Ordinal":"1","NoteData":"In the Linux kernel, the following vulnerability has been resolved:\n\nsched_ext: Fix rq->core_pick corruption under core scheduling\n\nCore scheduling's pick_next_task() picks what to run on every SMT sibling of\nthe core in a single pass under the shared core-wide rq lock. The selection\nstate is consistent only while the lock is held continuously, so\n->pick_task() originally could not release it. However, since 4c95380701f5\n(\"sched/ext: Fold balance_scx() into pick_task_scx()\"), sched_ext runs\ndispatch from inside the pick and dispatching can drop the rq lock. To\nsupport this, pick_next_task() has been updated to restart the whole\nselection when a pick returns RETRY_TASK after releasing the lock.\n\nWhen selections on the same core interleave through the dropped lock, they\ncorrupt each other's state: one clears the other's rq->core_pick leading to\na NULL deref, or invalidates its keep-the-previous-task decision leaving a\ndequeued task running, which deadlocks the next wakeup and matches the\nreported hard hangs. A cookied ping-pong load on an SMT machine makes the\ninterleavings frequent and kills the kernel within seconds.\n\nFix it by making the pick return RETRY_TASK whenever dispatch released the\nrq lock, so that a selection only ever commits picks made under a\ncontinuously held lock. The previous patch's rq->scx.lock_drop_seq counts\nthe releases. A dispatch that touched nothing never releases the lock and\nits verdict, including \"nothing to run\", stands: retries are bounded, each\nfollowing a dispatch that actually did something, and an idle CPU does not\nloop.\n\nIf another dispatch is already in flight on the rq, skip dispatching and\npick from what is already queued locally - the in-flight dispatch has\nreleased the lock, so its own selection will retry and re-pick this rq,\nwhile returning RETRY_TASK here would only spin on the lock that dispatch\nneeds to finish.\n\nBalance callbacks must run in the context that queued them, so they can only\nbe queued on the CPU's own rq. When dispatching for another rq, run the\ndeferred work directly instead - that rq may consume all its picks through\nthe core-sched fast path and never queue the callback itself.\n\nThe put_prev_task_scx() warning about a runnable task being left behind\nassumed that dispatch ran as part of the very pick that is switching away.\nThat now only holds on the non-core path, so gate it and drop the\ncookie-match test, which is always true without core scheduling, from its\ncondition.","Type":"Description","Title":"sched_ext: Fix rq->core_pick corruption under core scheduling"}]}}}