---
id: CVE-2026-89991
title: |-
  In the Linux kernel, the following vulnerability has been resolved:

  bpf: Fix infinite loop in pcpu_freelist push with one possible CPU

  __pcpu_freelist_push() can loop forever when only one CPU is possible
  and an NMI re-enters pcpu_free…
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  bpf: Fix infinite loop in pcpu_freelist push with one possible CPU

  __pcpu_freelist_push() can loop forever when only one CPU is possible
  and an NMI re-enters pcpu_free…
severity: none
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb <
    a24a146ae2cb5d9faeea96d10010fcb6579abe1f
  - >-
    Linux >= f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb <
    a5b5e62baceff9e252c6535cf42a027d04f226cf
  - >-
    Linux >= f2ac0e5d1c4dcc55d6510dcaefb8f45661a9a1fb <
    efebf6496685c93150df5bb0794363ae70c5f58a
  - Linux 6.15
published: '2026-09-16'
updated: '2026-09-16'
sourceUpdated: '2026-09-16T11:17:10.240'
source: NVD
sourceUrl: 'https://nvd.nist.gov/vuln/detail/CVE-2026-89991'
references:
  - url: 'https://git.kernel.org/stable/c/a24a146ae2cb5d9faeea96d10010fcb6579abe1f'
    label: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
  - url: 'https://git.kernel.org/stable/c/a5b5e62baceff9e252c6535cf42a027d04f226cf'
    label: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
  - url: 'https://git.kernel.org/stable/c/efebf6496685c93150df5bb0794363ae70c5f58a'
    label: 416baaa9-dc9f-4396-8d5f-8c081fb06d67
tags:
  - nvd
  - cve.org
ingestedAt: '2026-09-16T10:53:53.949Z'
epss: 0.00198
epssPercentile: 0.09837
---

## Overview

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

bpf: Fix infinite loop in pcpu_freelist push with one possible CPU

__pcpu_freelist_push() can loop forever when only one CPU is possible
and an NMI re-enters pcpu_freelist_push() while the interrupted context
holds that CPU's freelist lock.

After the current-CPU fast path fails, the fallback loop walks
cpu_possible_mask while skipping the current CPU. With CONFIG_SMP=n, or
when an SMP kernel is limited to one possible CPU with nr_cpus=1 or
possible_cpus=1, there are no other possible CPUs to examine. The loop
therefore makes no lock acquisition attempt and can never make progress.

The following stack was observed on a UP system:

  NMI context:
    pcpu_freelist_push
    free_htab_elem
    htab_map_delete_elem
    [perf-event BPF program]
    __perf_event_overflow
    perf_event_nmi_handler
    exc_nmi

  Interrupted context:
    __pcpu_freelist_push
    pcpu_freelist_push
    free_htab_elem
    htab_map_delete_elem
    [raw_tp/sys_enter BPF program]
    __bpf_trace_sys_enter
    do_syscall_64

raw_res_spin_lock() detects the same-CPU recursive acquisition and
returns -EDEADLK, but the subsequent fallback loop has no candidate head
on a system with one possible CPU.

Restore the extra fallback head that existed before the rqspinlock
conversion. Keep the current-CPU fast path, then try the other possible
CPUs and finally the extra head. The additional head lets a push, which
cannot fail without losing a preallocated element, make progress when the
only per-CPU head is held by the interrupted context.

Also check the extra head from the pop path so that nodes placed there
can be reused.

## Remediation

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