helenos-nicf team mailing list archive
-
helenos-nicf team
-
Mailing list archive
-
Message #00120
Re: uvolnovani paketu po zavolani write_packet
On 20.4.2011 10:35, Jirka Michalec wrote:
On 04/20/2011 09:08 AM, Radim Vansa wrote:
Ale ona si aplikace prece rekne o paket a knihovna, ktere se pta uz
zaruci aby byl nalokovan pouzitalne i pro driver... i baz packet
serveru.
Pokud jde o 32bitovou kartu v 64bitovem systemu, tak ta knihovna
muze zarucit (misto paket serveru) alokaci nize v dolnich 32 bitech.
Nebo to muze driver kopirovat, jen pokud zjisti, ze adresa je vetsi.
Nemuset vubec kopirovat pakety je dulezite u velkych prenosovych
rychlosti.
Souhlas.
To sice ano, ale otazkou je, budou-li mit vsechny aplikace
pouzivajici networking stack
take opravneni pouzivat DMA. On tu je i obecny problem - jak knihovna
alokujici packet
zjisti, jakou konkretni pamet ma pro packet pouzit (mysleno z hlediska
flagu u dma_allocate)?
To muze byt trochu problem i ted - alokuje packet server pamet v
nizsich 32bitovych adresach
nebo mlcky predpoklada, ze si s tim pripadne karta na amd64 s >4GB
pameti poradi?
(nehlede na to, ze pripadne ISA karty s podporou DMA by byla potreba
alokace v jeste
nizsich adresach, na coz by obecna alokace packetu tez mela byt
pripravena).
Ve vysledku si ta knihovna, bude-li vyuzivat DMA, bude muset zjistit,
jaka omezeni
na fyzicke adresy karty v systemu vyzaduji, a z nich vybrat to nejvice
omezujici (nebot
pri alokaci neni znamo, kterou kartou se packet posle...).
Stejně jako Zdeněk si myslím, že nekopírovat packety je priorita číslo 1
a té se musí podřídit vše. I když by to vyžadovalo existenci packet
serveru nebo nějaké jiné hraní si s právy na alokaci DMA, prostě
kopírovat se nesmí, pokud to karta umožňuje (což E1000 dělá, u RTL to
musíš nakopírovat do toho vnitřního bufferu stejně, že?).
Optimalizovat by se mělo pro typický případ - nejspíše ten, že packet je
z největšího rozsahu, který většina karet podporuje, což je 32bitový
rozsah. Není to tak velké omezení a karty, které zvládají 64bitový
rozsah, prostě tu featuru nevyužijí.
Karta tak vždy ověří, že packet je v rozsahu, který podporuje a pokud
vyžaduje menší rozsah, tak holt musí přealokovat packet a kopírovat nebo
si to nějak přizpůsobit. Pokud by tohle měl být velký problém, tak se
může do systému doimplementovat nastavení říkající, z jakého rozsahu se
mají packety alokovat (ale to už je záležitost net stacku a ne nás).
Mozna bychom se o tomhle mohli vice pobavit i s Deckym!
Nevím, tohle se mi zdá zbytečné a stejně to nejspíše nechá na nás.
Ja si naopak myslim, ze zrovna to, jestli v budoucnu bude mozne
pocitat s tim, ze packety
budou na strane aplikace alokovany pomoci DMA frameworku, je na
Deckeho dobra otazka
a nikdo jiny nam plany budouciho networking stacku nebude moci odhalit.
Dobrá, klidně se jej na to můžeme zeptat. Napíšeš mu, nebo mám já?
S tim, ze bychom se na jeho budouci vyvoj nemeli vubec ohlizet, zas
tak uplne nesouhlasim
- zmeni-li se networking stack, bude treba NICF upravovat, pokud uz se
smerem budoucich
zmen budeme pocitat, nebudou pripadne upravy tak narocne. Pokud budou
ovladace psany
s tim, ze packet je pristupny pro DMA prenos, a packet pristupny byt
prestane, budou se
muset ovladace prepsat (a jelikoz se pouziti pameti pro DMA, ktera tak
nebyla alokovana,
se nemusi vzdy projevit nebo se projevi divnym zpusobem, zapomenuty
puvodni kod v nejakem
driveru by mohl zpusobit dost zvlastni chovani...)
Ano, já bych taky uvažoval trochu více do budoucnosti.
Takova funkce uz tam je: nic_driver_release_packet
Aha, nak jsem ji prehledl...
Tak jak je tedka implementovana, tak ale pouzit nejde, ten zamek je
zamcen pro cteni a nic_driver_release_packet() by ho zamykala pro
zapis.
Zacinam si rikat, jestli nebude lepsi, kdyz si prece jen udelam
vlastni send_message().
Pokud je packet uvolňován v send message, tak se to dělo bez téhle
funkce. Pokud je uvolňován v handleru interruptu, tak žádný zámek
zamknut není, čili můžeš ji použít. Pravda, že ve write_packet použít
nejde - tak si říkám, že je tam tím pádem ještě bug, protože pro
posílání zprávy NETu by se měl main_lock zamykat pro zápis. Napadá
vás někoho, jak transparentně zjistit, jestli se to volá nepřímo ze
send message (teda bez zkoumání stacku), nebo jí musíme předávat
nějaký extra argument, což není tak elegantní?
Krom zkoumani stacku ci predavani extra argumentu zadny jiny rozumny
zpusob neni, kazdopadne funkce chovajici se ruzne jen podle volajici
funkce neni dobry napad. To uz radeji od ni udelat dve ruzne se
jmenujici varianty (s tim, ze ta jedna by jen zamkla zamek a zavolala
druhou).
Hmm, v tom případě bych zauvažoval o tom uvolňování podle návratové
hodnoty, protože se mi z hlediska uživatele vůbec nelíbí mít dvě funkce
na uvolňování packetu, které se mají použít podle kontextu a v jednom
případě způsobí deadlock a ve druhém ještě hůře nějaké nedefinované chování.
I když je tu ještě jedna alternativa - nezamykat vůbec pro uvolňování
packetu a místo toho jenom vytvořit session, ve které se ta zpráva
odešle (čili bez synchronizačních problémů). Popravdě jsem se zatím
async sessions vyhýbal, ale asi bych je do komunikace měl zanést - tím
pádem by se nemuselo zamykat jenom kvůli posílání nějakých zpráv (ono se
vlastně nemusí zamykat ani teď, protože poslání jedné zprávy je
atomické, ale "uzamykat resource" pro komunikaci mi přišlo jako dobrý
nápad).
Radim
_______________________________________________
Mailing list: https://launchpad.net/~helenos-nicf
Post to : helenos-nicf@xxxxxxxxxxxxxxxxxxx
Unsubscribe : https://launchpad.net/~helenos-nicf
More help : https://help.launchpad.net/ListHelp
Follow ups
References