免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1574 | 回复: 4
打印 上一主题 下一主题

[内核模块] 请教一个内核模块加载时的内存分配失败的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-02 17:52 |只看该作者 |倒序浏览
今天加载一个enc内核模块,碰到一个内存分配失败的问题,想请教一下,

出错的时,func_a调用了kzalloc(1M,GFP_KERNEL),根据之前的知识,我的理解是这是slab分配器分配失败的原因,但1M内存对应于order 8,而
“Normal: 1203*4kB 169*8kB 85*16kB 48*32kB 19*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 11684kB”显示buddy system有一块大小为1M的连续内存。我的疑问是,为什么slab分配器不能够从buddy中分配这块内存呢?

OOM打印如下:

insmod: page allocation failure: order:8, mode:0xd0
[   19.860000] Backtrace:
[   19.860000] [<8001126c>] (dump_backtrace+0x0/0x10c) from [<8037c248>] (dump_stack+0x18/0x1c)
[   19.880000]  r6:00000000 r5:000000d0 r4:00000001 r3:8048fc38
[   19.880000] [<8037c230>] (dump_stack+0x0/0x1c) from [<8006d6d4>] (warn_alloc_failed+0xf4/0x11
[   19.900000] [<8006d5e0>] (warn_alloc_failed+0x0/0x11 from [<8006f8cc>] (__alloc_pages_nodemask+0x580/0x5dc)
[   19.920000]  r3:81bddd2c r2:00000000
[   19.920000]  r7:00000008 r6:00000001 r5:81bdc000 r4:000000d0
[   19.940000] [<8006f34c>] (__alloc_pages_nodemask+0x0/0x5dc) from [<8037d2bc>] (cache_alloc_refill+0x2d8/0x5d0)
[   19.960000] [<8037cfe4>] (cache_alloc_refill+0x0/0x5d0) from [<800964c8>] (kmem_cache_alloc+0x64/0xb4)
[   19.980000] [<80096464>] (kmem_cache_alloc+0x0/0xb4) from [<7f02c024>] (func_a+0x158/0x2b8 [enc])
[   20.000000]  r7:7f03de40 r6:01800000 r5:80496ac4 r4:7f03e194
[   20.000000] [<7f02becc>] (func_a+0x0/0x2b8 [enc]) from [<7f02e168>] (func_b+0x54/0x2b0 [enc])
[   20.020000]  r7:7f03de40 r6:00000000 r5:7f045094 r4:804afe58
[   20.020000] [<7f02e114>] (func_b+0x0/0x2b0 [enc]) from [<7f0450b4>] (init_func+0x20/0xbc [enc])
[   20.040000]  r7:81b88420 r6:00000000 r5:7f045094 r4:7f03d0e8
[   20.040000] [<7f045094>] (init_func+0x0/0xbc [enc]) from [<80008564>] (do_one_initcall+0x98/0x16
[   20.060000]  r5:7f045094 r4:7f03dcc8
[   20.060000] [<800084cc>] (do_one_initcall+0x0/0x16 from [<8005840c>] (sys_init_module+0x1580/0x176c)
[   20.080000]  r9:00000024 r8:00000001 r7:81b88420 r6:7f03dd10 r5:00000001
[   20.080000] r4:7f03dcc8
[   20.100000] [<80056e8c>] (sys_init_module+0x0/0x176c) from [<8000dac0>] (ret_fast_syscall+0x0/0x30)
[   20.120000] Mem-info:
[   20.120000] Normal per-cpu:
[   20.130000] CPU    0: hi:    6, btch:   1 usd:   4
[   20.140000] active_anon:136 inactive_anon:2541 isolated_anon:0
[   20.140000]  active_file:139 inactive_file:148 isolated_file:0
[   20.140000]  unevictable:0 dirty:0 writeback:0 unstable:0
[   20.140000]  free:2914 slab_reclaimable:147 slab_unreclaimable:803
[   20.140000]  mapped:104 shmem:2544 pagetables:32 bounce:0
[   20.150000] Normal free:11656kB min:732kB low:912kB high:1096kB active_anon:544kB inactive_anon:10164kB active_file:556kB inactive_file:592kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:33528kB mlocked:0kB dirty:0kB writeback:0kB mapped:416kB shmem:10180kB slab_reclaimable:588kB slab_unreclaimable:3212kB kernel_stack:296kB pagetables:128kB unstable:0kB bounce:0kB writeback_tmp:0kB pages_scanned:7 all_unreclaimable? no
[   20.170000] lowmem_reserve[]: 0 0
[   20.170000] Normal: 1203*4kB 169*8kB 85*16kB 48*32kB 19*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 11684kB
[   20.180000] 2825 total pagecache pages
[   20.190000] 0 pages in swap cache
[   20.190000] Swap cache stats: add 0, delete 0, find 0/0
[   20.200000] Free swap  = 0kB
[   20.200000] Total swap = 0kB
[   20.210000] 8448 pages of RAM
[   20.210000] 2989 free pages
[   20.220000] 1298 reserved pages
[   20.220000] 951 slab pages
[   20.220000] 544 pages shared
[   20.230000] 0 pages swap cached
[   20.230000] SLAB: Unable to allocate memory on node 0 (gfp=0xd0)
[   20.240000]   cache: size-1048576, object size: 1048576, order: 8
[   20.250000]   node 0: slabs: 1/1, objs: 1/1, free: 0
insmod: can't insert '/mnt/enc.ko': Cannot allocate memory

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2015-11-02 18:45 |只看该作者
回复 1# alexhak2004

建议看一下 kzalloc 的实现,这个应该比较好跟。

据我以前老的内核知识来讲,内核中的连续大块内存,是比较珍贵的资源。你这 1M 属于比较大的了,如果没有特别需要,可以考虑用 vmalloc。

   

论坛徽章:
0
3 [报告]
发表于 2015-11-03 09:35 |只看该作者
谢谢回复,这里之所以使用kzalloc是因为给硬件使用,需要连续,所以vmalloc不能满足要求。

而我的疑问是,从打印“Normal: 1203*4kB 169*8kB 85*16kB 48*32kB 19*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB”看,buddy中是有一块大小为1M的连续内存的,但为何分配不出来。

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
4 [报告]
发表于 2015-11-03 10:56 |只看该作者
旧内核版本中slab有限制,试试get free page接口。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
5 [报告]
发表于 2015-11-03 12:20 |只看该作者
不知道跟reserve之类的逻辑是不是有关系?

PS,分配的时候2M和4M的页面都没有了,只剩下1M的页面,整体比较紧张了。
也许watermark_ok之类的函数做个更严格的检查?(细节记不太清楚了)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP