Der Frühlings-Kernel Linux 5.12 ermöglicht Eager Writes für NFS, erlaubt es, Dateien und Verzeichnisse mehrfach zu mounten, und bringt einen Zoned-Modus für Btrfs mit.
Die Veröffentlichung von Kernel 5.12 Ende April ging diesmal fast vor dem Hintergrund einer anderen Diskussion unter, der um den Rust-Support in Linux. Als zweite Kernel-Sprache könnte Rust für Linux eine wichtige Weiche in Richtung Zukunft stellen.
Dass Linus Torvalds Rust-Modulen grundsätzlich aufgeschlossen gegenübersteht, weiß man seit letztem Jahr. Dank eines Threads von Miguel Ojeda nimmt die Sache nun weiter an Fahrt auf. Unter dem Titel “[RFC] Rust Support” [1] machte er einen Vorschlag zu einer zweiten Sprache im Kernel und wies auch auf ein entsprechendes Git-Repository hin [2]. Zugleich lieferten Ojeda und seine Mitstreiter erste Codebeispiele, um die sich dann eine ausführliche Diskussion entspann.
@L”I don’t hate it”, kommentierte Linus Torvalds, was man wohl als generelle Zustimmung interpretieren darf. Konkret stören den Kernel-Chef allerdings zwei Dinge am aktuellen Rust-Code: Paniken zur Laufzeit und die Art der Codebeispiele. An einigen Stellen, etwa wenn der Speicher ausgeht, wirft Rust zur Laufzeit eine Panik-Fehlermeldung und beendet sich. Die Fehlermeldung sei zwar angebracht, meint Torvalds, aber auf keinen Fall dürfe der Code die Ausführung stoppen. Zudem sei der vorgestellte Binder-Treiber kein typischer Linux-Treiber; hier wünscht sich der Linux-Vater etwas mehr Realitätsbezug.
Letzterem stimmt auch Greg Kroah-Hartman zu. Ein Rust-Treiber müsse beweisen, dass trotz unterschiedlicher Lifetime-Regeln beim Erzeugen von Objekten eine Brücke zwischen dem Rust-Treibercode und dem in C geschriebenen Kernmodell für Linux-Treiber möglich sei. Zugleich betonte Kroah-Hartman aber auch, dass das Umsetzen des gezeigten Rust-Patchsets eine bemerkenswerte Leistung darstelle.
Die Rust-Entwickler scheinen die Kritik zu akzeptieren und überlegen bereits, wie sie die Anforderungen in den Rust-Bibliotheken umsetzen. Laut Josh Triplett gibt es bereits eine Reihe von Allocation-APIs, dank denen Methoden unterschiedlich auf Allokationen reagieren – einmal mit einer Panik, einmal mit einer Fehlermeldung.
Business as usual
Neben der Diskussion um Rust gab es aber auch Business as usual, zumindest weitgehend: Bereits bei der Veröffentlichung von Linux 5.12rc-5 attestierte Chefentwickler Torvalds dem Kernel einen ungewöhnlich großen Umfang. Das führte Mitte April dann zu dem Entschluss, noch einen Release Candidate 8 folgen zu lassen.
Zu den Entwicklern, die in ihrer Release-Mitteilung größere Änderungen ankündigten, gehört Darrick Wong. Er und die XFS-Entwickler arbeiten an einem Feature, um das Dateisystem im Betrieb zu schrumpfen, und legten dazu erste Grundsteine. Zugleich fand ein größeres Refactoring am Garbage-Collection-Code statt, der neuerdings ein Scheduling für jede Allocation Group erlaubt und damit Multithreading ermöglicht [3].
Die F2FS-Entwickler rund um Jaegeuk Kim brachten zwei Änderungen ein, die das Kompressionslevel und den »checkpoint_merge« betreffen. Bei der ersten handelt es sich um eine Erweiterung für die Mount-Option »compress_algorithm«. Sie erlaubt, für die Kompressionsalgorithmen LZ4 und Zstd Kompressionslevelbereiche zu definieren. Setzen F2FS-Nutzer die Option »checkpoint_merge«, erzeugen sie einen Kernel-Daemon und pflegen darüber parallele Checkpoint-Requests ein, was Redundanzen eliminiert.
Auch bei langsamen Checkpoint-Operationen kann die Option helfen. Letztere entstehen etwa dadurch, dass Checkpoints in einem Prozesskontext laufen, dem die Cgroups nur ein niedriges I/O-Budget und wenig CPU-Zeit einräumen. Hier hilft es, einfach die I/O-Priorität des Kernel-Daemons zu erhöhen [4].
Die Btrfs-Entwickler melden ebenfalls Leistungsverbesserungen und Feature-Updates. Zum ersten Bereich gehört, dass gelöschte Blockgruppen-Mutexe Btrfs nicht mehr blockieren und das Flushing besser funktioniert. Zu den neuen Features zählt »Subpage block size«, das sich auf Dateisysteme mit unterschiedlichen Page-Größen auswirkt. Es läuft bislang nur im Read-only-Modus und mit Page-Größen von 4 bis 64 KByte.
Auch der Zoned-Modus, der Support für Zoned-Block-Devices einführt, funktioniert, wenn auch noch in engen Grenzen. Unter anderem gibt es einen SMR/ZBC/ZNS-freundlichen Allokierungsmodus und Tree-Log-Support für dedizierte Blockgruppen, um ungeordnete Schreibvorgänge zu vermeiden [5].
Lokal vernetzt
Entwicklerinnen und Entwickler haben auch an den Netzwerkdateisystemen geschraubt. So gibt es für CIFS zwei neue Mount-Optionen, um das Attribut-Caching zu kontrollieren. Außerdem arbeitet die »cifsacl«-Mount-Option zuverlässiger [6].
NFS kennt nun Eager Writes für den Client, um Daten am Kernel vorbei direkt in den Server-Cache zu schreiben und das Ende der Transaktion abzuwarten. Auf diese Weise tauchen »ENOSPC«-Fehler sofort auf. Auch die Mount-Optionen »write=eager« und »write=wait« gehören in diesen Kontext [7].
Der Device Mapper ergänzt laut Entwickler Mike Snitzer den Kernel-Key-Type »Trusted« [8], während Herbert Xu einige Krypto-Module aus dem Kernel entfernte, darunter RIPE-MD, Tiger und Salsa20 sowie einige Treiber (»PicoXcell« und »mediatek«).
Jens Axboe freute sich über schlankeren Code im Umgang mit den »io-qw«-Workern, die sich von den zugewiesenen Tasks abspalten lassen, anstatt Kernel-Threads zu sein, die viele Vermutungen über die Bestandteile der Original-Tasks anstellen müssen. Dank der identischen Worker sei man nun sicherer, bei den Dateitypen nichts mehr zu übersehen, das ganze Konstrukt funktioniere zudem effizienter. Nicht zuletzt sei der entfernte Code besonders fehleranfällig gewesen [9]. Einen weiteren Leistungsgewinn erzielt »io_uring« durch Request Cache Recycling [10].
Bleiben Performance-Fragen offen, weil Entwickler einen Bottleneck nicht finden, helfen das Perf-Tool und seine Unterkommandos. Neuerdings liefert »perf report« etwa auch Informationen zu Speicher- und Instruktionsverzögerungen, was den Kernel-Nutzern helfen soll, kostspielige Load-Instruktionen aufzuspüren und die in den verschiedenen Stages verbrachte Zeit besser zu verstehen [11].
Christian Brauner ergänzt diesmal ID-mapped Mounts, ein Feature, das es mehreren Nutzern erlaubt, Dateien und Verzeichnisse mehrfach mit unterschiedlichen Besitzerrechten zu mounten. Unter anderem soll das Feature bei den Portable Homes zum Einsatz kommen und es vereinfachen, Dateien zwischen unterschiedlichen Anwendern und Maschinen zu teilen [12].
Rückfallversicherung
Eine Handvoll Patches versprechen auch die SELinux-Entwickler. So lassen sich anonyme Inodes benennen, was die Entwickler auch auf den Syscall »userfaultfd()« ausgeweitet haben. Letzterer erlaubt On-Demand-Paging aus dem Userspace, der so die Kontrolle über Memory-Page-Fehler erhält. Andernfalls fällt das dem Kernel-Bereich zu.
Von Andrew Morton kommt Kfence, ein Runtime Memory Validator [13], der Out-of-Bound-Zugriffe auf den Heap, Use-after-free- sowie Invalid-free-Fehler entdeckt. Laut Morton sei Kfence, das für Kernel Electric Fence steht, nicht so ausgefeilt wie KASAN, erzeuge aber auch kaum Overhead.
Genfs-Labeling bezeichnet die Möglichkeit, ein Dateisystem mit Security-Attributen zu versehen. Sie dient SELinux nun als Fallback, wenn ein Dateisystem keinen Support für Extended Attributes (»xattr«) mitbringt. Die Entwickler nennen als Use Case dafür Virtio-FS. Über dieses Shared-Filesystem greifen virtuelle Maschinen auf die Dateisysteme ihrer Hosts zu, wobei der »xattr«-Support jedoch vom darunterliegenden Dateisystem abhängt.
Infos
- Rust-Diskussion: https://lkml.org/lkml/2021/4/14/1023
- Git-Repository Rust for Linux: https://github.com/Rust-for-Linux
- XFS-Updates: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b52bb135aad99deea9bfe5f050c3295b049adc87
- F2FS-Updates: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8b42fe123b013fbdc3172616b27d568d0cb9d2d6
- Patches für Btrfs: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6f3952cbe00b74739f540981d1afe84cd4dac879
- CIFS: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c19798af2e66d9d3eb1060873bb435ea8bf4ad2e
- Eager Writes für NFS: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1c9077cdecd027714736e70704da432ee2b946bb
- Device-Mapper: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=325b764089c9bef2be45354db4f15e5b12ae406d
- Async-Updates: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5695e51619745d4fe3ec2506a2f0cd982c5e27a4
- Neuerungen für »io_uring«: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bbb336ba75d95611a7b9456355b48705016bdb1
- Perf-Optimierungen: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a36281a17199737b468befb826d4a23eb774445
- ID-mapped Mounts: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7d6beb71da3cc033649d641e1e608713b8220290
- Kfence: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=245137cdf0cd92077dad37868fe4859c90dada36






