[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