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