KVM zerschlägt monolithische Kernstruktur in drei Teile für Linux 7.3

KVM-Maintainer Paolo Bonzini spaltet die monolithische kvm_mmu-Struktur in drei separate Komponenten auf, um die Codebasis für Linux 7.3 zu modernisieren.

Die Aufteilung des kvm_mmu in drei dedizierte Strukturen verbessert die Wartbarkeit und bereitet neue Virtualisierungsfunktionen vor.
Highlights
  • Die monolithische kvm_mmu-Struktur wird in kvm_pagewalk, kvm_mmu (verkleinert) und kvm_page_format aufgeteilt.
  • Paolo Bonzini nutzte ein LLM als 'natürlichsprachliches Coccinelle' für die mechanische Umbauarbeit.
  • Die Aufspaltung ermöglicht differenzierte Zugriffskontrollen wie die Unterscheidung von Superviser- und User-Execute-Berechtigungen.

Die monolithische Kernstruktur der KVM-Virtualisierung, das kvm_mmucodecodecode, wird in drei unabhängige Einheiten aufgeteilt. Ziel ist die Vorbereitung für den Linux-Kernel 7.3, dessen Merge-Fenster im Spätsommer 2026 öffnet. Paolo Bonzini, Maintainer von KVM, hat die Refaktorierung im kvm-chainsawcodecodecode-Branch von KVM.git abgeschlossen und in den Next-Branch eingepflegt.

Der „God Data Structure“ wird die Kette angelegt

KVM-Maintainer Paolo Bonzini (Paolo Bonzini) bezeichnete kvm_mmucodecodecode in seinem Commit-Kommentar selbst als „god data structure“ – eine allmächtige Struktur, die drei völlig unterschiedliche Aufgaben in sich vereinte: die Beschreibung und den Walk von Gast-Page-Tables sowie den Aufbau von Shadow-Page-Tables. Diese monolithische Einheit führte zu jahrelang gewachsenen Inkonsistenzen.

So wurde etwa die Struktur nested_mmucodecodecode vor guest_mmucodecodecode implementiert und eignete sich so den intuitiveren Namen an. Die Namensgebung und die tatsächliche Funktion drifteten auseinander. Ein Kommentar im Code lautete „Exempt nested MMUs“, doch tatsächlich ausgenommen war guest_mmucodecodecode. Das Chaos zog sich durch die gesamte Struktur.

Auch die Trennung von Gast- und Host-Seiten war unscharf. Die Funktion permission_fault()codecodecode etwa prüfte Berechtigungen auf Gast-PTE-Ebene, während für die SPTE-Seite eine separate, vereinfachte Variante is_executable_pte()codecodecode verwendet wurde. Das sollte sich nun grundlegend ändern.

Drei Strukturen, drei Zuständigkeiten

Nach der Aufteilung trägt jede der drei neuen Strukturen eine klar definierte Verantwortung.

kvm_pagewalkcodecodecode ist der reine Page-Table-Walker. Pro virtueller CPU existieren zwei Instanzen: gva_walkcodecodecode für die Übersetzung von Gast-Virtual-Adressen und ngpa_walkcodecodecode für verschachtelte Gast-Physical-Adressen (nested guest physical address). Der alte walk_mmucodecodecode wechselte je nach Ausführungskontext zwischen root_mmucodecodecode und nested_mmucodecodecode hin und her. Das neue Design vereinheitlicht diesen Vorgang in einem einzigen, dedizierten Walker.

Das bisherige kvm_mmucodecodecode wird massiv verkleinert und behält ausschließlich die Funktion des Shadow-Page-Table-Builders. Bei der Konstruktion greift es auf den entsprechenden Pagewalker zurück: für root_mmucodecodecode auf gva_walkcodecodecode, für guest_mmucodecodecode auf ngpa_walkcodecodecode.

kvm_page_formatcodecodecode ist eine völlig neue Struktur, die alle Operationen auf bestehenden Page-Table-Entries (PTEs) bündelt. Sie vereint die bisherigen permission_mask()codecodecode-Funktionen und die rsvd_bits_validatecodecodecode-Prüfung für reservierte Bits. Sowohl kvm_pagewalkcodecodecode als auch das geschrumpfte kvm_mmucodecodecode besitzen jeweils eigene kvm_page_formatcodecodecode-Instanzen. Damit entfällt das alte Konstrukt, bei dem ein einziges kvm_mmucodecodecode zwei separate rsvd_bits_validatecodecodecode-Felder für Gast-PTEs und SPTEs vorhielt.

Der finale Patch umfasst 13 Dateien, 382 hinzugefügte und 391 entfernte Zeilen. Die Netto-Differenz beträgt lediglich neun negative Zeilen. Der Codeumfang bleibt also nahezu identisch, die Architektur jedoch ist nun sauber modularisiert.

Eine tabellarische Übersicht veranschaulicht die neue Aufgabenverteilung:

kvm_mmu – Aufteilung der Zuständigkeiten
Aufgabe Vor der Aufteilung Nach der Aufteilung
Page-Table-Walk walk_mmu kvm_pagewalk
Shadow-PT-Aufbau page_fault() kvm_mmu (verkleinert)
PTE-Prüfung / Reserved Bits rsvd_bits_* kvm_page_format
* Alle drei Funktionen waren zuvor in der monolithischen kvm_mmu-Struktur vereint. walk_mmu wechselte zwischen root_mmu und nested_mmu; kvm_pagewalk vereinheitlicht dies in gva_walk.

Der Weg zu neuen Funktionen durch die Aufspaltung

Am Ende der Patch-Serie wurde der Mechanismus von permission_fault()codecodecode auch auf SPTEs anwendbar gemacht und gegen die kvm_page_faultcodecodecode-Struktur testbar. Dies ermöglicht KVM, Fälle zu unterstützen, in denen sich die Superviser-Execute-Berechtigung (XS) und die User-Execute-Berechtigung (XU) unterscheiden. Eine solche differenzierte Steuerung war in KVM bislang nicht vorhanden. Durch die Einführung von kvm_page_formatcodecodecode mit einem permissionscodecodecode-Array können nun Speicherattribute per Bitmap abgeglichen werden. Die alte is_executable_pte()codecodecode in is_access_allowed()codecodecode wertete beide Bits als identisch – sobald eines gesetzt war, galt die Seite als ausführbar. Das ist nun Geschichte.

Damit eröffnet sich die Tür zu feineren Zugriffskontrollen auf Hypervisor-Ebene, etwa für spezielle Sicherheitsanforderungen in virtualisierten Umgebungen.

Ein LLM als „natürlichsprachliches Coccinelle“

Bonzini offenbarte in der Begleit-E-Mail zur RFC-Patch-Serie vom 11. Mai 2026, dass er für einen Teil der mechanischen Umbauarbeit ein Large Language Model (LLM) eingesetzt hat. Er beschreibt die Nutzung als „natürlichsprachliches Coccinelle“. Coccinelle ist ein etabliertes Tool zur pattern-basierten Transformation von C-Code im Linux-Kernel. Bonzini gab dem LLM Anweisungen wie: „Verschiebe gva_to_gpacodecodecode von struct kvm_mmucodecodecode nach struct kvm_pagewalkcodecodecode. Wenn der Aufrufer bereits eine Variable vom Typ kvm_pagewalkcodecodecode besitzt, verwende diese.“ Design und Planung der einzelnen Commits blieben jedoch in seiner Verantwortung.

Das ist bemerkenswert: Noch im vorherigen Release-Zyklus (Linux 7.2) hatte eine Flut von KI-generierten Patches die Entwicklung neuer Funktionen für KVM ARM64 praktisch zum Erliegen gebracht. Nur einen Zyklus später nutzt derselbe Maintainer nun selbst KI – jedoch unter strenger Kontrolle und mit klarer Kennzeichnung. Bonzini stellt klar, dass die Patches vor der Einführung des offiziellen KI-Richtliniendokuments (Documentation/process/coding-assistants.rstcodecodecode) entstanden sind. Er betont, er könne bei Bedarf nachvollziehen, welcher Patch KI-unterstützt war und welcher nicht. Die RFC-Serie umfasste 22 Patches, die finale v1-Version wuchs auf 24 Patches an. Der Teststatus verbesserte sich von „very lightly tested“ auf eine stabile Integration in den Next-Branch.

Das Merge-Fenster für Linux 7.3 öffnet in der zweiten Augusthälfte 2026. Die Aufspaltung des kvm_mmucodecodecode ist ein Paradebeispiel für zielgerichtete Architekturbereinigung, die nicht nur die Code-Wartbarkeit verbessert, sondern auch die Grundlage für erweiterte Hardware-Virtualisierungsfunktionen legt – und das mit einer pragmatischen, aber transparenten Nutzung moderner KI-Werkzeuge.

Diesen Artikel teilen