めも たまにはkmemleakを実行してみる

カーネルは3.8.0にしてたのととりあえずselinuxはdisableにしているときにどんな感じかでチェック。

まずはリークしてるとレポートされたプロセスの一覧を出してみるとこんな感じに。

[root@kanon ~]# grep "  comm \"" /sys/kernel/debug/kmemleak | cut -f2 -d"\"" | sort | uniq                                                                             
(journald)
(lymouthd)
plymouthd
swapper/0
systemctl
systemd
systemd-journal
(ystemctl)
[root@kanon ~]# 

これらの内容をざっと見るとsecurity_sb_allo()、security_inode_alloc()、security_inode_alloc()が絡んでいてselinuxがやっぱり絡んでいるか。。。

その中でswapperプロセスの場合を見てみると、init_sel_fs()が入っているので/sys/kernel/securityをマウントしたりするときに起きてそう。

1 unreferenced object 0xffff88003d3bec60 (size 96):
   2   comm "swapper/0", pid 1, jiffies 4294669017 (age 418.510s)
   3   hex dump (first 32 bytes):
   4     00 9c 00 3e 00 88 ff ff 03 00 00 00 05 00 00 00  ...>............
   5     03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
   6   backtrace:
   7     [<ffffffff815af47b>] kmemleak_alloc+0x5b/0xc0
   8     [<ffffffff8117ffaa>] kmem_cache_alloc_trace+0xca/0x230
   9     [<ffffffff812987aa>] selinux_sb_alloc_security+0x2a/0xa0
  10     [<ffffffff81295776>] security_sb_alloc+0x16/0x20
  11     [<ffffffff8119aa05>] sget+0x175/0x570
  12     [<ffffffff8119bb0e>] mount_single+0x3e/0xd0
  13     [<ffffffff812a0068>] sel_mount+0x18/0x20
  14     [<ffffffff8119bd63>] mount_fs+0x43/0x1b0
  15     [<ffffffff811b535f>] vfs_kern_mount+0x6f/0x100
  16     [<ffffffff811b5409>] kern_mount_data+0x19/0x30
  17     [<ffffffff81b25f5d>] init_sel_fs+0x62/0xa4
  18     [<ffffffff8100215a>] do_one_initcall+0x12a/0x180
  19     [<ffffffff81afc040>] kernel_init_freeable+0x150/0x1df
  20     [<ffffffff815acd2e>] kernel_init+0xe/0xf0
  21     [<ffffffff815d1aac>] ret_from_fork+0x7c/0xb0
  22     [<ffffffffffffffff>] 0xffffffffffffffff
  23 unreferenced object 0xffff88003be2ea20 (size 72):
  24   comm "swapper/0", pid 1, jiffies 4294669017 (age 418.510s)
  25   hex dump (first 32 bytes):
  26     00 c0 80 3b 00 88 ff ff a0 ec 3b 3d 00 88 ff ff  ...;......;=....
  27     70 ea e2 3b 00 88 ff ff 01 00 00 00 03 00 00 00  p..;............
  28   backtrace:
  29     [<ffffffff815af47b>] kmemleak_alloc+0x5b/0xc0
  30     [<ffffffff8117f66b>] kmem_cache_alloc+0xbb/0x200
  31     [<ffffffff81298ca5>] selinux_inode_alloc_security+0x45/0xb0
  32     [<ffffffff8129589e>] security_inode_alloc+0x1e/0x20
  33     [<ffffffff811b04d7>] inode_init_always+0xd7/0x1c0
  34     [<ffffffff811b05f9>] alloc_inode+0x39/0xa0
  35     [<ffffffff811b2653>] new_inode_pseudo+0x13/0x60
  36     [<ffffffff811b26bd>] new_inode+0x1d/0x40
  37     [<ffffffff811bc6e3>] simple_fill_super+0x43/0x1e0
  38     [<ffffffff812a10da>] sel_fill_super+0x2a/0x2f0
  39     [<ffffffff8119bb72>] mount_single+0xa2/0xd0
  40     [<ffffffff812a0068>] sel_mount+0x18/0x20
  41     [<ffffffff8119bd63>] mount_fs+0x43/0x1b0
  42     [<ffffffff811b535f>] vfs_kern_mount+0x6f/0x100
  43     [<ffffffff811b5409>] kern_mount_data+0x19/0x30
  44     [<ffffffff81b25f5d>] init_sel_fs+0x62/0xa4
~~~~~
397 unreferenced object 0xffff88003be2eee8 (size 72):
 398   comm "swapper/0", pid 1, jiffies 4294669017 (age 418.532s)
 399   hex dump (first 32 bytes):
 400     78 e6 80 3b 00 88 ff ff a8 ee e2 3b 00 88 ff ff  x..;.......;....
 401     38 ef e2 3b 00 88 ff ff 01 00 00 00 03 00 00 00  8..;............
 402   backtrace:
 403     [<ffffffff815af47b>] kmemleak_alloc+0x5b/0xc0
 404     [<ffffffff8117f66b>] kmem_cache_alloc+0xbb/0x200
 405     [<ffffffff81298ca5>] selinux_inode_alloc_security+0x45/0xb0
 406     [<ffffffff8129589e>] security_inode_alloc+0x1e/0x20
 407     [<ffffffff811b04d7>] inode_init_always+0xd7/0x1c0
 408     [<ffffffff811b05f9>] alloc_inode+0x39/0xa0
 409     [<ffffffff811b2653>] new_inode_pseudo+0x13/0x60
 410     [<ffffffff811b26bd>] new_inode+0x1d/0x40
 411     [<ffffffff811bc78f>] simple_fill_super+0xef/0x1e0
 412     [<ffffffff812a10da>] sel_fill_super+0x2a/0x2f0
 413     [<ffffffff8119bb72>] mount_single+0xa2/0xd0
 414     [<ffffffff812a0068>] sel_mount+0x18/0x20
 415     [<ffffffff8119bd63>] mount_fs+0x43/0x1b0
 416     [<ffffffff811b535f>] vfs_kern_mount+0x6f/0x100
 417     [<ffffffff811b5409>] kern_mount_data+0x19/0x30
 418     [<ffffffff81b25f5d>] init_sel_fs+0x62/0xa4

fedora 18だとマウントされているsecurityfsは/sys/kernel/securityですし。

securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)

これは疑似ファイルシステムだからマウントされている間はメモリを解放しないだろうからfalse positiveな気もするんだけど、どうなんだろ。

journaldの場合も同じような感じでproc_pid_make_inode()で/proc用にinodeを作ってってとこで。

1255 unreferenced object 0xffff880037902000 (size 72):
1256   comm "(journald)", pid 51, jiffies 4294670234 (age 417.354s)
1257   hex dump (first 32 bytes):
1258     b8 1a 87 3b 00 88 ff ff 08 20 90 37 00 88 ff ff  ...;..... .7....
1259     08 20 90 37 00 88 ff ff 01 00 00 00 01 00 00 00  . .7............
1260   backtrace:
1261     [<ffffffff815af47b>] kmemleak_alloc+0x5b/0xc0
1262     [<ffffffff8117f66b>] kmem_cache_alloc+0xbb/0x200
1263     [<ffffffff81298ca5>] selinux_inode_alloc_security+0x45/0xb0
1264     [<ffffffff8129589e>] security_inode_alloc+0x1e/0x20
1265     [<ffffffff811b04d7>] inode_init_always+0xd7/0x1c0
1266     [<ffffffff811b05f9>] alloc_inode+0x39/0xa0
1267     [<ffffffff811b2653>] new_inode_pseudo+0x13/0x60
1268     [<ffffffff811b26bd>] new_inode+0x1d/0x40
1269     [<ffffffff812017d4>] proc_pid_make_inode+0x14/0xe0
1270     [<ffffffff81201984>] proc_pident_instantiate+0x24/0xd0
1271     [<ffffffff81201aca>] proc_pident_lookup+0x9a/0xf0
1272     [<ffffffff81201b7a>] proc_tgid_base_lookup+0x1a/0x20
1273     [<ffffffff811a1c8d>] lookup_real+0x1d/0x60
1274     [<ffffffff811a6c0e>] do_last+0x91e/0xe50
1275     [<ffffffff811a71f7>] path_openat+0xb7/0x4b0
1276     [<ffffffff811a78c1>] do_filp_open+0x41/0xa0
1277 unreferenced object 0xffff880037902048 (size 72):
1278   comm "(journald)", pid 51, jiffies 4294670234 (age 417.354s)
1279   hex dump (first 32 bytes):
1280     20 1d 87 3b 00 88 ff ff 50 20 90 37 00 88 ff ff   ..;....P .7....
1281     50 20 90 37 00 88 ff ff 01 00 00 00 01 00 00 00  P .7............
1282   backtrace:
1283     [<ffffffff815af47b>] kmemleak_alloc+0x5b/0xc0
1284     [<ffffffff8117f66b>] kmem_cache_alloc+0xbb/0x200
1285     [<ffffffff81298ca5>] selinux_inode_alloc_security+0x45/0xb0
1286     [<ffffffff8129589e>] security_inode_alloc+0x1e/0x20
1287     [<ffffffff811b04d7>] inode_init_always+0xd7/0x1c0
1288     [<ffffffff811b05f9>] alloc_inode+0x39/0xa0
1289     [<ffffffff811b2653>] new_inode_pseudo+0x13/0x60
1290     [<ffffffff811b26bd>] new_inode+0x1d/0x40
1291     [<ffffffff812017d4>] proc_pid_make_inode+0x14/0xe0
1292     [<ffffffff8120581b>] proc_fd_instantiate+0x2b/0xb0
1293     [<ffffffff81201eba>] proc_fill_cache+0x12a/0x160
1294     [<ffffffff812050ea>] proc_readfd_common+0xea/0x1e0
1295     [<ffffffff81205215>] proc_readfd+0x15/0x20
1296     [<ffffffff811aa0b8>] vfs_readdir+0xb8/0xe0
1297     [<ffffffff811aa40f>] sys_getdents+0x8f/0x110
1298     [<ffffffff815d1b59>] system_call_fastpath+0x16/0x1b

これも別に問題なさそうだよなーとも思うんだけど、ホントにメモリリークだったときもあるので気をつけないといけないんんだけどね。