---
id: CVE-2026-99093
title: 'mm: don''t schedule deferred kernel page table freeing while booting'
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  mm: don't schedule deferred kernel page table freeing while booting

  Booting with a boot-time function tracer and a filter, for example

    ftrace=function ftrace_filter…
severity: none
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= 84e0cd79d57f06b872154eb5d8f610584133f260 <
    7a25ca170c12a9328f6fcf4410713beb516b01c0
  - >-
    Linux >= 922873cf4fc34124215070a8ad391bf831538bb9 <
    df6c704a08bc0925d5db047b0a6221f962bda4d9
  - >-
    Linux >= 9e4a3ec3411bb6bb59e3c1f29b75609f1e87aac4 <
    2fb552b0bee70c24c092720028ab4620f5eb2646
  - Linux >= 6.18.53 < 6.18.57
  - Linux >= 7.2.7 < 7.2.11
published: '2026-10-26'
updated: '2026-10-26'
sourceUpdated: '2026-10-26T14:52:01.450Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-99093'
references:
  - url: 'https://git.kernel.org/stable/c/7a25ca170c12a9328f6fcf4410713beb516b01c0'
  - url: 'https://git.kernel.org/stable/c/df6c704a08bc0925d5db047b0a6221f962bda4d9'
  - url: 'https://git.kernel.org/stable/c/2fb552b0bee70c24c092720028ab4620f5eb2646'
tags:
  - cve.org
ingestedAt: '2026-10-26T15:29:30.508Z'
---

## Overview

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

mm: don't schedule deferred kernel page table freeing while booting

Booting with a boot-time function tracer and a filter, for example

  ftrace=function ftrace_filter=pud_free_pmd_page

panics on 7.3-rc4 as soon as the tracer starts:

  [   23.531178] Starting tracer 'function'
  [   23.675800] Oops: general protection fault, probably for non-canonical address 0xdffffc0000000038: 0000 [#1] SMP KASAN NOPTI
  [   23.819917] KASAN: null-ptr-deref in range [0x00000000000001c0-0x00000000000001c7]
  [   23.964025] CPU: 0 UID: 0 PID: 0 Comm: swapper Not tainted 7.3.0-rc4-fe2ec83746e5-with-fixes-v2+ #195 PREEMPT(undef)
  [   24.252248] RIP: 0010:__queue_work+0xab/0xf00
  [   25.981629] Call Trace:
  [   26.125727]  <TASK>
  [   26.413912]  ? pagetable_free_kernel+0x20/0x120
  [   26.990283]  queue_work_on+0x97/0xf0
  [   27.134382]  __cpa_collapse_large_pages+0x501/0x6f0
  [   27.566662]  cpa_flush+0x394/0x620
  [   27.998953]  change_page_attr_set_clr+0x321/0x4a0
  [   29.151729]  set_memory_rox+0xa2/0xf0
  [   29.584018]  create_trampoline+0x431/0x6f0
  ...
  [   44.343347] Kernel panic - not syncing: Attempted to kill the idle task!

The boot-time tracer is started from early_trace_init(), which runs
before workqueue_init_early().  Making its trampoline read-only splits a
large page, and CPA collapses it again right away.  The split table has
been a kernel page table since commit 9e4a3ec3411b
("x86/mm/pat: Allocate split page tables as kernel page tables"), so the
collapse frees it through pagetable_free_kernel(), which queues work on
system_percpu_wq - still NULL at that point.  That commit is correct in
itself; it only lets CPA reach pagetable_free_kernel() before the
workqueue that function relies on exists.

Keep putting the table on the list, but don't schedule the work while
the system is still booting.  A core_initcall schedules it once to free
whatever was queued by then.

## Affected

- `Linux >= 84e0cd79d57f06b872154eb5d8f610584133f260 < 7a25ca170c12a9328f6fcf4410713beb516b01c0`
- `Linux >= 922873cf4fc34124215070a8ad391bf831538bb9 < df6c704a08bc0925d5db047b0a6221f962bda4d9`
- `Linux >= 9e4a3ec3411bb6bb59e3c1f29b75609f1e87aac4 < 2fb552b0bee70c24c092720028ab4620f5eb2646`
- `Linux >= 6.18.53 < 6.18.57`
- `Linux >= 7.2.7 < 7.2.11`

## Remediation

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