---
id: CVE-2026-98942
title: 'sched_ext: Build the cid tables privately and publish them with RCU'
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  sched_ext: Build the cid tables privately and publish them with RCU

  The cid tables are visible to the cid kfuncs while being modified: the
  first enable publishes the g…
severity: none
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 <
    0e1a74369bdbc357d3d9713734418d914a981553
  - >-
    Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 <
    3a773220d39ba993dfe5d135f8b610be10794d5d
  - Linux < 7.2.10
  - Linux (all versions)
published: '2026-10-23'
updated: '2026-10-23'
sourceUpdated: '2026-10-23T12:12:14.180Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-98942'
references:
  - url: 'https://git.kernel.org/stable/c/0e1a74369bdbc357d3d9713734418d914a981553'
  - url: 'https://git.kernel.org/stable/c/3a773220d39ba993dfe5d135f8b610be10794d5d'
tags:
  - cve.org
ingestedAt: '2026-10-23T13:24:55.561Z'
---

## Overview

In the Linux kernel, the following vulnerability has been resolved:

sched_ext: Build the cid tables privately and publish them with RCU

The cid tables are visible to the cid kfuncs while being modified: the
first enable publishes the global pointers before filling them,
ops.init_cids() overrides rewrite them in place, and re-enables rebuild
them in place. A racing TRACING or SYSCALL program can read unfilled
entries, including uninitialized memory in the kmalloc'd tables, or torn
topo updates.

Tie the tables' lifetimes to the root sched instead: each root enable
builds a fresh set privately and publishes the per-table __rcu globals once
the layout is final, and root disable unpublishes and RCU-frees the set. A
non-NULL global is now always a fully built table which stays valid for the
reader's RCU read section, and lookups stay two loads. Kfuncs treat NULL as
no-mapping, also after the scheduler exits instead of reporting the stale
last mapping.

The cid kfuncs are available whether the root scheduler is cid-form or
cpu-form, the latter to allow gradual migration to cids. Every root
therefore builds and publishes a default mapping.

Every reader must either be gated on scheduler liveness or NULL-check
inside an RCU read section. Fix the two kfuncs that were neither:
scx_bpf_this_cid() read the table with no RCU or preemption protection and
scx_bpf_task_cid() relied on KF_RCU, which doesn't put a sleepable program
in an RCU read section. The hotplug callbacks are instead serialized by
retiring the tables inside the cpus_read_lock() section that clears
scx_root.

v2: Document why every root builds the tables (desc + cid.c comment).

## Affected

- `Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 0e1a74369bdbc357d3d9713734418d914a981553`
- `Linux >= 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 < 3a773220d39ba993dfe5d135f8b610be10794d5d`
- `Linux < 7.2.10`
- `Linux (all versions)`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.
