ドライバロード時にメモリアロケーションが失敗する
akahana-1 opened this issue · 4 comments
akahana-1 commented
メモリが数百MB空いているときでもドライバロード時にメモリアロケーションが失敗するケースがあります。
発生した際の free -h
の出力と dmesg
は
# free -h
total used free shared buff/cache available
Mem: 3.8G 418M 824M 12M 2.6G 3.2G
Swap: 11G 103M 11G
[2753909.691583] px4_drv: px4_drv version 0.2.0, rev: 134, commit: 59d380ddb7503a9c01eeda165e2f921a1ed29f12 @ develop
[2753909.691621] modprobe: page allocation failure: order:7, mode:0x2080020(GFP_ATOMIC)
[2753909.691628] CPU: 2 PID: 15211 Comm: modprobe Tainted: G O 4.9.0-8-amd64 #1 Debian 4.9.110-3+deb9u6
[2753909.691629] Hardware name: HP ProLiant ML110 G7, BIOS J01 07/01/2013
[2753909.691631] 0000000000000000 ffffffff9e531e54 ffffffff9ec016e8 ffffa98ec08b78d8
[2753909.691634] ffffffff9e38a84a 0208002000000001 ffffffff9ec016e8 ffffa98ec08b7878
[2753909.691637] ffff971200000010 ffffa98ec08b78e8 ffffa98ec08b7898 ee601e5120ae90be
[2753909.691639] Call Trace:
[2753909.691646] [<ffffffff9e531e54>] ? dump_stack+0x5c/0x78
[2753909.691650] [<ffffffff9e38a84a>] ? warn_alloc+0x13a/0x160
[2753909.691653] [<ffffffff9e38ab74>] ? __alloc_pages_slowpath+0x294/0xbf0
[2753909.691656] [<ffffffff9e24810e>] ? native_send_call_func_ipi+0xee/0x100
[2753909.691658] [<ffffffff9e38b6d1>] ? __alloc_pages_nodemask+0x201/0x260
[2753909.691661] [<ffffffff9e3dc991>] ? alloc_pages_current+0x91/0x140
[2753909.691663] [<ffffffff9e386fea>] ? __get_free_pages+0xa/0x30
[2753909.691669] [<ffffffffc0c3823c>] ? ringbuffer_alloc+0x9c/0x150 [px4_drv]
[2753909.691674] [<ffffffffc0c30829>] ? px4_probe+0x1f9/0x9b0 [px4_drv]
[2753909.691679] [<ffffffff9e68c6bd>] ? __pm_runtime_set_status+0x1bd/0x270
[2753909.691691] [<ffffffffc03e9282>] ? usb_probe_interface+0x162/0x2c0 [usbcore]
[2753909.691694] [<ffffffff9e681403>] ? driver_probe_device+0x223/0x430
[2753909.691696] [<ffffffff9e6816ed>] ? __driver_attach+0xdd/0xe0
[2753909.691698] [<ffffffff9e681610>] ? driver_probe_device+0x430/0x430
[2753909.691699] [<ffffffff9e67ef39>] ? bus_for_each_dev+0x69/0xb0
[2753909.691701] [<ffffffff9e68063a>] ? bus_add_driver+0x16a/0x260
[2753909.691703] [<ffffffff9e681f97>] ? driver_register+0x57/0xc0
[2753909.691711] [<ffffffffc03e7bab>] ? usb_register_driver+0x7b/0x130 [usbcore]
[2753909.691716] [<ffffffffc0c30fe0>] ? px4_probe+0x9b0/0x9b0 [px4_drv]
[2753909.691719] [<ffffffffc0c31077>] ? px4_module_init+0x97/0x100 [px4_drv]
[2753909.691722] [<ffffffff9e20218e>] ? do_one_initcall+0x4e/0x180
[2753909.691724] [<ffffffff9e3ca24d>] ? __vunmap+0x6d/0xc0
[2753909.691728] [<ffffffff9e37fdd1>] ? do_init_module+0x5b/0x1f6
[2753909.691730] [<ffffffff9e30372a>] ? load_module+0x25ba/0x2ac0
[2753909.691732] [<ffffffff9e2ffe50>] ? __symbol_put+0x60/0x60
[2753909.691735] [<ffffffff9e303e76>] ? SYSC_finit_module+0xc6/0xf0
[2753909.691737] [<ffffffff9e203b7d>] ? do_syscall_64+0x8d/0xf0
[2753909.691740] [<ffffffff9e815c4e>] ? entry_SYSCALL_64_after_swapgs+0x58/0xc6
[2753909.691741] Mem-Info:
[2753909.691746] active_anon:6612 inactive_anon:13420 isolated_anon:0
active_file:249673 inactive_file:424723 isolated_file:0
unevictable:0 dirty:131 writeback:0 unstable:0
slab_reclaimable:22912 slab_unreclaimable:18795
mapped:7457 shmem:3266 pagetables:1647 bounce:0
free:193572 free_pcp:678 free_cma:0
[2753909.691750] Node 0 active_anon:26448kB inactive_anon:53680kB active_file:998692kB inactive_file:1698892kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:29828kB dirty:524kB writeback:0kB shmem:13064kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB unstable:0kB pages_scanned:0 all_unreclaimable? no
[2753909.691751] Node 0 DMA free:15828kB min:268kB low:332kB high:396kB active_anon:0kB inactive_anon:0kB active_file:12kB inactive_file:32kB unevictable:0kB writepending:0kB present:15956kB managed:15872kB mlocked:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[2753909.691756] lowmem_reserve[]: 0 3752 3868 3868 3868
[2753909.691759] Node 0 DMA32 free:755936kB min:65288kB low:81608kB high:97928kB active_anon:25416kB inactive_anon:52344kB active_file:985068kB inactive_file:1666500kB unevictable:0kB writepending:524kB present:3946704kB managed:3870084kB mlocked:0kB slab_reclaimable:82008kB slab_unreclaimable:60160kB kernel_stack:2944kB pagetables:6120kB bounce:0kB free_pcp:2296kB local_pcp:660kB free_cma:0kB
[2753909.691764] lowmem_reserve[]: 0 0 116 116 116
[2753909.691767] Node 0 Normal free:2524kB min:2020kB low:2524kB high:3028kB active_anon:1032kB inactive_anon:1336kB active_file:13612kB inactive_file:32360kB unevictable:0kB writepending:0kB present:196604kB managed:119080kB mlocked:0kB slab_reclaimable:9640kB slab_unreclaimable:15020kB kernel_stack:1952kB pagetables:468kB bounce:0kB free_pcp:416kB local_pcp:80kB free_cma:0kB
[2753909.691772] lowmem_reserve[]: 0 0 0 0 0
[2753909.691775] Node 0 DMA: 3*4kB (M) 3*8kB (M) 1*16kB (M) 3*32kB (UM) 3*64kB (UH) 3*128kB (UMH) 3*256kB (UMH) 2*512kB (UM) 3*1024kB (UMH) 1*2048kB (U) 2*4096kB (ME) = 15828kB
[2753909.691788] Node 0 DMA32: 79060*4kB (UMEH) 45411*8kB (UMEH) 4746*16kB (UMEH) 2*32kB (MH) 1*64kB (H) 1*128kB (H) 1*256kB (H) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 755976kB
[2753909.691800] Node 0 Normal: 211*4kB (UE) 176*8kB (UME) 17*16kB (UME) 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 2524kB
[2753909.691810] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[2753909.691811] 684345 total pagecache pages
[2753909.691812] 6675 pages in swap cache
[2753909.691813] Swap cache stats: add 1838298, delete 1831623, find 88424673/89011482
[2753909.691814] Free swap = 12103456kB
[2753909.691815] Total swap = 12209148kB
[2753909.691815] 1039816 pages RAM
[2753909.691816] 0 pages HighMem/MovableOnly
[2753909.691817] 38557 pages reserved
[2753909.691817] 0 pages hwpoisoned
[2753909.691822] px4_drv: probe of 2-1.4:1.0 failed with error -12
です。
発生環境は
HW: HP ML110 G7
uname -a
: Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux
ditribution: Debian GNU/Linux 9 (stretch)
px4_drv version: 59d380d
Tuner: PX-W3PE4
です。
dmesgを読んだ限りだとページキャッシュに乗っているページを追い出す時に失敗しているようなので、こちらの環境設定の問題かもしれませんが、数百MB単位でメモリが空いている時にドライバロードに失敗するのは不自然かなと思います。
masnagam commented
nns779 commented
ご報告ありがとうございます。
どうやらメモリを確保する際のフラグが、高優先度のGFP_ATOMICではなくGFP_KERNELでも動作するようですので、試しにその変更をtest
ブランチの 4d1d3c5 にて行ってみました。
この変更によって、空きメモリが少なくても問題なくドライバのロードが成功するようになるかもしれません。
ただし、場合によっては思わぬ副作用(フリーズ等)が発生することがあるかもしれません。