programmatūra · 6 min · 26.07.2026

KVM sadala pārslogoto kvm_mmu trīs struktūrās: 24 ielāpi gaida Linux 7.3

Red Hat inženieris un KVM uzturētājs Paolo Bonzini ielika KVM Git zarā next ielāpu sēriju ar nosaukumu kvm-chainsaw. Tā sagriež struct kvm_mmu trīs atsevišķās struktūrās. Pats Bonzini šo struktūru sauc par “dieva datu struktūru”, jo tā vienā vietā dara trīs nesaistītus darbus.

Sērijā ir 24 ielāpi. Tie maina 15 failus, pievieno 422 rindas un izņem 432. Vislielākās izmaiņas ir failā arch/x86/kvm/mmu/mmu.c, kur pārstrādātas 411 rindas. Phoronix ziņo, ka darbs nonācis KVM next zarā, tātad tas ir gatavs Linux 7.3 ciklam.

kāpēc viena struktūra bija par lielu

KVM x86 kodā struct kvm_mmu apraksta viesa lapu tabulu formātu, apstaigā viesa lapu tabulas un būvē lapu tabulas. Trīs darbi vienā struktūrā nozīmē, ka daļa lauku atsevišķiem lietojumiem ir lieki. Skaidrākais piemērs ir nested_mmu, kas izmanto tikai daļu struktūras, jo tam vispār nav lapu tabulu, ko būvēt.

Daļu koda abi lietojumi dala. Rezervēto bitu pārbaudītājs strādā gan viesa, gan resursdatora lapu tabulām. Citas daļas nedala: permission_fault vietā vienā pusē strādā daudz vienkāršāks kods, tāds kā is_executable_pte(). Sērijas pavadvēstulē Bonzini to formulē īsi:

kvm_mmu ir “dieva datu struktūra”, kas ietver trīs dažādus uzdevumus: viesa lapu tabulas formāta aprakstīšanu, viesa lapu tabulu apstaigāšanu un lapu tabulu būvēšanu.

trīs struktūras vienas vietā

  • kvm_pagewalk ir lapu tabulu staigātājs. Uz katru vCPU to tagad ir divi: gva_walk un ngpa_walk. Līdzšinējais walk_mmu tika pārvietots starp root_mmu un nested_mmu. Tā vietā tagad vienmēr ir viens gva_walk neatkarīgi no tā, vai izpildās L1 vai L2 viesis.
  • kvm_mmu patur lapu tabulu būvēšanu. Ēnu lapu būvēšanai tā izmanto staigātāju: root_mmu gadījumā to dara gva_walk, guest_mmu gadījumā ngpa_walk.
  • kvm_page_format ļauj KVM strādāt ar jau esošiem PTE. Tajā ievākts permission_mask() kods kopā ar līdzšinējo struct rsvd_bits_validate. Savs kvm_page_format tagad ir gan kvm_pagewalk, gan kvm_mmu, gluži tāpat kā vecajā struct kvm_mmu bija divas rsvd_bits_validate kopijas.

vecs nosaukums, kas paņēma svešu vietu

Sadalīšana atrisina vienu senu neskaidrību. nested_mmu kodā parādījās krietni pirms guest_mmu un paņēma sev acīmredzamo nosaukumu. Sekas redzamas komentāros: kodā ir vietas ar piezīmi “Exempt nested MMUs”, kur patiesībā tiek atbrīvots guest_mmu. Bonzini raksta, ka guest_mmu pārsaukšana varētu būt nākamais solis, tikai RFC posmā par pareizo nosaukumu bija vairāki savstarpēji nesaderīgi viedokļi.

Pati pārkārtošana jau ir mainījusi vienu nosaukumu pāri. RFC versijā staigātāji saucās cpu_walk un tdp_walk, pēc atsauksmēm tie kļuva par gva_walk un ngpa_walk.

pēdējais ielāps atver jaunu iespēju

Sērijas pēdējais ielāps pielāgo permission_fault() mehānismu un liek to pārbaudīt SPTE pret struct kvm_page_fault. Tas padara iespējamus SPTE, kuros supervizora izpildes bits atšķiras no lietotāja izpildes bita, tas ir, XS != XU. KVM tādus līdz šim neatbalstīja. Bonzini norāda, ka tos tagad varētu pievienot caur atmiņas atribūtiem.

mehāniskos ielāpus rakstīja valodas modelis

RFC versija ar 22 ielāpiem nonāca KVM sarakstē 11. maijā. Tajā Bonzini atklāja, ka daļu darba paveicis ar AI palīdzību, jo īpaši mehāniskākajos ielāpos. Viņš rakstīja, ka lietojis LLM kā “natural language Coccinelle”, tas ir, kā semantisko ielāpu rīku, kuram norādes dod parastā valodā. Viena viņa norāde izskatījās šādi: pārvieto gva_to_gpa no struct kvm_mmu uz struct kvm_pagewalk; ja izsaucošajā funkcijā jau ir kvm_pagewalk tipa mainīgais, lieto to, nevis mmu->w.

Bonzini pats šos ielāpus sauc par LLM asistētiem, ne LLM ģenerētiem. Viņa arguments ir tāds, ka ar šādām norādēm darbu var izdarīt tikai vienā veidā. Viņš arī atzīmēja, ka ielāpi tapuši pirms kodola dokumenta Documentation/process/coding-assistants.rst ieviešanas. Vajadzības gadījumā viņš piedāvāja izsekot, kuri no refaktorēšanas ielāpiem tapuši šādi.

RFC pavadvēstulē bija arī brīdinājums par testēšanu. Kods tobrīd bija pārbaudīts ļoti viegli, ar npt=0 Linux viesi nestrādāja. Intel resursdatorus vai 32 bitu resursdatorus Bonzini vispār nebija mēģinājis.

kas notika ar recenzēšanu

Jūnija versijas pavadvēstule sākas ar novērojumu par RFC uzņemšanu. Piezīmes bija tikai par nosaukumiem. Bonzini secinājums: iespējams, visiem patika ideja to izdarīt un nevienam nepatika ideja to izlasīt no sākuma līdz galam. Divdesmit četru ielāpu sērija, kas pieskaras ligzdotajai virtualizācijai, ēnu lapu būvēšanai un rezervēto bitu pārbaudēm, arī nav pateicīgs recenzēšanas materiāls.

Pirmie pieci sērijas ielāpi ir atkārtots sūtījums no cita agrāka MMU tīrīšanas darba. Bonzini to sūtīja no jauna tāpēc, ka rīks sashiko vēl neprot apstrādāt Based-on tagus.

Ielāpi tagad ir KVM zarā next. Linux 7.3 apvienošanas logs atveras augusta otrajā pusē.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie