Portál AbcLinuxu, 5. května 2025 23:46
Aktuální verze jádra: 2.6.27. Citáty týdne: Andrew Morton, Linus Torvalds, Adrian Bunk. Začleněno do 2.6.28. Bloková vrstva: Disky bez pohyblivých částí; Afinita požadavků; Obsluha vypršení časového limitu; Další změny v rychlosti.
Tento článek je překladem z anglického originálu, a proto vychází se zpožděním.
Jádro 2.6.27 je venku, Linus ho vydal 9. října. Pro ty, kteří si nás právě naladili, 2.6.27 obsahuje (mezi mnoha dalšími věcmi) UBIFS, podporu pro testování integrity v blokové vrstvě, vícefrontové síťování, sledovací framework ftrace, bezzámkovou cache stránek, přemístění spousty firmwarů, sadu ovladačů pro webkamery GSPCA, mnoho rozšířených systémových volání. Vizte jako vždy excelentní shrnutí na KernelNewbies, kde o tomto vydání najdete mnohem více informací.
V současnosti je otevřeno začleňovací okno 2.6.28, v době psaní tohoto článku je začleněno okolo 4100 sad změn. Vizte článek níže, ve kterém najdete shrnutí změn, které byly v tomto vývojovém cyklu do jádra začleněny.
Současná stabilní jádra jsou 2.6.25.18 a 2.6.26.6, která byla vydána 8. října. Obě obsahují dlouhý seznam důležitých oprav v celém jaderném stromě.
aah, hodně se mi líbí err_ick a err_fck. Zní jako komentáře ke kódu od akpm na konci dlouhého dne.
Prostě by sis měl pořídit skutečné jméno, ne ten "John Smith" nesmysl. Nějaké mužné. Nějaké unikátní. Nějaké silné. Nějaké, které říká, že nejsi jenom prostě další klon.
Něco jako "Linus Torvalds". Až na to, že ne přesně tohle.
-- Linus Torvalds (Díky Matthewovi Burgessovi)
On Tue, 14 Oct 2008, Jean Delvare wrote: > > Marek Vasut (1): > i2c/tps65010: Vibrator hookup to gpiolib
Chlapi, vím, že my geekové nejsme vyhlášení svým sexuálním životem, ale musíme na to tak upozorňovat?
-- Linus Torvalds (díky Davidu Langovi a Walterovi Franzinimu)
2.6.16 trochu zestárlo, takže následujících pár let budu udržovat jako náhradu 2.6.27.
Stejně jako u 2.6.16 převezmu údržbu poté, co skončí běžná správa -stable teamem (nějaký čas poté, co bude v lednu vydáno 2.6.28).
Mým záměrem je zaplnit niku pro uživatele, kteří nepoužívají distribuční jádra, ale kteří chtějí delší dobu používat jádro bez regresí. Může to být malá část uživatelské základny, ale po zkušenostech s 2.6.16 můžu říci, že je docela dost uživatelů, kteří takovou nabídku oceňují.
-- Adrian Bunk
V době psaní tohoto článku bylo do jádra 2.6.28 zahrnuto 4193 neslučovacích [non-merge] sad změn. Jinými slovy je začleňovací okno teprve na začátku, začleněna byla pravděpodobně méně než polovina ze všech patchů, které si najdou svou cestu do hlavní řady. Co vidíme, je spousta ovladačů a inkrementálních zlepšení, ale žádné velké změny.
Změny viditelné pro uživatele zahrnují:
Jsou zde nové ovladače pro:
Podpora pro staré sériové porty architektury Sun 4 a ColdFire byla odstraněna
Nový soubor v sysfs (unload_heads), kterým může uživatelský proces říct ATA disku, aby zaparkoval hlavičky a připravil se na náraz. Při použití společně s akcelerometrem může být tato vlastnost použita při pokusu zachránit disk v padajícím laptopu (vizte ThinkPad HDAPS - jak zprovoznit otřesové čidlo).
Vylepšená podpora pro ptrace() - a především podpora pro precizní na událostech založené vzorkování - byla přidána do architektury x86.
Crypto subsystém získal podporu pro deterministické generování pseudonáhodných čísel ANSI X9.31 A.2.4
Bezpečnostní modul SMACK lze nyní nakonfigurovat tak, aby vynucoval povinná pravidla přístupu u privilegovaných procesů.
Skript, který lze použít k vygenerování minimální "hloupé" (dummy) politiky pro SELinux. Nejmenší použitelná politika je, zdá se, 587 řádek dlouhá.
Některé zvukové karty umí detekovat připojení zařízení na vstupních a výstupních jack konektorech. ALSA vrstva nyní ovladačům umožňuje u těchto karet detekovat tyto jacky a ohlásit připojení zařízení ke kartě přes vstupní [input] vrstvu.
Práce na vícefrontovém síťování pokračuje; 2.6.28 bude obsahovat schopnost spojit oddělenou frontovou disciplínu s každou interní frontou packetů.
Subsystém pro vyhovění bezdrátovým předpisům byl začleněn.
Jádro nyní podporuje packetový protokol Phonet používaný modemy Nokia pro mobilní sítě. Více informací vizte networking/phonet.txt v jaderném adresáři s dokumentací.
Do jádra síťování byla také přidána podpora pro protokol distribuované architektury switchů [Distributed Switch Architecture protocol] s počáteční podporou pro mnoho přepínacích čipů Marvell.
Do vrstvy netfilteru byla doplněna podpora pro síťové jmenné prostory.
Souborový systém ext4 ztratil jméno "ext4dev"; to je signál, že se vývojáři připravují na to prohlásit ho za připravený pro produkční nasazení. Ext4 také získal sadu statických sledovacích bodů pro použití SystemTapem nebo dalšími sledovacími nástroji.
Bylo přidáno FIEMAP ioctl() pro mapování rozsahů.
Xen přidává podporu pro hotplugging CPU.
Nyní je podporována verze 4 protokolu rpcbind; to umožňuje jádru nabízet RPC služby přes IPv6.
Souborový systém OCFS2 získal mnoho vlastností, včetně POSIXových zámků, rozšířených atributů a používání žurnálovací vrstvy JBD2.
Změny viditelné pro vývojáře jádra zahrnují:
Do blokové vrstvy byla přidána obsluha požadavků na vyřazení a časového limitu požadavků; také bylo provedeno mnoho interních změn API. Detaily vizte v tomto článku níže.
Ovladače Video4Linux2 již ve své funkci open() nedrží velký jaderný zámek. Volání lock_kernel() bylo zatlačeno do jednotlivých ovladačů ve stromě hlavní řady; externí ovladače bude potřeba opravit.
Začleňovací okno pravděpodobně zůstane otevřené do přibližně 24. října.
V začleňovacím okně 2.6.28 jsme mohli vidět přidání mnoha změn do blokové vrstvy. Zde je shrnutí nových vlastností a API, která se dostala dovnitř.
Je zde několik vylepšení zaměřených na zlepšení jaderné podpory úložných zařízení bez pohyblivých částí [solid-state]. Jedno z nich - vyřazovací API - zde bylo pokryto dříve. Toto API umožňuje vysokoúrovňovým uživatelům blokového subsystému (souborovým systémům) oznámit, že daný rozsah bloků již neobsahuje užitečná data. To umožňuje nízkoúrovňovému zařízení zahrnout tyto bloky do svého schématu sběru odpadu [garbage collection] a přestat se obávat o jejich obsah, když se provádí vyrovnávání opotřebení.
Od původního článku se nicméně toto API trochu změnilo. Požadavek na vyřazení se nyní vyšle takto:
int blkdev_issue_discard(struct block_device *bdev, sector_t sector, unsigned nr_sects);
Parametr end_io(), který byl k vidění v předchozí verzi API, již není přítomen. Pro volajícího již neexistuje způsob, jak zjistit, kdy byl požadavek dokončen, nebo jestli byl vůbec dokončen. Vzhledem k tomu, že volající naznačuje, že o dané sektory nemá zájem, skutečně by nemělo záležet na tom, co zařízení udělá.
Pro vytváření požadavků na vyřazení je zde funkce na úrovni souborového systému:
static inline int sb_issue_discard(struct super_block *sb, sector_t block, unsigned nr_blocks);
Zde rozhraní očekává čísla bloků používající velikost bloku souborového systému místo 512B sektorů.
Programy v uživatelském prostoru mohou zadat požadavek na vyřazení novým ioctl() voláním BLKDISCARD. Není třeba říkat, že tato operace by měla být prováděna opatrně; v podstatě jediný uživatel, který má důvod toto ioctl() použít, jsou mkfs programy.
Blokové ovladače, které podporují požadavky na vyřazení, poskytnou vhodnou funkci blokové vrstvě:
typedef int (prepare_discard_fn) (struct request_queue *queue, struct request *rq); void blk_queue_set_discard(struct request_queue *q, prepare_discard_fn *dfn);
V případě, že není přítomna funkce "připravit vyřazení", požadavky na vyřazení u daného zařízení selžou.
Bloková vrstva také přidává příznak, který indikuje, že zařízení není rotující disk a tím pádem netrpí zpožděním při posunu hlaviček [seek]. Nastavením QUEUE_FLAG_NONROT (pomocí queue_flag_set() nebo queue_flag_set_unlocked()) řekne ovladač blokové vrstvě, že pracuje se zařízením bez rotujících částí. I/O plánovače mohou tuto informací využít a nepřipojit se do fronty - technika kombinování požadavků, užitečná u rotujících úložných zařízení, je zcela zbytečná, když není žádný postih, kterému by bylo potřeba se vyhnout.
Na velkých multiprocesorových systémech může mít pozitivní vliv na výkonnost, když se zajistí, že jsou veškeré blokové I/O požadavky zpracovány jedním CPU. Konkrétně data spojená s daným požadavkem budou pravděpodobně k nalezení v cache CPU, ze kterého požadavek pochází, takže má smysl ho zpracovávat na stejném CPU. Ve 2.6.28 budu záznamy pro bloková zařízení v sysfs obsahovat proměnnou rq_affinity. Pokud je nastavena na nenulovou hodnotu, bude pro toto zařízení zapnuta afinita k CPU. Podle changelogu patche může zapnutí této vlastnosti u některých benchmarků omezit systémový čas o 20-40 %.
Robustní ovladače zařízení typicky musí být napsány tak, aby zvládly případy, kdy se zařízení nepodaří dokončit operace, které mělo vykonat. V několika případech s tímto úkolem pomáhá kód na vyšší úrovni; síťová vrstva například může sledovat odcházející pakety a oznámit ovladači, když vysílací operace trvá příliš dlouho. Ve většině ostatních případů je však na ovladači samotném, aby si takového stavu všiml.
Stejně jako síťový subsystém i bloková vrstva spravuje fronty požadovaných operací. Od 2.6.28 bude mít bloková vrstva, opět podobně jako síťování, mechanismus pro upozornění ovladačů na časové limity požadavků; to umožní odstranit z nižších vrstev mnoho kódu spojeného s časovými limity. Obsluha časových limitů v blokové vrstvě nicméně může být komplexnější a tato komplexita se odráží v příslušném API.
Blokové ovladače musí registrovat funkci, která řeší požadavky, jimž vypršel limit:
typedef enum blk_eh_timer_return (rq_timed_out_fn)(struct request *); void blk_queue_rq_timed_out(struct request_queue *q, rq_timed_out_fn *fn);
Doba, po kterou má požadavek platit, než mu vyprší limit, se nastaví:
void blk_queue_rq_timeout(struct request_queue *q, unsigned int timeout);
Sledování limitů pro každý požadavek se provádí v blokové vrstvě; časovač pro jednotlivý požadavek je spuštěn, když je tento I/O plánovačem předán ovladači. Pokud není požadavek dokončen před vypršením časového limitu, zavolá se timeout funkce s ukazatelem na umdlévající požadavek. Ovladač může poté udělat jednu z následujících tří věcí:
Zjistit, že ve skutečnosti byl požadavek dokončen tak, jak bylo očekáváno, ale jeho dokončení si ovladač nevšiml. Takovou situaci může vyvolat například zahozené [dropped] přerušení. V tomto případě ovladač vrátí BLK_EH_HANDLED a požadavek se označí za dokončený.
Rozhodnout se, že požadavek potřebuje více času, například protože byl ovladačem znovu vyslán. BLK_EH_RESET_TIMER znovu spustí časovač pro tento požadavek
Vzdát se a vrátit BLK_EH_NOT_HANDLED. Bloková vrstva v současnosti neudělá nic, když tento návratový kód obdrží; zdá se, že plány do budoucna zahrnují zrušení požadavku v blokové vrstvě, když je vrácena tato hodnota.
Když věci vypadají špatně, ovladač se může rozhodnout, že zruší všechny stávající požadavky, vyresetuje zařízení a začne znovu. S tímto úkolem může pomoci pár nových funkcí:
void blk_abort_request(struct request *req); void blk_abort_queue(struct request_queue *q);
Tyto funkce zruší daný požadavek nebo všechny požadavky ve frontě podle toho, co je vhodné. Součástí tohoto procesu je volání obsluhy vypršení časového limitu v ovladači pro každý zrušený požadavek.
Další změny v blokové vrstvě zahrnují:
Přiřazování malých [minor] čísel bylo změněno, což diskům umožňuje mít v podstatě neomezený počet oddílů. Cena za tuto změnu je, že malá čísla mohou být přiřazena k odlišnému velkému [major] číslu a nemusí být spojitá; z toho důvodu musí ovladač nastavit příznak GENHD_GL_EXT_DEVT předtím, než se rozšířená čísla použijí. Více informací o této změně vizte v článku Rozšířené oddíly.
Prototypy blk_rq_map_user() a blk_rq_map_user_iov() se změnily; nyní je v nich parametr gfp_mask. To těmto funkcím umožňuje použití v atomickém kontextu.
kblockd_schedule_work() má další parametr specifikující relevantní frontu požadavků.
Nová funkce bio_kmalloc() se chová podobně jako bio_alloc(), ale nepoužívá zásobu paměti [mempool] ke garantování alokací a může tudíž selhat.
Ve shrnutí jde v blokové vrstvě o jeden z rušnějších vývojových cyklů v současné době.
Tak uz mi zverejnite konfiguraky? Prosim :) Abych si uzil tu plne fungujici hibernaci na TP R61 s NVidia Quadro NVS 140M (driver 177.82) @ 2.6.27.7 (vyzkousena jadra nejruznejsi vanilla jadra od 2.6.26 versus nejruznejsi drivery grafiky) a pri resume z hibernace je vzdy zhruba 45 vterinovy blackout.
Nejak neni cas, mozna pod stromecek
Arch, vanilla kernel 2.6.27.7. Jenze jak koukam k vam na blog, provozujete to nejspis na T61. Ja na R61, takze at uz je podobnost techto dvou kousku jakakoli, nema to pro me v tuto chvili vase zkusenost s hibernaci T61zadny vyznam. Ta NVidia je proste tragedie, mel jsem si poridit integrovanyho Intela ;)
Na thinkwiki je spousta navodu, ktere nefunguji. Az se najde nekdo, komu funguje hibernace (nikoli suspend) current verze Archlinuxu na TP R61 8918DFG, prohlasim se verejne za lamu ;)
Distro menit nehodlam, tancuju priserne a DVD WinVista nevlastnim... Muzeme to prohlasit za bugfix? :-D
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.