[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