[so2] [Tema 3] Parcurgerea segmentelor dintr-un bio

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Wed Apr 22 11:47:32 EEST 2015


Octavian Crintea via so2 <so2 at cursuri.cs.pub.ro> writes:
> Salutare!
>
> În laborator ni s-a sugerat folosirea următorului macro pentru a itera
> prin vectorul de segmente (bv_io_vec) al structurii bio:
>
> #define bio_for_each_segment(bvl, bio, i)                               \
>          for (i = (bio)->bi_idx;
>              \
>               bvl = bio_iovec_idx((bio), (i)), i < (bio)->bi_vcnt;        \
>               i++)
>
> Observ că structura bio nu se modifică, doar bvec și i fiind
> actualizați la fiecare iterație.  În aceste condiții cum este posibil
> ca funcția bio_cur_bytes(bio) să întoarcă numarul de octeți din pagina
> curentă dacă nu primește nicio referință la acea pagină (i sau bvec,
> de exemplu)?
>
> Funcția de mapare __bio_kmap_atomic primește atât pointer la structura
> bio cât și indexul curent i, ceea ce justifică faptul că pentru a avea
> acces la ceva din pagina curentă e nevoie sa fie pasat i sau bvec sau
> să fie modificată corespunzător strcutura bio la fiecare iterație.
> Dacă nu ar fi nevoie de i sau bvec atunci ar putea exista o funcție de
> mapare a paginii curente care să primească doar bio și atât.

Ai dreptate, este greșită folosirea funcției bio_cur_bytes în cadrul
bio_for_each_segment. Dacă ai envoie de lungimea datelor din bvec-ul
curent atunci trebuie să folosești bvl->bv_len.

Am creat aici[1] un modul de testare care demonstrează asta. O să
adăugăm corectare și pe wiki.

[1] https://github.com/razvand/snippets/tree/master/kernel/bio-bvec

Răzvan


More information about the so2 mailing list