Page tables apparently don't get completely freed on 64-bit Fiasco.OC

Christian Prochaska christian.prochaska at genode-labs.com
Tue Dec 11 21:04:14 CET 2012


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

-------------- next part --------------
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.

-------------- next part --------------
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.



More information about the l4-hackers mailing list