Will Deacon 7. septembrī nosūtīja linux-arm-kernel sarakstam otro versiju ielāpu kopai arm64: Remove unused big-endian support. Diffstat ir īss: 41 mainīts fails, 54 pievienotas rindas, 539 izdzēstas. Mērķis ir Linux 7.4 apvienošanas logs.
Kopa aizvāc pēdējās big-endian pēdas no arch/arm64. Zem naža nonāk BPF JIT kompilators, kriptogrāfijas asamblers, optimizētās virkņu funkcijas, compat vDSO būvējums un KVM hipervizora objekts. Kokā vairs nepaliek neviens CONFIG_CPU_BIG_ENDIAN vai __AARCH64EB__ lietojums.
Baitu secība, kurai neatradās lietotāji
ARMv8 procesors prot lasīt atmiņu abās baitu secībās. Skaitli 0x12345678 var glabāt ar augstāko baitu pa priekšu (big-endian) vai ar zemāko baitu pa priekšu (little-endian). Kodols izvēli fiksē būvēšanas laikā, tāpēc katrs asamblera gabals, kas strādā ar atsevišķiem baitiem, prasa divus variantus un divkāršu testēšanu.
Šo dubulto uzturēšanu arm64 kodolā ienesa Matthew Leach no ARM. Viņš ielāpus publicēja 2013. gada 11. oktobrī, pie kopas strādāja arī Mark Rutland un tas pats Will Deacon. Pavadvēstulē nav nosaukta neviena iekārta vai klients, kam big-endian būtu vajadzīgs. Tur rakstīts vien tas, ka LTP testi iziet cauri AArch32 un AArch64 lietotāja telpā bez regresijām. Kods nonāca Linux 3.13 laidienā, kura arm64 izmaiņas Catalin Marinas nosūtīja 2013. gada 8. novembrī.
Kā atbalsts nomira pa gabaliem
Vispirms atteicās rīku ķēde. LLD saitētājs big-endian arm64 kodolu salikt nespēja. Sarakstā parādījās ielāps, kas CPU_BIG_ENDIAN padara atkarīgu no !LD_IS_LLD. ClangBuiltLinux projektā par to joprojām karājas kļūdas pieteikums: ar LLVM 13 un 14 būvēts big-endian kodols ielādes laikā apstājas.
Nākamais solis bija Kconfig. Linux 6.18 laidienā CPU_BIG_ENDIAN arm64 arhitektūrā ieguva atkarību no BROKEN, tātad konfigurācijas rīks opciju vairs nepiedāvā un kodolu ar to praktiski salikt nevar. Kopš tā laika mirušie fragmenti no koka aizgāja pa vienam. Deacon kopa nogriež to, kas palicis.
Laika ziņā kopa iekrita starp diviem laidieniem. Linux 7.3-rc2 iznāca 6. septembrī, Deacon vēstule aizgāja nākamajā dienā. Līdz 7.4 apvienošanas logam paliek vairākas nedēļas, tāpēc uzturētājiem ir laiks kopu izskatīt pilnībā.
Ko satur 14 ielāpi
Kopa iet cauri arm64 slāņiem no augšas uz leju:
arm64: bpf: Remove big-endian support from the JIT compilerarm64: crypto: Assume a little-endian kernelarm64: lib: Assume a little-endian kernel in optimised string routinesarm64: assembler: Remove endianness helper macrosarm64: head: Force little-endian early during bootKVM: arm64: Remove support for a big-endian hypervisor objectarm64: image: Remove endianness handling for generating image headerdrivers: Kconfig: Simplify dependencies on ARM64 && !CPU_BIG_ENDIAN
BPF JIT gadījumā runa nav par mazu labojumu. Kompilators, kas eBPF baitkodu pārtaisa par arm64 instrukcijām, glabāja atsevišķu ceļu tam, kā konstantes un atmiņas piekļuves izkārtot big-endian kodolā. Šis ceļš tagad pazūd pilnībā. Tas pats attiecas uz optimizētajām memcpy un virkņu funkcijām, kur baitu secība nosaka, kurā galā meklēt nulles baitu vārda iekšienē.
Septītais ielāps v1 versijā vēl nebija. Tas ielādes sākumā piespiedu kārtā ieslēdz little-endian režīmu, lai kodols nepaļautos uz to, kādā stāvoklī procesoru atstājis ielādētājs. Pēdējais ielāps tīra draiveru Kconfig failus, kur līdz šim bija jāraksta ARM64 && !CPU_BIG_ENDIAN. Deacon pavadvēstulē norāda, ka tur rīkojies uzmanīgi, lai nesabojātu COMPILE_TEST būvējumus.
Visa kopa ir pārbāzēta uz 7.3-rc1. Diffstat rāda, cik maz koda vēl bija palicis:
41 files changed, 54 insertions(+), 539 deletions(-)
Četri uzturētāji jau devuši savu apstiprinājumu: Catalin Marinas, Arnd Bergmann, Eric Biggers un Marc Zyngier. Visu kopu var apskatīt Patchew.
Tajā pašā dienā otra arm64 kopa
7. septembrī Deacon nosūtīja arī 19 ielāpu kopu arm64: Implement parallel CPU onlining with PSCI v0.2+, kas skar 22 failus. Tā ļauj kodolam sekundāros procesorus pievienot paralēli. Līdz šim arm64 tos startēja stingri citu pēc cita, gaidot katra atbildi.
Mehānisms izmanto PSCI v0.2 ieviesto CPU_ON argumentu, ar kuru ielādes parametrus var padot caur programmaparatūru. Tas atļauj arm64 pieslēgties vispārīgajai CONFIG_HOTPLUG_PARALLEL infrastruktūrai un izmest pašrocīgo sekundāro procesoru sinhronizāciju. Pavadvēstulē minēts arī drošības ieguvums: konfidenciālu viesi vairs nevar apmānīt ļaunprātīgs hipervizors, kas procesoru mēģina iebāzt pēc noildzes.
Kopa pārņem darbu, ko jūnijā publicēja Jinjie Ruan no Huawei. Kodola ziņu apskats dev.to min viņa mērījumus: 192 kodolu HiSilicon serverī procesoru startēšana aizņēma 8,6 sekundes iepriekšējo 14,6 vietā. Uz 32 un 64 kodolu platēm ieguvums bija no 62 līdz 65 %. Deacon pavadvēstulē skaitļus neatkārto un runā vispārīgi par platformām, kur procesoru startēšana prasa daudz laika.
Kam tas ko maina
Tiem, kas lieto mainline kodolu, neko. Big-endian arm64 kodols pēc 6.18 vairs nesabūvējas, tāpēc dzēšana aizvāc kodu, kuru neviens nekompilē. Ieguvums ir uzturētājiem: par 539 rindām mazāk asamblera, ko ņemt vērā katrā jaunā kriptogrāfijas vai virkņu funkcijas optimizācijā.
Otrs efekts skar 32 bitu ARM. Tur big-endian ARMv7 atbalsts arī ir atzīmēts kā BROKEN, taču izmešanu neviens nav plānojis. Argumentācija bija vienkārša: ja arm64 savu big-endian atbalstu izmet, tad arī 32 bitu variants var sekot. Šī nedēļa šo nosacījumu izpildīja.
Kopa tagad gaida Catalin Marinas arm64 koku. Ja tā tur nonāk, pirmais kodols, kurā arm64 vairs neprot big-endian, būs 7.4.
Avoti
- [PATCH v2 00/14] arm64: Remove unused big-endian support, Patchew
- [PATCH 00/19] arm64: Implement parallel CPU onlining with PSCI v0.2+, linux-arm-kernel
- AArch64 BE Support, LWN.net
- Kernel & Embedded News: Arm64 Drops Big-Endian, Boots CPUs in Parallel, dev.to
- arm64 big endian boot failure with LLVM 13 and 14, ClangBuiltLinux
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.