[so2] [Tema3] OOM

Irineu Barbieru irineu93 at gmail.com
Sun May 15 17:15:23 EEST 2016


2016-05-15 12:31 GMT+03:00 Razvan Deaconescu via so2 <so2 at cursuri.cs.pub.ro
>:
>
> Irineu Barbieru <irineu93 at gmail.com> writes:
> > 2016-05-02 18:08 GMT+03:00 Razvan Deaconescu via so2 <
so2 at cursuri.cs.pub.ro
> >> Irineu Barbieru <irineu93 at gmail.com> writes:
> >> > 2016-04-30 23:13 GMT+03:00 Razvan Deaconescu via so2 <
so2 at cursuri.cs.pub.ro>:
> >> >> Irineu Barbieru via so2 <so2 at cursuri.cs.pub.ro> writes:
> >> > Salut si Sarbatori Pascale fericite.
> >> >
> >> > Ideea este in felul urmator: in urma discutiei de la laborator, am
> >> > recurs la varianta cu multe zone atomice, tocmai pentru a nu mai
> >> > aloca buffere locale(cu kmalloc). Inainte de asta, lucram pe
> >> > modelul prezentat de tine, cu buffere locale, in care copiam datele
> >> > pentru prelucrare, si aveam aceeasi problema.
> >> >
> >> > In urma raspunsului tau, am modificat inca o data codul, aducandu-l
> >> > intr-o stare foarte asemanatoare cu ce aveam inainte de laborator,
> >> > problema manifestandu-se in continuare.
> >> >
> >> > Probabil fac ceva prost, foarte greu de observat.
> >>
> >> Dă-i un submit pe vmchecker[1] să vedem codul. Sau dacă îl ai pe un
> >> repository privat (GitHub privat, GitLab, BitBucket), adaugă-ne și pe
> >> noi (echipa de asistenți) ca să putem vedea codul (eu sunt razvand sau
> >> razvan.deaconescu).
> >>
> >> [1] https://vmchecker.cs.pub.ro/ui/
> >
> > Am submis inca o data.
>
> Salutare, Irineu.
>
> Scuze de întârzierea răspunsului. A fost Paștele și apoi tot felul de
> evenimente.
>
> Am identificat neajunsul din codul tău. În funcția destroy_bio, înainte
> să faci bio_for_each_segment trebuie să spui bio-ului că începi de la
> primul bvec. Adică trebuie să spui
>
> bio->bi_idx = 0
>
> înainte de bio_for_each_segment.
>
> Vezi că nu trebuie să apelezi destroy_bio() în ssr_write_data pentru că
> nu e un bio alocat de tine (pe care să îl eliberezi) ci e un bio alocat
> de subsistemul de I/O care apelează driver-ul tău (ssr).
>
> Cu aceste două modificări toate testele trec.
>
> Dacă te ajută, pentru debugging am folosit printk după fiecare funcție
> de alocare și dezalocare (kmalloc, kfree, alloc_page, __free_page) și am
> văzut că nu se apela __free_page. Așa am identificat că ai omis să
> reinițializezi indexul bio-ului (bio->bi_idx = 0) înainte să începi să
> dezaloci pagini.
>
> Vezi mai jos cum arăta un output pentru testul 20 before și after.
>
> Această precizare era deja prezentă în enunțul temei[2] (vezi ultimul
> bullet al secțiunii "Precizări Linux"). Probabil nu ai fost atent când
> ai urmărit precizarea și ai omis inițializarea indexului (bio->bi_idx =
> 0).
>
> [2] http://ocw.cs.pub.ro/courses/so2/teme/tema3#precizari_linux
>
> Răzvan
>
> --- before ---
> [   45.057393] Use kmalloc to allocate 512 bytes at 107
> [   45.057774] Use alloc_page to allocate 1 page at 118
> [   45.059317] Use alloc_page to allocate 1 page at 340
> [   45.059594] Use kfree_page to free sectors at 350
> [   45.061336] Use kmalloc to allocate 512 bytes at 107
> [   45.061574] Use alloc_page to allocate 1 page at 118
> [   45.062304] Use alloc_page to allocate 1 page at 340
> [   45.062508] Use kfree_page to free sectors at 350
> [   45.063922] Use kmalloc to allocate 512 bytes at 107
> [   45.064267] Use alloc_page to allocate 1 page at 118
> [   45.064935] Use alloc_page to allocate 1 page at 340
> [   45.065251] Use kfree_page to free sectors at 350
> [   45.066316] Use kmalloc to allocate 512 bytes at 107
> [   45.066545] Use alloc_page to allocate 1 page at 118
> [   45.067245] Use alloc_page to allocate 1 page at 340
> [   45.067445] Use kfree_page to free sectors at 350
>
> ------
>
> --- after ---
> [  103.510808] Use kmalloc to allocate 512 bytes at 108
> [  103.511547] Use alloc_page to allocate 1 page at 119
> [  103.512931] Use __free_page to free 1 page at 91
> [  103.513984] Use alloc_page to allocate 1 page at 341
> [  103.514636] Use kfree_page to free sectors at 351
> [  103.515832] Use __free_page to free 1 page at 91
> [  103.517497] Use kmalloc to allocate 512 bytes at 108
> [  103.517900] Use alloc_page to allocate 1 page at 119
> [  103.519256] Use __free_page to free 1 page at 91
> [  103.519682] Use alloc_page to allocate 1 page at 341
> [  103.519953] Use kfree_page to free sectors at 351
> [  103.522413] Use __free_page to free 1 page at 91
> [  103.524424] Use kmalloc to allocate 512 bytes at 108
> [  103.524866] Use alloc_page to allocate 1 page at 119
> [  103.525984] Use __free_page to free 1 page at 91
> [  103.526696] Use alloc_page to allocate 1 page at 341
> [  103.526984] Use kfree_page to free sectors at 351
> [  103.528377] Use __free_page to free 1 page at 91
> [  103.529644] Use kmalloc to allocate 512 bytes at 108
> [  103.530054] Use alloc_page to allocate 1 page at 119
> [  103.534544] Use __free_page to free 1 page at 91
> [  103.534992] Use alloc_page to allocate 1 page at 341
> [  103.535543] Use kfree_page to free sectors at 351
> [  103.536664] Use __free_page to free 1 page at 91
> ------
> _______________________________________________
> http://ocw.cs.pub.ro/courses/so2/resurse/lista-discutii

Multumesc frumos, Razvan. Intr-adevar, initializarea indexului era
precizata in enunt. Eu m-am folosit de exemplul postat de tine pe github[1]
in care observ acum ca faceai aceasta initilizare la finalul constructiei
bio-ului, lucru trecut cu vederea de mine. Astfel, am ajuns sa cred ca
functia mea nu are nicio problema si sa nu-mi dau seama ce prostie faceam.
In ceea ce priveste apelul destroy_bio din functia ssr_write_data, m-am
gandit ca nu ar fi corect, insa in contextul dat, in care nu faceam defapt
eliberarea paginilor, "functiona" si nu genera eroare.
In orice caz, o mare neatentie din partea mea, lucru ce mi-a mai creat
probleme si la alte teme, de-a lungul vremii.

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

Mersi inca o data,
Irineu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20160515/d70f9305/attachment-0001.html>


More information about the so2 mailing list