helenos-nicf team mailing list archive
-
helenos-nicf team
-
Mailing list archive
-
Message #00155
Re: Report
Ahoj,
věnuji se testování a opravování chyb. Při testování jsem rozšířil
nicconf a nictest o podporu polling mode a opravil některé s tím
související deadlocky a pád ildummy. Přidal jsem několik záznamů do
mantisu (některé jsou co se řešení týče triviální, jen bych k nim rád
měl i jiný názor na to, které z řešení je lepší pro případ, že mi něco
uniklo).
Konečně se mi též podařilo nabootovat na reálném HW a testovat tam.
Z celkem pěti karet, které mám k dispozici, byly 4 detekovány a
přiřazeny ke správnému driveru, jedna nikoliv (zřejmě používá jiné
vendor ID a device ID, bohužel toto už ve výpisu do kernel console není,
ale čekám, že až tyto informace do výpisu přidám, zbývající kartu rychle
zprovozním).
Všechny detekované karty vykazují naprosto stejné chování (alespoň v
rámci testovaných funkcionalit): po startu funguje přijímání i odesílání
packetů (broadcast i unicast), nefunguje změna MAC adresy (přijímají
stále na původní) a po změně bcast modu přestane přijímat úplně (změny
ostatních jsem zatím nezkoušel), v QEMU vše zmíněné funguje správně.
V QEMU jsem stále nedokázal zprovoznit periodický polling, on_demand
funguje správně, stejně jako přijímání pomocí přerušení.
Dále budu pracovat na odstraňování chyb a uváděním všech karet do
správně fungujícího stavu.
A mám taky jednu otázku ohledně designu: ve funkcích ohledně alokování
packetů je race, který způsobuje, že občas se prostě nepodaří
naalokovat packet, ačkoliv možné to je (ještě nedošla paměť). Zamykat
by to ani nešlo a v podstatě to není problém - otázkou ale je, jestli
to má řešit knihovna (cyklit, dokud se nepodaří naalokovat), uživatel
(dostane chybu, že se nepodařilo alokovat, ať si dělá co chce) nebo
jestli to zkusit třeba 8x v cyklu naalokovat a když se to nepodaří ani
jednou, tak teprve tehdy vrátit chybu. Já bych byl pro to poslední
řešení, co vy na to?
Můžeš se trochu více rozepsat o tom, kde ta race je, příp. ve kterých
funkcích se projevuje (jde-li o race na straně packet serveru či
driveru)? Jedna race je v dma_allocate_anonymous (při volání ze dvou
vláken mohou obě najít stejnou volnou virtuální adresu, avšak vytvoření
mapování se povede jen jednomu) - o tom jsem už mluvil na jedné ze
schůzek, když jsme DMA řešili, a shodli jsme se, že finální řešení bude
v případě neúspěchu několikrát zopakovat postup a vrátit neúspěch až
poté (ale zdá se mi, že to zapadlo). V tomto případě by šlo i zamykat,
ale jen globálním zámkem v celé DMA knihovně (což ale nepomůže při
současném volání jiných funkcí alokujících paměť mimo DMA knihovnu),
rozumnější mi opravdu přijde zkusit několik pokusů. Na druhou stranu je
otázkou, zda-li má opravdu tato funkce myslet na možnost více vláken
volajícího nebo si to má volající zajistit sám.
Co se alokace packetu týče - IMO typycká aplikace (driver) poběží v
několika vláknech a tudíž by tyto funkce měly s více vlákny počítat a
snažit se to rozumně řešit. Poslední zmiňované řešení se mi též líbí
nejvíce, v takovém případě by bylo dobré odlišit návratový kód "opravdu
není paměť" od "nastal race, příště se to možná podaří" - otázkou ale
je, jestli je toto schopen framework rozlišit, např. dma_allocate vrací
v případě neúspěchu ENOMEM nehledě na důvod.
Michy
Follow ups
References
-
Report
From: Radim Vansa, 2011-07-04