内核升级抢占配置选项问题

一直使用的是2.4的比较旧的内核,在升级到4.15的新内核之后,之前运行稳定的代码一直有各种死锁的情况发生。如下所示,大致原因都是一样的,如下对于同一个读写锁,有的地方并没有锁住下半部,导致问题的发生。

[249739.328755] RIP: 0010:[<ffffffff8143128e>]  [<ffffffff8143128e>] __read_lock_failed+0xe/0x20
[249739.439227] Call Trace:
[249739.441759]  <IRQ> 
[249739.443777]  [<ffffffff81b10880>] _raw_read_lock_bh+0x20/0x30
...
[249739.553055]  [<ffffffff81a10638>] br_handle_frame+0x38/0x50
[249739.558717]  [<ffffffff818b6be2>] __netif_receive_skb_core+0x492/0x7f0
[249739.571335]  [<ffffffff818b6fd3>] netif_receive_skb_internal+0x33/0xa0
[249739.577948]  [<ffffffff818bb70b>] napi_gro_receive+0x5b/0xa0
[249739.601105]  [<ffffffff8166c773>] igb_poll+0x383/0x770
[249739.611643]  [<ffffffff818bbd53>] net_rx_action+0x113/0x2f0
[249739.617303]  [<ffffffff811214ff>] __do_softirq+0xef/0x280
[249739.633413]  [<ffffffff81121895>] irq_exit+0x115/0x120
[249739.638640]  [<ffffffff8106deb8>] do_IRQ+0x58/0xf0
[249739.643519]  [<ffffffff81b10c2d>] common_interrupt+0x6d/0x6d
[249739.649263]  <EOI> 
[249739.658808]  [<ffffffff818e85f1>] write_lock+0x321/0xcf0
[249739.665160]  [<ffffffff81262ca7>] ? poll_freewait+0x47/0xa0
[249739.711821]  [<ffffffff81953c80>] nf_iterate+0x60/0x90
[249739.717046]  [<ffffffff81953d48>] nf_hook_slow+0x98/0x100
[249739.734546]  [<ffffffff8196039f>] ip_queue_xmit+0x15f/0x450
[249739.740204]  [<ffffffff81979534>] tcp_transmit_skb+0x4c4/0x990
[249739.746123]  [<ffffffff8197c8e5>] tcp_connect+0x3f5/0x6a0

但是,2.4的旧内核就没有这类问题,究其原因是其当时还没有加入抢占功能,中断在打断正常的执行流程之后,仍然会返回打断的地方继续执行,所以不会有问题。除了纠正代码中的锁的使用之外,还可在新内核中禁止抢占,配置选项如下:

在这里插入图片描述

这里有三个值:PREEMPT_NONE、PREEMPT_VOLUNTARY和PREEMPT,第一个为传统的Linux内核抢占模型,主要应用于服务器或者科学计算系统,但是调度延时比较大。PREEMPT_VOLUNTARY模型,通过在内核中增加显示抢占点的方式,获得低延时,提供更快速的应用响应,代价是性能的轻微损失。最后一个PREEMPT模型,使得内核所有的代码都可被抢占,即使一个低优先级的进程处于kernel模式正在执行系统调用,也可被非自愿的抢占,适用于桌面或者嵌入式等延时要求在毫秒级的系统。

内核版本 4.15

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页