[so2] [Tema3] OOM

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun May 15 12:31:24 EEST 2016


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
------


More information about the so2 mailing list