Nach zwei Monaten Entwicklung präsentierte Linus Torvalds die Veröffentlichung des Linux-Kernels 6.13. Zu den bemerkenswertesten Änderungen gehören: der Modus des verzögerten Austauschs im Task-Scheduler, Unterstützung für atomare Schreibvorgänge in XFS und Ext4, das Mechanismus 'multigrain timestamps', ein adaptiver Polling-Modus im Netzwerk-Subsystem, die Möglichkeit des Aufbaus mit AutoFDO-Optimierungen, Unterstützung für den Sicherheitsmechanismus ARM65 Guarded Control Stack, Isolierung virtueller Maschinen mittles der ARM CCA-Erweiterung, getrennte Stacks in BPF, Entfernung von ReiserFS, der Treiber virtual-cpufreq, das Netlink-API net-shaper, der Modus zum Einbinden von tmpfs mit Groß-/Kleinschreibung und Unterstützung von POSIX-Erweiterungen in SMB3 sowie der Treiber AMD Cache Optimizer.
Die neue Version beinhaltet 14.172 Korrekturen von 2.086 Entwicklern, die Patchgröße beträgt 46 MB (Änderungen betreffen 15.375 Dateien, hinzugefügt wurden 598.707 Codezeilen, 406.294 Zeilen wurden entfernt). In der vorherigen Version gab es 14.607 Korrekturen von 2.167 Entwicklern, die Patchgröße betrug 37 MB. Etwa 52 % aller in 6.13 vorgenommenen Änderungen hängen mit Gerätetreibern zusammen, etwa 13 % beziehen sich auf Aktualisierungen von architekturspezifischem Code, 11 % sind mit dem Netzwerkstack verbunden, 4 % mit Dateisystemen und 3 % mit internen Kernsubsystemen.
Die wichtigsten Neuerungen im Kernel 6.13:
- Festplattensubsystem, Ein-/Ausgabe und Dateisysteme
- Ein Mechanismus für ‚multigrain timestamps‘ wurde hinzugefügt, der es ermöglicht, Informationen über Dateiänderungen oder den Zugriff mit mehr als einer Millisekunden-Genauigkeit zu erhalten, ohne die Leistung negativ zu beeinflussen. Die Erhöhung der Genauigkeit der Zeitstempel führt zu zusätzlichen Overhead, da die Intensität des Schreibens von Metadaten auf die Festplatte zunimmt, daher werden in der vorgeschlagenen Implementierung genauere Zeitstempel nicht für alle Dateien, sondern nur für die erstellt, für die Prozesse solche Zeitstempel über den Aufruf von getattr() anfordern.
- Die Unterstützung für atomare Schreiboperationen wurde hinzugefügt, bei denen Daten, die größer sind als die Sektorgröße, atomar auf Speichermedien geschrieben werden, die diese Möglichkeit bieten. Derzeit ist die atomare Speicherung für XFS, Ext4 im O_DIRECT-Modus (Direct I/O) und md RAID 0/1/10 implementiert.
- Ein neuer Mechanismus zur Zählung von Verweisen für Dateien wurde vorgeschlagen, der eine Leistungssteigerung von 3-5 % bei Arbeitslasten mit mehr als 255 Threads gewährleistet.
- Die Implementierung des Dateisystems ReiserFS wurde entfernt, das vor zwei Jahren als veraltet erklärt wurde.
- Ein neuer sysctl-Parameter "fs.dentry-negative" wurde hinzugefügt, um die VFS-Politik zur Bereinigung von "dentry"-Einträgen (interne Darstellung von Verzeichniselementen) nach der Entfernung der zugehörigen Dateien festzulegen. Für bestimmte Arten von Lasten ist es vorteilhaft, solche Einträge über gelöschte Dateien zu behalten, während sie für andere entfernt werden sollten. Daher bietet der Kernel eine Auswahlmöglichkeit (standardmäßig werden "dentry"-Einträge nicht automatisch gelöscht).
- In den Systemaufruf statmount() wurde das Flag STATMOUNT_OPT_ARRAY eingeführt, um eine Liste von Dateisystemoptionen als nullterminiertes String-Array zurückzugeben, ohne die Escape-Sequenz «\000» zu verwenden. Unterstützung für die Rückgabe des Dateisystemtyps (fs_subtype, zur Bestimmung der Verwendung von FUSE), für Optionen zum sicheren Mounten und für den ursprünglichen Superblock (sb_source) wurde hinzugefügt.
- In OverlayFS wurde die Möglichkeit eingeführt, Schichten über Dateideskriptoren anzugeben, anstatt über Dateipfade.
- In das Dateisystem tmpfs wurde die Option „casefold“ für ein case-insensitives Arbeiten sowie die Option „strict_encoding“ zum Verhindern der Erstellung von Dateien mit ungültigen UTF-8-Zeichen hinzugefügt.
- Ein neuer Satz von Systemaufrufen zur Verwaltung von erweiterten Dateiattributen wurde vorgeschlagen: setxattrat(), getxattrat(), listxattrat() und removexattrat(). Im Gegensatz zu den Systemaufrufen setxattr(), getxattr(), listxattr() und removexattr() erfordern die neuen Varianten die Angabe des Dateideskriptors des Verzeichnisses, auf das sich der Dateipfad bezieht.
- In Btrfs wurde die ioctl-Operation BTRFS_IOC_SUBVOL_SYNC_WAIT hinzugefügt, die das Warten auf den Abschluss der Bereinigung von Untervolumina umfasst und es ermöglicht, den Befehl «btrfs subvolume sync» durch einen nicht privilegierten Benutzer auszuführen, der keinen Zugang zu ioctl SEARCH_TREE hat (nützlich in Backup-Anwendungen, die Untervolumina bereinigen). Die ioctl-Operation ENCODED_READ wurde hinzugefügt, um kodierte Daten über io_uring zu lesen, beispielsweise um komprimierte Extents direkt ohne Dekomprimierung zu lesen. Die Arbeiten zum Übergang zur Verwendung von Seiten-Folianten (page folios) wurden fortgesetzt. Die Entstehung von konkurrierenden Sperren („lock contention“) bei der Suche nach eingebetteten Rückverweisen und beim Durchlaufen von Buffer-Extents wurde reduziert. Die Effizienz der Komprimierung der Extent-Karte wurde verbessert.
- Im EROFS-Dateisystem (Extendable Read-Only File System), das für die Verwendung auf Partitionen entwickelt wurde, die im Nur-Lese-Modus verfügbar sind, wurde die Möglichkeit zur Verwendung der Optionen SEEK_HOLE und SEEK_DATA im Systemaufruf lseek() implementiert.
- F2FS unterstützt jetzt die Gerätealiasierung, die es ermöglicht, temporär einen Bereich in F2FS zu reservieren, um eine Partition des Blockgeräts in einem anderen Dateisystem zu verwenden. Nach Abschluss der externen Operation kann der reservierte Bereich wieder in F2FS zurückgegeben werden. Zum Beispiel kann man ein Dateisystem mit dem Befehl "mkfs.f2fs -c /dev/vdc@vdc.file /dev/vdb" erstellen, nachdem dessen Inhalt im Gerät /dev/vdc reserviert und auf die Datei vdc.file gespiegelt wird. Der Bereich /dev/vdc kann dann für eigene Zwecke genutzt werden, beispielsweise um es für ein anderes Dateisystem zu formatieren. Um den reservierten Inhalt zurückzugeben, reicht es aus, die Datei vdc.file zu löschen.
- In XFS wurde die Unterstützung für Quotas auf Realtime-Geräten implementiert. Zudem wurde ein Metadatenverzeichnis (metadata directory) hinzugefügt, in dem alle Inodes mit Metadaten gespeichert werden.
- Im FUSE-Mechanismus wurde die Möglichkeit zur dynamischen Änderung der maximalen Seitenanzahl (FUSE_MAX_MAX_PAGES) implementiert, indem "sysctl fs.fuse.max_pages_limit" verwendet wird. Dabei kommen Seitenfolianten (page folios) zum Einsatz.
- In SMB wurde die Unterstützung für die POSIX-Erweiterungen für SMB3 implementiert, die für die Speicherung spezieller Dateitypen wie FIFO, Gerätedateien und symbolische Links erforderlich sind. Es wurde die Möglichkeit hinzugefügt, ein Laufwerk mit einem alternativen Passwort zu mounten, das bei der Passwortrotation verwendet wird. Eine neue Mount-Option "cifs.upcall" wurde eingeführt, um den Namensraum zu bestimmen. Außerdem wurde die Erkennung von symbolischen und Blockgeräten, die auf Windows NFS-Servern erstellt wurden, sichergestellt. Symbolische Links im WSL-Stil (Windows Subsystem for Linux) werden ebenfalls unterstützt.
- Die Dateisysteme UBIFS, ADFS, BEFS, HFS, HFSPLUS, HPFS, JFS und ECRYPTFS wurden auf die Verwendung der neuen API zum Mounten von Partitionen umgestellt.
- Die Dateisysteme ECRYPTFS, UFS und NILFS2 wurden auf die Verwendung von Seitenfolien (Page Folios) umgestellt.
- Speicher und Systemdienste
- Der Scheduler implementiert ein Modell der lazy Preemption (PREEMPT_LAZY), das dem Modell der vollumfänglichen Preemption für Echtzeitanwendungen (RR/FIFO/DEADLINE) entspricht, jedoch die Preemption normaler Aufgaben (SCHED_NORMAL) bis zur Tick-Grenze verzögert. Diese Verzögerung reduziert die Fälle von Preemption von Lock-Inhabern, was die Leistung näher an Konfigurationen bringt, die ein Modell der freiwilligen Preemption verwenden. Dadurch ermöglicht das neue Modell, die Möglichkeiten der vollumfänglichen Preemption für Echtzeitanwendungen zu bewahren, minimiert jedoch die Leistungseinbußen bei normalen Aufgaben. Darüber hinaus vereinfacht das neue Modell die Logik der Preemption-Operationen im Kernel, indem es Handler, die sich in anderen Komponenten des Kernels befinden (außerhalb des Task-Schedulers), aus dem Scheduling-Prozess ausschließt.
- Beim Zusammenstellen mit dem Clang-Compiler besteht die Möglichkeit, Optimierungen zu verwenden.
Quelle: opennet.ru
