nns779/px4_drv

ドライバロード時にメモリアロケーションが失敗する

akahana-1 opened this issue · 4 comments

メモリが数百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単位でメモリが空いている時にドライバロードに失敗するのは不自然かなと思います。

多分設定されていないと思いますが,tsdev_max_packets で確保するサイズが変わるようです.

ret = ringbuffer_alloc(tsdev->ringbuf, 188 * tsdev_max_packets);

念の為,確認しておいたほうが良いかもしれません.

ご報告ありがとうございます。

どうやらメモリを確保する際のフラグが、高優先度のGFP_ATOMICではなくGFP_KERNELでも動作するようですので、試しにその変更をtest ブランチの 4d1d3c5 にて行ってみました。
この変更によって、空きメモリが少なくても問題なくドライバのロードが成功するようになるかもしれません。
ただし、場合によっては思わぬ副作用(フリーズ等)が発生することがあるかもしれません。

対応ありがとうございます。 4d1d3c5 の更新を適用したところ、同種の状況でドライバロードが成功するようになりました。今のところ特に副作用等も発生していないです。

ご確認ありがとうございます。

こちらでも改めてGFPフラグについて調査を行ったところ、 4d1d3c5 の変更によって副作用が発生する可能性はなさそうだということが分かりましたので、developブランチにマージしました。

また何か問題が発生いたしましたら、ご報告いただけると幸いです。