garoedagod damn, too late
garoedadezelfde code lijkt op
garoedafor_each_task_pid(pgid, PIDTYPE_PGID, p, l, pid)
wli                        if (p->session == current->session)
wli                                goto ok_pgid;
garoedavraag: misschien een domme vraag, wat bevatten deze hash tabellen, wat is de key bedoel ik
garoedaok, deze vraag helpt om te begrijpen wat er gaande is in de code
garoedaer is een "struct pid" die een gegeven "proces" id voorstelt
garoedahet begrip "process id" is een  veralgemening, dus het betekent niet alleen PID, het bevat ook  PID, PGID, TGID, en SID.
garoedade struct pid heeft een lijst in zich die alle tasks bevat die een zelfde ID delen
garoedabijvoorbeeld, stel dat er 20 tasks zijn in een zeker process groep
garoedade struct pid voor die pgrp is te vinden in de hashtable bucket lijst, je kijkt naar de struct pid en bezoekt de lijst erin
garoedadit zou je een idee moeten geven van wat er al in _each_task_pid() al is
garoeda#define for_each_task_pid(who, type, task, elem, pid)           \
wli        if ((pid = find_pid(type, who)))                        \
wli                for (elem = pid->task_list.next,                        \
wli                        prefetch(elem->next),                           \
wli                        task = pid_task(elem, type);                    \
wli                        elem != &pid->task_list;                        \
wli                        elem = elem->next, prefetch(elem->next),        \
wli                        task = pid_task(elem, type))
garoedapid = find_pid(type, who) /* find_pid() doet de opzoeking in de hashtabel en zoekt de struct pid die overeenkomt
garoedameer specifiek, find_pid() neemt als eerste argument het soort pid  (PGID/SID/etc.), en als tweede argument de waard
garoedae
garoedadit wordt gebruikt om de loop te starten
garoedade code tijdens de loop kijkt naar  pid->task_list
garoedaen is eigenlijk een list_for_each_entry()
garoedaje zal opmerken dat in stuct pid er 2 verzamelingen van list links zijn
garoedaeen voor de hashtabel en een voor de lijst van tasks, dit help met de sharing
garoedadit is het punt waar het principe van  state changing vs state examination in het spel komt
garoedadeze hashtabellen moeten geupdated worden tijdens fork(), exec() en exit()
garoedaer is ook een andere klasse van neveneffecten
garoedade locking veranderingen in sommige (minder belangrijke) gevallen
garoedasys_setpgid() is zo een van die gevallen
garoedain 2.4.x was  er geen structuur geassocieeerd met pgrp's die veranderd moest worden wanneer de pgrps veranderen, dus 2.4.x nam de tasklist_lock om te lezen
garoedadit is wel het geval in 2.5.x dus de tasklist_lock  moet geschreven worden
garoedadit heeft een andere weerslag, sommige operaties zijn nu minder paralleliseerbaar maar ze zijn snell in serie
garoedade algemene trend van de operaties die geserialiseerdd werden in 2.5 is dat ze 'ongewoon' waren, het soort die niet vaak gevraagd werden of niet als levensbelangrijk voor de performantie beschouwd werden terwijl de operaties die versneld werden niet echt last hadden van de accounting overhead of enorm versneld werden daar ze al reeds serieel werden uitgevoerd
garoeda(vertaler: wat ne zin)
garoedaer was een ander neveneffect, het werd gebruikt om promotie te maken voor deze infrastructuur in de kernel
garoedade accounting geeeft een expliciete waarschuwing wanneer een pid niet langer gebruikt wordt
garoedaop het eerste zicht lijkt dit niet enorm belangrijk maar er is een andere specifieke operatie die we zouden willen weten
garoedatijdens fork() krijgt een proces een uniek ID, dit wordt 'pid allocation' genoemd
garoedade 2.4 pid allocator heeft volgende werkwijze: overloop de tasklist en kijk of het ID dat ik gegokt heb in het begin echt goed is
garoedain werkelijkheid is het meer specifiek maar toch blijft het een niet erg deterministisch algoritme
garoeda2.4 pid allocater gebruikt een 'venster'  met veilige pids dat beweegt, groeit en verkleint naarmate er pids toegewezen worden en de tasklist onderzocht wordt
garoedain het 'beste' geval resulteert dit in O(tasks) performantie maar in het slechtste geval O(tasks**2). Men kan bewijzen dat na een reeks operaties alles uitgemiddeld wordt  zodat gevallen met O(tasks**2) toch naar O(tasks) gaan, gemiddeld gezien
garoedahet probleem is dat het slechtste geval erg genoeg kan zijn wanneer er voldoende tasks zijn zodat het deadlock detectie mechanisme in werking treedt, zoals de NMI watchdog, door taken die elk proberen write_lock_irq(&tasklist_lock).
garoedade 2.5.x pid allocator gebruikt hashtable updates om hierbij te helpen
wlivoid detach_pid(task_t *task, enum pid_type type)
wli{
wli        int nr = __detach_pid(task, type);
wli        if (!nr)
wli                return;
wli        for (type = 0; type < PIDTYPE_MAX; ++type)
wli                if (find_pid(type, nr))
wli                        return;
wli        free_pidmap(nr);
wli}
garoedade for() loop is het belangrijke deel hier
garoedahet doet het volgende: "voor alle types van process ID's, als we vinden dat dit ID nummer al in gebruik is, keer terug zonder iets te doen"
garoedaals het ID nummer compleet ongebruikt is wordt het van de bitmap geschrapt
garoedade bitmap heeft een plaats voor ieder mogelijk pid nummer en als de bit er staat is het ID nummer in gebruik, als er geen bit staat is het nummer niet in gebruik
garoedavraag: een 32k bitmap voor pids?
garoedaeigenlijk nee
garoedade PID ruimte was eveneens vergroot zodat het mogelijk is om meer processen te draaien
garoedade maximum toegelaten PID ruimte is 4M groot en de grootte is controleerbaar via sysctl
garoedaer zijn eigenlijk 2 niveaus in de map:
garoedahet eerste niveau wijst naar pagina's met een telling van de vrije pid's in die pagina
garoedade tweede is een pagina waarvan de bits gebruikt worden om de individuele pids te volgen
garoedavraag: uint32
garoedavraag: waarom dat niet gebruiken  :)
garoedade enige reden is dat de overhead in geheugen voor genoeg genoeg taken om een PID space van die grootte te gebruiken het onwerkbaar wordt, tenminste op 32bit
garoedavoor 64 bit machines met veel geheugen en een voldoende aantal tasks is het doenbaar maar het is niet nuttig wegens overhead
garoedahet is groot genoeg om de al de nummers van de tasks te bevatten voor een reele workload, die meestal niet meer is dan 100k in het grootste geval en sinds het scannen O(1) is (ik kom daar straks nog op terug) is de geheugenruimte willekeurig
garoedaje zal dat zienin alloc_pidmap()
garoedascan_more:
wli        offset = find_next_zero_bit(map->page, BITS_PER_PAGE, offset);
wli        if (offset >= BITS_PER_PAGE)
wli                goto next_map;
wli        if (test_and_set_bit(offset, map->page))
wli                goto scan_more;
garoedadit betekent dat het echt over de bitmap gaat en (in theorie) O(sizeof(pidspace)) nodig heeft, in praktijk domineren de cache effecten en het algoritme domineert direct tasklist scannen en is zoals verwacht O(1°
garoedamet enige extra indexeringsruimte kan met het O(1) maken voor het slechtste geval maar de algemene winst is is marginaal
garoedatoekomst:
garoedade overblijvende tasklist scans zijn niet zo belangrijk voor de performantie als bovenstaand
garoedain de core is er een weinig voorkomende operatie die de prioriteit van alle tasks die tot een bepaalde user behoren, en verschillende error paths die scannen naar taken die een zekere mm hebben
garoedaeveneens  global capability mask setting en het versturen van een signaal naar alle tasks
garoedahet mm scannen teneinde core dumps te doen en OOM killing is niet beschouwd  als zeer nuttig om te optimiseren (door mij) en het uid scannens is een zodanig zeldzame operatie dat het niet duidelijk is of het winst zou hebben bij het onderhouden van list links
garoedaenkele 'miscellaneous' andere gevallen komen ook voor
garoedade ipt_owner_module van netfilter scant de tasklist om een taak te vinden die overeenkomt met task->comm
garoedadit kan een nadelige invloed hebben op de prestatie voor machines die een netwerk intensieve workload hebben en ipt_owner maar er is niet voldoende infrastructuur om het als module te zien
garoedaer is ook een zeer slechte quadratisch werkdende tasklist scan in /proc om het lezen van de root /proc/ directery te simuleren, daar is nog geen goed oplossing voor gevonden
garoedavan een ding weten we zeker hoe we moeten werken: task validation
garoedaer is een nieuw mechanisme om reference counting te doen van de task structures zodat men garanties kan hebben of een task structure geldig blijft
garoedaer zijven verschillende delen in de kernel, met name vm86 en SBUS omgeving control drivers die referenties naar tasks behouden, maar de enige manier waarop ze (denken) dat te kunnen doen is taks structure pointers vergelijken in een tasklist scan
garoedadit werkt niet echt omdat omdat de structures slab allocated zijn en kunnen hergebruikt worden door andere taken
garoedade oplossing is nu: ofwel houden we een reference count bij van de task strcucture ofwel plaatsen we een hook in  release_thread()
garoedadit zijn duidelijke bugfixes dus er kan geen twijfel zijn dat deze strategie nuttig is
garoedaer is een extra infrastructure dat de potentie heeft om netfilter te laten werken met het hashtable update probleem
garoedadat is, register functies die opgeroepen worden bij fork(), exec() en exit() en andere nuttige task gerelateerde events
garoedaop het moment zijn er niet echt veel verschillende gebruikers en gezien de uitzonderlijke toestand van dingen die het het nodig hebben zullen er waarschijnlijk nooit veel gebruikers zijn
garoedamaar het biedt de mogelijkheid om een infrastructure te hebben die toelaat  om SBUS environment control, vm86, and netfilter modules te laten zijn en toch zeer efficient te zijn
garoedavraag: ben je nog steeds een generische scanfunctie te voorzien met een callback ter vergelijking?
garoedamijn intentie was om een zeer strikte controle van de gebruikers van die interface te doen en en het gebruik ervan enkel  in op voorhand goedgekeurde catastrofische momenten toe te laten
garoedazodat we reintroducties van tasklist scanning algoritmen of algehel slechte code kunnen voorkomen. ik ben er minder mee bezig de laatste tijd en ik betwijfel het of zulke toeganscontrole ooit populair zou zijn
garoedavraag: LSM heeft hooks in die plaatsen die de updates zouden kunnen doen (gelijkaardige task ornaments zouden helpen, denk ik)
garoedaik was bezig met task ornaments te schrijven voor deze dingen =)
garoedade LSM hooks hergebruiken voor dit soort events lijkt heel interessant  maar het is moeilijk te verdedigen dat je zoiets als ipt_owner's ->comm hashing in iets wat verondersteld is een security model te zijn, een hernoemingschema zou misschien handig zijn om dit probleem op te lossen
garoedaeen toekomstige onderzoeksrichting die zeer zeker zal gebeuren is een methode zoeken die de statisch gealloceerde geheugenruimte van de pidhashes reduceert
garoedaeen toekomstige richting zou zijn om een vergelijking te doen van iets deterministischere multilevel bitmap aanpak met de methode  die we nu gebruiken
garoedazodat we kunnen bepalen of de gemiddelde performantie in reele workloads negatief beinvloedt wordt door de cache effecten van altijd te updaten tot het punt waarop de winst in determinisme in de slechtste gevallen van het huidige algortime niet meer de moeite waard is
garoedaik ben niet echt van plan dat verder te onderzoeken, tenzij ik echt verveeld ben, de slechtste gevallen waren onmogelijk te produceren
garoedamerk ook op  dat op 32 bit machines met PAE (die 3 niveaus pagetables nodig heeft) de 2de niveau pagetables (pmd's) altijd geinstantieerd worden
garoedadit betekent 12KB geheugenoverhead per task
garoeda32K tasks  * 12 KB == 786MB, dus pmd's gebruiken op dat punt al het lowmem, dus voor een zeer belangrijk geval is 32K ruimte al genoeg
garoedalast but not least, wens ik Ingo Molnar te bedanken, zijn bugfixes en cleanups en promotie van deze methodes hebben ze in de kernel gekregen
garoedaokee, bedankt voor iedereen die is komen opdagen en die geluisterd heeft ook =)
garoeda(einde spreekbeurt en applaus)
erikmgaroeda: goede vertaling
garoedathnx erikm :-)
garoedaik ga nu nog proberen het begin te vertalen dat ik gemist heb
erikmgaroeda: ik had het niet nodig (ik heb geen problemen met engels), maar ik was nieuwsgierig naar de vertaling
* erikm vraagt zich af of sarnold *enig* idee heeft waar wij het over hebben
garoedaerikm: hehe, ik vond deze moeilijk om te vertalen
Geryonidd nice job garoeda :)

Generated by irclog2html.pl by Jeff Waugh - find it at freshmeat.net!