免费注册 查看新帖 |

Chinaunix

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

求助! hotcpu功能中,cpu无法起来 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-09 11:07 |只看该作者 |倒序浏览
linux内核版本为 2.6.21.

JASPER是X86_64的构架, 有hot cpu功能,一共有16个核, 我通过如下顺序测试hot cpu时出现问题:

1. 首先启动单板, 16个核全部起来
2. 通过 echo 0 > /sys/devices/system/cpu/cpu1/online
           echo 0 > /sys/devices/system/cpu/cpu2/online
          ...
   将 1-15号核关闭, 只留0核还在跑

3. echo 1 > /sys/devices/system/cpu/cpu1/online  
   启动1核, 正常

4.  但 echo 1 > /sys/devices/system/cpu/cpu2/online  
   启动2核时,  2核无法启动

如果先启动2核,再启动1核的话, 那么2核正常, 1核起不来!

分析:
一。
hot cpu启动第二个核时函数执行顺序为
_cpu_up->raw_notifier_call_chain-> notifier_call_chain ->  nb->notifier_call
其中 nb->notifier_call 为回调函数, 会调用所有注册在 cpu_chain 通知链中的函数。
我在 ret = nb->notifier_call(nb, val, v); 这句话前增加打印看都是调用的哪些函数,发现调用的第一个回调为migration_call, 而且进入这个函数就失败了 (我在 migration_call 的起始地方加了打印, 发现没有执行到这句打印)。

也就是说 cpu2 应该是进入 migration_call 就没有任何反应了。

二。
在 tick_notify 中也加了一些打印, 发现后续cpu0有很多打印, reason 值为 3或4, 执行的语句如下,
        case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:
        case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:
                tick_broadcast_oneshot_control(reason);
                break;

这种打印非常多, 不停的刷屏。

查了一下代码 只有在 acpi_processor_idle 函数中才会使得reason为3或4, 并且调用 tick_notify
acpi_processor_idle->acpi_state_timer_broadcast->tick_notify

三。
现在有几个疑问:
1。为什么cpu2 明明调用了 migration_call, 但现在现象貌似这个函数没有执行?
2。为什么cpu0会不断的刷屏, acpi_processor_idle 函数是干什么的,什么情况下会调用此函数呢 ?
3。cpu2 为什么起不来, cpu0 不停调用 acpi_processor_idle 跟 cpu2 不能启动是否有什么关联?

出现的问题很奇怪, 请路过的大虾指点一下, 或看看有什么查问题的思路, 多谢了呵呵!

论坛徽章:
0
2 [报告]
发表于 2010-02-10 09:39 |只看该作者
acpi_processor_idle 如果配置了acpi电源管理,那么idle就是这个进程

什么叫起不来? 检查一下cpu_online_map

论坛徽章:
0
3 [报告]
发表于 2010-02-10 09:59 |只看该作者
acpi_processor_idle 是idle的话, 那么cpu0不停打印是正确的, 此时cpu0没有任何任务.

起不来是指 cpu2 调用migration_call 时就停止不动了, 就好像死锁一般.

cpu_online_map 我来加点打印看看.

论坛徽章:
0
4 [报告]
发表于 2010-02-23 19:03 |只看该作者
当1-15核全部down时, cpu online 位图是 1, 当1核起来后cpu online 是 3(即二进制的 11), 应该是正确的。

但启动cpu2时有问题, 我加了一些打印大致如下:

/ # echo 1 > /sys/devices/system/cpu/cpu2/online  //此命令表示准备启动 cpu2。调用函数顺序大概为 _cpu_up -> raw_notifier_call_chain -> notifier_call_chain -〉  nb->notifier_call 调用注册的回调函数。

go in _cpu_up, cpu=2, smp_processor_id=1   // 这里表示当前cpu是1, 准备在cpu1上启动cpu2
notifier_call : ffffffff8103226f , cpu=2, smp_processor_id=1   //  cpu1调用注册的回调函数migration_call( ffffffff8103226f )。按道理调用后会有打印,但一直也没有。 从此cpu1上再也没有任何打印了。

notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0  //从这里开始只有 cpu0 上的打印, 调用 tick_notify(ffffffff81050de0 ).  smp_processor_id=0 表示当前cpu为0; cpu=686702604 打印有误,不关注。

notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0

in tick_notify, reason=4, cpu = 0, smp_processor_id=0
in tick notify, cpu id = 0, dump stack....

Call Trace:                                           // 调用tick_notify时,我将堆栈打印出来了,表明是idle状态。 但这里有  start_kernel, 这里表示内核重起了吗?
[<ffffffff81050e4a>] tick_notify+0x6a/0x3e2
[<ffffffff81045d35>] notifier_call_chain+0xa3/0xff
[<ffffffff81050b57>] clockevents_notify+0x24/0x6c
[<ffffffff8119fa50>] acpi_processor_idle+0x2ba/0x466
[<ffffffff8119f796>] acpi_processor_idle+0x0/0x466
[<ffffffff8100896b>] cpu_idle+0xa3/0xcb
[<ffffffff815d08c5>] start_kernel+0x2fe/0x30a
[<ffffffff815d0165>] _sinittext+0x165/0x170


notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
notifier_call : ffffffff81050de0 , cpu=686702604, smp_processor_id=0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP