When running the test case from https://github.com/genodelabs/genode/issues/559 on 64-bit Fiasco.OC, the kernel runs out of memory after the sequential construction and destruction of tasks. I've added some debug output to the kernel which tracks the kernel memory allocations and deallocations. The attached log files cover the creation and destruction of one task on 64-bit and 32-bit Fiasco.OC.
In the 64-bit case the allocations reported in lines (05/06), (07/08), (12/13), (14/15), (20/21) and (24/25) don't have matching calls of 'free()'. These allocations belong to the 'Ptab::Walk::sync()' and 'Ptab::Walk::walk()' functions. It looks like only a part of the page table gets destroyed during 'Mem_space::dir_shutdown()'. In the 32-bit case the amout of memory available after the destruction of the task is the same as before the construction, but what I found odd about the log output is that the allocations reported in lines (10/11) and (14/15) don't have matching calls of 'free()', whereas the allocations reported in lines (09) and (12/13) each have two calls of 'free()' (in lines (22/25) and (28/32)), which makes the amount of memory available balanced again. Christian
01 [init -> bomb] Done. 02 alloc(): avail: 1847296, addr: 0xfffffffffc6d1000, size: 4096 03 Task::create() 04 alloc(): avail: 1843200, addr: 0xfffffffffc6d2000, size: 4096 05 Ptab::Walk::sync(): l_a: 800000000, r_a: 800000000, size: 0xffff800000000, level: 2 06 alloc(): avail: 1839104, addr: 0xfffffffffc6d5000, size: 4096 07 Ptab::Walk::sync(): l_a: ff8000000, r_a: ff8000000, size: 0xffff008000000, level: 1 08 alloc(): avail: 1835008, addr: 0xfffffffffc6df000, size: 4096 09 alloc(): avail: 1830912, addr: 0xfffffffffc6a0000, size: 65536 10 Ptab::Walk::walk(): virt = 44000, level = 3 11 alloc(): avail: 1765376, addr: 0xfffffffffc6b3000, size: 4096 12 Ptab::Walk::walk(): virt = 44000, level = 2 13 alloc(): avail: 1761280, addr: 0xfffffffffc6db000, size: 4096 14 Ptab::Walk::walk(): virt = 44000, level = 1 15 alloc(): avail: 1757184, addr: 0xfffffffffc6d8000, size: 4096 16 Task::create() finished 17 alloc(): avail: 1753088, addr: 0xfffffffffc6b5000, size: 4096 18 Generic_obj_space<SPACE>::caps_alloc(): virt = 1 19 alloc(): avail: 1748992, addr: 0xfffffffffc6b6000, size: 4096 20 Ptab::Walk::walk(): virt = fffffffff0800, level = 1 21 alloc(): avail: 1744896, addr: 0xfffffffffc6b7000, size: 4096 22 Ptab::Walk::walk(): virt = 1020, level = 2 23 alloc(): avail: 1740800, addr: 0xfffffffffc6b8000, size: 4096 24 Ptab::Walk::walk(): virt = 1020, level = 1 25 alloc(): avail: 1736704, addr: 0xfffffffffc6b9000, size: 4096 26 Generic_obj_space<SPACE>::caps_alloc(): virt = 204 27 alloc(): avail: 1732608, addr: 0xfffffffffc6ba000, size: 4096 28 [init -> bomb -> bomb] --- bomb started --- 29 [init -> bomb -> bomb] I'm a leaf node. 30 [init -> bomb] [2] It's time to kill all my children... 31 [init -> bomb] virtual Bomb_child::~Bomb_child() 32 free(): avail: 1732608, addr: 0xfffffffffc6b5000, size: 4096 33 free(): avail: 1798144, addr: 0xfffffffffc6a0000, size: 65536 34 Generic_obj_space<SPACE>::caps_free() 35 free(): avail: 1802240, addr: 0xfffffffffc6b6000, size: 4096 36 free(): avail: 1806336, addr: 0xfffffffffc6ba000, size: 4096 37 Generic_obj_space<SPACE>::caps_free() finished 38 Mem_space::dir_shutdown() 39 Ptab::Walk::destroy(): start: 0, end: 40000, level: 1 40 free(): avail: 1810432, addr: 0xfffffffffc6b8000, size: 4096 41 Ptab::Walk::destroy(): start: 0, end: 800000000, level: 2 42 free(): avail: 1814528, addr: 0xfffffffffc6b3000, size: 4096 43 Mem_space::dir_shutdown() finished 44 free(): avail: 1818624, addr: 0xfffffffffc6d2000, size: 4096 45 free(): avail: 1822720, addr: 0xfffffffffc6d1000, size: 4096 46 [init -> bomb] Done.
01 [init -> bomb] Done. 02 alloc(): avail: 2324480, addr: 0xfc925000, size: 4096 03 Task::create() 04 alloc(): avail: 2320384, addr: 0xfc930000, size: 4096 05 alloc(): avail: 2316288, addr: 0xfc928000, size: 32768 06 Ptab::Walk::walk(): virt = 44000, level = 1 07 alloc(): avail: 2283520, addr: 0xfc939000, size: 4096 08 Task::create() finished 09 alloc(): avail: 2279424, addr: 0xfc926000, size: 4096 10 Generic_obj_space<SPACE>::caps_alloc(): virt = 1 11 alloc(): avail: 2275328, addr: 0xfc927000, size: 4096 12 Ptab::Walk::walk(): virt = f0800, level = 1 13 alloc(): avail: 2271232, addr: 0xfc936000, size: 4096 14 Ptab::Walk::walk(): virt = 102c, level = 1 15 alloc(): avail: 2267136, addr: 0xfc937000, size: 4096 16 Generic_obj_space<SPACE>::caps_alloc(): virt = 204 17 alloc(): avail: 2263040, addr: 0xfc932000, size: 4096 18 [init -> bomb -> bomb] --- bomb started --- 19 [init -> bomb -> bomb] I'm a leaf node. 20 [init -> bomb] [2] It's time to kill all my children... 21 [init -> bomb] virtual Bomb_child::~Bomb_child() 22 free(): avail: 2263040, addr: 0xfc926000, size: 4096 23 free(): avail: 2295808, addr: 0xfc928000, size: 32768 24 Generic_obj_space<SPACE>::caps_free() 25 free(): avail: 2299904, addr: 0xfc926000, size: 4096 26 free(): avail: 2304000, addr: 0xfc932000, size: 4096 27 Ptab::Walk::destroy(): start: f0800, end: f3000, level: 0 28 free(): avail: 2308096, addr: 0xfc936000, size: 4096 29 Generic_obj_space<SPACE>::caps_free() finished 30 Mem_space::dir_shutdown() 31 Ptab::Walk::destroy(): start: 0, end: c0000, level: 0 32 free(): avail: 2312192, addr: 0xfc936000, size: 4096 33 Ptab::Walk::destroy(): start: 0, end: c0000, level: 0 34 free(): avail: 2316288, addr: 0xfc939000, size: 4096 35 Mem_space::dir_shutdown() finished 36 free(): avail: 2320384, addr: 0xfc930000, size: 4096 37 free(): avail: 2324480, addr: 0xfc925000, size: 4096 38 [init -> bomb] Done.
_______________________________________________ l4-hackers mailing list [email protected] http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers
