[pso] [TEMA 2] Linux kfifo

Faur Andrei da3drus at gmail.com
Tue Apr 7 20:50:48 EEST 2009


Well, cum am inceput lucrul la tema 2, mi-am pus intrebarea daca nu exista
o implementare generica a unui buffer circular in kernelul de linux. Turns
out
there is one, definita in kfifo.h. Am folosit-o cu succes, tema merge, trec
toate
testele. Dar, uitandu-ma inca o data pe codul scris, am observat o mare
greseala
pe care o faceam in rutinele de read si write. Puneam/copiam direct in/din
bufferul din userspace, folosind direct kfifo_put si kfifo_get, fara sa
folosesc
copy_from_user si copy_to_user. Acum, am mai multe variante:

1. Renunt in totalitate la kfifo si imi definesc un buffer circular propriu
2. Incerc sa construiesc niste functii care folosesc campurile interne ale
unui struct kfifo si care fac "comunicarea" corecta cu bufferul userspace
3. Folosesc buffere intermediare in functiile read si write, dar asta nu mi
se pare o idee prea buna, e un overhead inutil
4. Las totul asa si suffer the penalty

Intrebarile mele sunt:
1. In implementarea __kfifo_get() si __kfifo_put() se folosesc doua operatii
pe care nu le inteleg : smp_mb() si smp_wmb(). Din cate imi dau seama
acestea
sunt bariere, dar ce rol au atat timp cat zona respectiva este locked?

2. WWJD Pe care din variantele de mai sus sa o aleg? Mi se pare o greseala
mare accesul neprotejat la date din userspace si nu as vrea sa las asa,
indiferent
de penalty. Definirea unor functii proprii care folosesc campurile
structurii kfifo
pare doable dar nu stiu cat de best practice este.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090407/e06dcea4/attachment.htm>


More information about the pso mailing list