Kernel-Log – Was 2.6.37 bringt (4): Architektur- und Infrastruktur-Code
Zum Kernel stießen erste Teile der Unterstützung zum Betrieb als Xen-Host (Dom0). LZO-Komprimierung soll den Wechsel in den und aus dem Ruhezustand beschleunigen. Nach jahrelanger Arbeit kommen fast alle Bereiche des Kernels nun ohne das Big Kernel Lock (BKL) aus.
- Thorsten Leemhuis
Bei der Freigabe von 2.6.37-rc6 hat Linus Torvalds vergangene Woche nochmal betont, den Linux-Kernel 2.6.37 nach den Urlaubstagen rund um den Jahreswechsel freigeben zu wollen. Zudem laufe es derzeit nicht ganz so ruhig, wie er es gerne hätte – das gilt vermutlich auch für den in Kürze erwartete siebte Vorabversion, denn kürzlich wurde eine Neuerung rückgängig gemacht, die die Verteilung der Hardware-Ressourcen hatte verbessern sollen.
Einen Überblick über diese und zahlreiche anderen Änderungen rund um den plattformspezifischen und Infrastruktur-Code des Kernels liefert der folgende vierte Teil der Kernel-Log-Mini-Serie "Was 2.6.37 bringt". Der erste Teil der Serie hatte sich bereits mit den Änderungen rund um Grafik-Hardware beschäftigt, der zweite mit denen rund um Dateisysteme und der dritte mit Anpassungen am Netzwerk- und Storage-Code. Zwischen den Jahren folgt der fünfte und letzte Teil, der sich mit weiteren Treibern und der sie umgebenden Kernel-Subsysteme beschäftigt.
Bye bye Big Kernel Lock
Einer Neuerung von 2.6.37 ließ Linus Torvalds besondere Aufmerksamkeit zukommen, indem er sie bei der Vorstellung der ersten Vorabversion von 2.6.37 explizit erwähnte: Die Kernbereiche des Linux-Kernels sind nun nicht mehr auf das Big Kernel Lock (BKL) angewiesen. Dabei handelt es sich um eine Locking-Technik aus den Anfangszeiten der Multiprozessor-Unterstützung von Linux, die Konflikte beim gleichzeitigen Zugriff auf zentrale Datenstrukturen im Kernel vermeidet. Sie war damals vergleichsweise einfach umsetzbar, sperrt aber subsystemübergreifend – das wirkt sich bei Systemen mit vielen Prozessorkernen negativ auf die Performance aus und kann zu langen Latenzen bei Systemaufrufen führen, die nicht nur im Echtzeit-Umfeld unerwünscht sind.
Über eine neue Option lassen sich jetzt sogar Kernel komplett ohne BKL konfigurieren. Auf eine Handvoll noch auf das BKL angewiesene Treiber und Dateisysteme muss man dann aber verzichten – die meisten sind für aktuelle Systeme eher uninteressant, wenn man vom UDF-Dateisystem absieht. Patches, damit auch das unter anderem für manche DVDs benötigte Dateisystem ohne das BKL arbeitet, kamen aber zu spät zur Aufnahme bei 2.6.37 und dürften in 2.6.38 einziehen.
Prozess-Management und Tracing
Der Scheduler versucht nun ein Verschieben von Echtzeit-Tasks auf andere Prozessorkerne zu vermeiden. Bei der Prozessverteilung rechnet der Scheduler die Zeit, die der Prozessor mit der Verarbeitung von IRQs verbraucht, nicht mehr dem gerade aktiven jeweiligen Prozess zu, damit der nicht weniger Zeit als vorgesehen erhält.
Über den Schalter "-V" kann das Probe-Subkommando von Perf nun an Probe-Points alle lokalen Variablen auflisten; mit Hilfe von "--externs" lassen sich alle globalen Variablen auflisten, die zugänglich sind. Neu ist auch die rudimentäre Unterstützung für Module in "perf probe".
Die neuen Jump-Label (u. a. 1, 2, 3, 4, 5) sollen den Overhead rund um die An- und Ausschaltfunktionen für Tracepoints weiter verringern – Details erläutert ein kurzer Artikel bei LWN.net. Im Feldtest zeigte sich allerdings, dass das Ganze doch noch nicht wie gewollt funktioniert, daher wird die Technik vor der Fertigstellung von 2.6.37 möglicherweise noch deaktiviert.
Security
Der Crypto-Daemon des Kernels bietet nun ein Interface für AEAD (Authenticated Encryption with Associated Data). Über einen Sysctl-Aufruf lässt sich nun festlegen, ob normale Anwender oder nur solche mit der Capability CAP_SYS_ADMIN Zugriff auf die Syslog-Informationen haben, die sich mit dmesg auslesen lassen; das soll Angriffe erschweren, die Informationen aus dem Syslog zur Hilfe nehmen.
Ursprünglich sollten Lesebeschränkungen für /proc/kallsyms Angreifern das Leben weiter erschweren – die Änderung wurde aufgrund von Problemen mit Userland-Anwendungen aber zurückgezogen. Hintergründe dazu liefert LWN.net im Artikel "Making attacks a little harder"; einige Tage nach Rücknahme der Änderung wurde eine Umsetzung mit Capabilities vorgeschlagen, doch auch die fand fürs erste keinen Anklang.
Virtualisierung
Unter den von den Xen-Entwicklern für Linux 2.6.37 beigesteuerten Änderungen war auch der "Initial Domain Support", der den Kernel um Funktionen zum Betrieb als Dom0 erweitert (u. a. 1, 2, 3, 4, 5, 6, 7). Xen-Anwendern ist das aber fürs erste keine große Hilfe, da der Treiber zum Aufsetzen der Xen-Backends fehlt, über die die Gastsysteme auf Datenträger und Netzwerk zugreifen. Die Xen-Entwickler planen, den dafür zuständigen Code zur Aufnahme bei 2.6.38 einzusenden, sodass mit dieser Version der Dom0-Betrieb möglich sein könnte. Beim diesem und dem jetzt in den Kernel integrierten Xen-Code handelt es sich jedoch um eine abgespeckte Variante, die weniger Funktionen bietet als aktuelle Xen-Versionen oder der XenServer von Citrix.
[pagebreak ACPI, PCI und mehr]
ACPI und PCI
Der neue Autosuspend Support im Power-Management-Code des Kernels erleichtert Treibern die Nutzung der Funktionen von zur Laufzeit nutzbaren Stromsparfunktionen von Geräten. Beim Wechsel in den Software Suspend kann der Kernel das Abbild des Arbeitsspeichers mit LZO komprimieren; das beschleunigt den Wechsel in den und aus dem Ruhezustand, da weniger Daten mit der Festplatte austauscht werden müssen. Wie viel Arbeitsspeicher in das Image geschrieben wird, ist nun nicht mehr fest vorgegeben, sondern von der Menge des Arbeitsspeichers abhängig , was für viele moderne Systeme sinnvoller ist.
Nachdem die ACPI-Entwickler bereits bei 2.6.36 zahlreiche ACPI-Interfaces im Procfs entfernt hatten, musste nun einige als "deprecated" gekennzeichnete Schnittstellen dran glauben, die die Fan-, Thermal-, und Video-Treiber exportierten; als Ersatz dienen Sysfs-Dateien unter /sys/class/thermal/cooling_device*/, /sys/class/thermal/thermal_zone*/ und /sys/class/backlight/. Bei 2.6.38 sollen die Funktionen verschwinden, die /proc/acpi/processor/*/throttle bereitstellt – einen Ersatz gibt es nicht, denn laut Commit-Kommentar gibt es keine Grund, warun User diesen Überhitzungsschutz beeinflussen sollten.
Bjorn Helgaas hatte einige tief greifende Änderung am Code zur Ressourcenverteilung eingebracht, durch die Linux bei der Hardware-Konfiguration in einigen Bereichen etwas mehr in der von Windows genutzten Art vorgegangen wäre – es kam zeigten sich jedoch Probleme, daher wurden die Änderungen zum RC7 zurück genommen.
Verschiedenes
- Der Befehl "make xconfig" erzeugt nun ein Konfigurationsprogramm mit Qt4 statt Qt3, sofern dessen Entwicklerdateien vorliegen (1, 2).
- Durch Eingabe von "/" lässt sich im per "make nconfig" aufgerufenen Text-Konfigurationsprogramm nun ähnlich wie etwa bei Firefox ein interaktiver Suchmodus aufrufen.
- Das Fanotify-Schnittstelle für On-Access-Virenscanner lässt sich nun nutzen – die Kernel-Hacker hatten sie bereits für 2.6.36 integriert, dann aber kurz vor der Fertigstellung dieser Version deaktiviert, da einige Ungereimtheiten aufgetaucht waren, deren Beseitigung größere Änderungen erforderten.
- Der Kernel bietet nun eine dritte, TINY_PREEMPT_RCU genannte Implementation zum Read Copy Update (RCU). Sie ist auf Uniprozesser-Systeme abgestimmt und verbraucht weniger Speicher als der normale RCU-Code (TREE_PREEMPT_RCU), ist aber im unterschied zum noch kleineren und sparsameren TINY_RCU unterbrechbar (Preemptible) und dadurch auch für den Echtzeit-Einsatz interessant.
- Der X86-Code nutzt statt "bootmem" nun den aus LMB hervorgegangenen und bereits bei anderen Architekturen genutzten Memblock-Allocator (Urpsünglich LMB/Logical Memory Block) zum Allozieren von Arbeitsspeicher (u. a. 1 , 2, 3); Hintergründe zu dieser Umstellung und den mit ihr verbundenen Risiken liefert H. Peter Anvin in einem Git-Pull-Request.
- Hwpoison kann die Nutzung defekter Speicherbereiche nun per Soft Offlining auch unterbinden, wenn der Kernel diese Speicherbereiche mit großen Speicherseiten (Huge Pages) anspricht (u. a. 1, 2, 3, 4); einige Hintergründe dazu liefert Andi Kleen in seinem Haupt-Git-Pull-Request. Zusammen mit diesem Code kam stießen Basis-Funktionen zur Migration von Huge Pages zum Kernel (u. a. 1, 2) – es sind aber weitere Patches nötig, bevor der Kernel große Speicherseiten tatsächlich verschieben kann.
[pagebreak Die kleinen Perlen]
Die kleinen Perlen
Viele kleinere, aber keineswegs unbedeutende Neuerungen finden sich in der folgenden Liste mit den englischen Commit-Überschriften der jeweiligen Änderung. Die Einträge verlinken genau wie viele der Verweise im vorangegangenen Text auf das Webfrontend des von Linus Torvalds gepflegten Git-Zweigs mit den "offiziellen" Kernel-Quellen auf Kernel.org. Der über diese Links angezeigten Commit-Kommentar und der darunter ausgegebene Patch liefern zahlreiche weitere Informationen zur jeweiligen Änderungen.
Vor jedem Link finden sich in eckigen Klammern einige Buchstaben und Zahlen. Ein "C" kennzeichnet Patches mit Änderungen an Kconfig-Dateien, welche die Hilfetexte und Konfigurationsoptionen enthalten, die bei der Kernel-Konfiguration über "make menuconfig", "make xconfig" und ähnliche Werkzeuge angezeigt werden. Ein "D" steht bei Patches, die die Dokumentation verändern, die im Kernel-Zweig unterhalb von Documentation/ liegt. Ein "N" weist Änderungen aus, die eine neue Datei anlegen. Die Zahl vermittelt einen groben Eindruck zur Größe des Patches: eine "1" steht etwa für Änderungen, die inklusive Kommentar zwischen 10 und 20 KByte groß sind, eine "2" für solche, die zwischen 20 und 30 KByte Umfang haben; Änderungen ohne Zahl sind kleiner als 10 KByte, Patches mit einer "9" hingegen 90 KByte oder größer.
ACPI, PNP
- [
C 1
] ACPI ac/battery/sbs: sysfs I/F always built in, procfs I/F disabled by default - [
1
] ACPI / ACPICA: Defer enabling of runtime GPEs (v3) - [
- [
- [
- [
- [
- [
N3
] ACPICA/ACPI: Add new host interfaces for _OSI support - [
- [
- [
- [
N2
] ACPICA: Obsolete the acpi_os_derive_pci_id OSL interface - [
- [
- [
- [
- [
- [
- [
C
] ACPI: Only processor needs CPU_IDLE - [
- [
- [
BKL removal
- [
- [
- [
2
] BKL: Explicitly add BKL around get_sb/fill_super - [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
5
] BKL: Remove BKL from ncpfs - [
- [
- [
- [
- [
- [
- [
- [
6
] block: autoconvert trivial BKL users to private mutex - [
- [
5
] drivers: autoconvert trivial BKL users to private mutex - [
1
] fs/locks.c: prepare for BKL removal - [
- [
- [
- [
9
] llseek: automatically add .llseek fop - [
- [
C
] lockd: push lock_flocks down - [
C
] locks: turn lock_flocks into a spinlock - [
- [
C 1
] [media] v4l: kill the BKL - [
- [
- [
- [
- [
2
] scsi: autoconvert trivial BKL users to private mutex - [
- [
1
] V4L/DVB: bttv: fix driver lock and remove explicit calls to BKL [1
] V4L/DVB: em28xx: remove BKL
Crypto, Security
- [
C N2
] crypto: omap-aes - OMAP2/3 AES hw accelerator driver - [
- [
C
] move async raid6 test to lib/Kconfig.debug - [
3
] SELinux: allow userspace to read policy back out of the kernel - [
N1
] selinux: fast status update interface (/selinux/status) - [
Memory Management
- [
D
] delay-accounting: reimplement -c for getdelays.c to report information on a target command - [
D
] doc: clarify the behaviour of dirty_ratio/dirty_bytes - [
- [
- [
- [
DN
] mm: highmem documentation - [
- [
- [
- [
DN
] oom: document obsolete oom_adj tunable - [
- [
1
] slub: Dynamically size kmalloc cache allocations - [
C
] slub: Enable sysfs support for !CONFIG_SLUB_DEBUG - [
- [
1
] writeback: do not sleep on the congestion queue if there are no congested BDIs or if significant congestion is not being encountered in the current zone
PCI, PCMCIA
- [
1
] genirq: Implement a sane sparse_irq allocator - [
- [
- [
C
] genirq: Provide config option to disable deprecated code - [
C N
] genirq: Provide Kconfig - [
C 1
] genirq: Remove the now unused sparse irq leftovers - [
D
] genirq-update-kerneldoc.patch - [
- [
- [
- [
- [
- [
- [
C
] PCI: OLPC: Only enable PCI configuration type override on XO-1 - [
- [
- [
C N2
] pci root complex: support for tile architecture - [
C
] PCI: update Intel chipset names and defines - [
D 8
] pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device - [
D 4
] pcmcia: do not use win_req_t when calling pcmcia_request_window() - [
4
] pcmcia: introduce autoconfiguration feature - [
D 9
] pcmcia: use autoconfiguration feature for ioports and iomem - [
- [
- [
C N1
] spi: add spi_tegra driver - [
C N2
] spi/fsl_spi: add eSPI controller support - [
- [
2
] spi/pl022: add PrimeCell generic DMA support - [
C N4
] spi/topcliff: Add topcliff platform controller hub (PCH) spi bus driver - [
C
] spi/topcliff: Tidy up Kconfig help text - [
- [
- [
N
] x86: avoid low BIOS area when allocating address space - [
Power Management
- [
- [
- [
D
] PM: Add sysfs attr for rechecking dev hash from PM trace - [
- [
- [
- [
CDN4
] PM: Introduce library for device-specific OPPs (v7) - [
CD
] PM / OPP: Hide OPP configuration when SoCs do not provide an implementation - [
D 1
] PM / Runtime: Add no_callbacks flag - [
1
] PM / Runtime: Merge synchronous and async runtime routines [D 3
] PM / Wakeup: Introduce wakeup source objects and event statistics (v3)
Scheduler
- [
- [
- [
- [
N
] sched: Create special class for stop/migrate work - [
- [
- [
- [
- [
- [
- [
- [
- [
- [
Tracing
- [
C
] coredump: default CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y - [
N2
] ftrace: Add C version of recordmcount compile time code - [
- [
- [
C N
] jump label: Add sparc64 support - [
CDN
] kdb: Add kdb kernel module sample - [
- [
- [
D
] kprobes: Update document about irq disabled state in kprobe handler - [
- [
N
] netdev: Add tracepoints to netdev layer - [
- [
- [
- [
- [
- [
N1
] perf: Add a script to show packets processing - [
- [
- [
- [
- [
- [
N
] perf python scripting: Add futex-contention script - [
1
] perf: Remove the sysfs bits - [
5
] perf: Rework the PMU methods - [
- [
- [
- [
- [
- [
- [
- [
- [
2
] perf, x86, Pentium4: Add RAW events verification - [
- [
- [
- [
- [
- [
D 3
] tracing, vmscan: add trace events for LRU list shrinking
Virtualization
- [
- [
D
] KVM: document 'kvm.mmu_audit' parameter - [
D
] KVM: Document that KVM_GET_SUPPORTED_CPUID may return emulated values - [
D
] KVM: fix the description of kvm-amd.nested in documentation - [
- [
C
] KVM: MMU: support disable/enable mmu audit dynamicly - [
DN
] KVM: PPC: Add Documentation about PV interface - [
D
] KVM: PPC: Add documentation for magic page enhancements - [
D
] KVM: PPC: Add get_pvinfo interface to query hypercall instructions - [
D
] KVM: PPC: Add mtsrin PV code - [
D
] KVM: PPC: Document KVM_INTERRUPT ioctl - [
- [
C N
] KVM: PPC: Generic KVM PV guest support - [
N1
] KVM: PPC: Implement hypervisor interface - [
- [
- [
- [
- [
- [
- [
- [
- [
- [
DN3
] KVM: x86: Add timekeeping documentation - [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
- [
1
] KVM: x86 emulator: use correct type for memory address in operands - [
D
] KVM: x86: explain 'no-kvmclock' kernel parameter - [
- [
- [
- [
- [
D
] lguest: replace VIRTIO_F_BARRIER support with VIRTIO_F_FLUSH support - [
- [
- [
D
] paravirt: noreplace-paravirt is implemented for x86 and ia-64 - [
N
] xen: add /proc/xen/xsd_{kva,port} to xenfs - [
- [
- [
C 1
] xen: convert p2m to a 3 level tree - [
N
] xen: define BIOVEC_PHYS_MERGEABLE() - [
- [
- [
N
] xen: register xen pci notifier
Various
- [
N
] atomic: add atomic_inc_not_zero_hint() - [
- [
D
] cgroup: add clone_children control file - [
- [
D
] cgroup: notify ns_cgroup deprecated - [
- [
N
] Coccinelle: Add api/kstrdup.cocci - [
N
] Coccinelle: Add api/memdup.cocci - [
N
] Coccinelle: Add api/memdup_user - [
- [
N
] Coccinelle: Add free/kfree.cocci - [
N
] Coccinelle: Add iterators/fen.cocci - [
N
] Coccinelle: Add iterators/itnull.cocci - [
N
] Coccinelle: Add iterators/list_entry_update.cocci - [
N
] Coccinelle: Add locks/call_kern.cocci - [
N
] Coccinelle: Add locks/double_lock.cocci - [
N
] Coccinelle: Add locks/mini_lock.cocci - [
N
] Coccinelle: Add misc/doubleinit.cocci - [
N
] Coccinelle: Add misc/ifcol.cocci - [
N
] Coccinelle: Add null/eno.cocci - [
N
] Coccinelle: Add null/kmerr.cocci - [
N
] Coccinelle: Find doubled arguments to boolean or bit operators. - [
N
] Coccinelle: Find nested lock+irqsave functions that use the same flags variables. - [
D
] Coccinelle: Fix documentation - [
D
] Coccinelle: Update documentation - [
- [
D
] docbook: add idr/ida to kernel-api docbook - [
D
] Documentation/development-process: more staging info - [
D
] Documentation/development-process: use -next trees instead of staging - [
D
] Documentation/filesystems/proc.txt: improve smaps field documentation - [
D 1
] Documentation/kbuild: major edit of modules.txt sections 1-4 - [
D 1
] Documentation/kbuild: major edit of modules.txt sections 5-8 - [
D
] Documentation/kbuild: modules.txt cleanup - [
D
] Documentation: make configfs example code simpler, clearer - [
D
] Documentation/timers/hpet_example.c: add supporting info for hpet_example - [
D
] documentation: update sysrq.txt magic sysrq keys - [
C 1
] driver core: remove CONFIG_SYSFS_DEPRECATED_V2 but keep it for block devices - [
- [
- [
- [
- [
- [
- [
C N1
] kbuild: migrate all arch to the kconfig mainmenu upgrade - [
D
] kbuild: Really don't clean bounds.h and asm-offsets.h - [
- [
- [
- [
- [
- [
- [
- [
D
] kconfig: implement the `mainmenu' directive - [
- [
5
] kconfig: regen parser - [
- [
1
] kconfig: rephrase help texts/comments not to include the package name - [
- [
C
] lib/Kconfig.debug: add list_sort debugging switch - [
C
] namespaces: remove pid_ns and net_ns experimental status - [
- [
C
] percpu_counter: add debugobj support - [
- [
C 1
] percpu: use percpu allocator on UP too - [
C 1
] percpu: use percpu allocator on UP too - [
D
] /proc/pid/pagemap: document in Documentation/filesystems/proc.txt - [
D
] /proc/pid/smaps: export amount of anonymous memory in a mapping - [
- [
N
] ramoops: use the platform data structure instead of module params - [
C
] rcu: Add advice to PROVE_RCU_REPEATEDLY kernel config parameter - [
- [
D
] rcu: add shiny new debug assists to Documentation/RCU/checklist.txt - [
D
] rcu: Add tracing data to support queueing models - [
- [
C
] rcu: Allow RCU CPU stall warnings to be off at boot, but manually enablable - [
- [
D
] rcu: document ways of stalling updates in low-memory situations - [
C
] rcu: Fix RCU_FANOUT help message - [
C
] rcu: make CPU stall warning timeout configurable - [
C
] rcu: restrict TREE_RCU to SMP builds with !PREEMPT - [
D
] rcu: upgrade stallwarn.txt documentation for CPU-bound RT processes - [
- [
- [
- [
- [
- [
- [
- [
- [
- [
3
] scripts/get_maintainer.pl: improve --interactive UI - [
- [
N
] TTY: create drivers/tty and move the tty core files there - [
N
] TTY: create drivers/tty/vt and move the vt code there - [
C 3
] Update broken web addresses in arch directory. - [
C 9
] Update broken web addresses in the kernel. - [
D
] Update call_rcu() usage, add synchronize_rcu() - [
D
] Update documentation to note the passage of INIT_RCU_HEAD() - [
C
] vmcore: it is not experimental any more - [
- [
D
] workqueue: add and use WQ_MEM_RECLAIM flag - [
- [
- [
- [
Weitere Hintergründe und Informationen rund um Entwicklungen im Linux-Kernel und dessen Umfeld finden sich in den vorangegangenen Kernel-Logs auf heise open. Neue Ausgaben des Kernel-Logs werden auf den Identi.ca- und Twitter-Konten "@kernellog" erwähnt; die englischen, bei den Kollegen von "The H" erscheinenden Übersetzungen auf den Identi.ca- und Twitter-Konten "@kernellog2". Gelegentlich zwitschert der Autor des Kernel-Logs unabhängig davon über einige Kernel-Log-Themen bei Identi.ca und Twitter als "@kernellogauthor". (thl). (thl)