【问题】
在给Kernel加入了cpufreq支持,启动了cpu freq的debugging,并且在bootargs中加入cpufreq.debug=1,才能真正打开内核中cpu freq的debug。cpu freq驱动是加入了,但是不定期会出现:
__ratelimit: XXX callbacks suppressed
【解决过程】
1.gogole或百度,无果,但是有人建议查看log,看看是否有帮助,所以去:
cat /var/log/messages
发现这样一堆东西:
Dec 31 21:32:56 uclibc user.debug kernel: [42949461.000001] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:32:56 uclibc user.debug kernel: [42949461.200000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:32:56 uclibc user.debug kernel: [42949461.400000] cpufreq-core: target for CPU 0: 69642 kHz, relation 0
Dec 31 21:32:56 uclibc user.debug kernel: [42949461.600000] cpufreq-core: target for CPU 0: 23214 kHz, relation 0
Dec 31 21:32:57 uclibc user.debug kernel: [42949461.800000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:32:57 uclibc user.debug kernel: [42949462.000000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:33:00 uclibc user.warn kernel: [42949465.600000] __ratelimit: 17 callbacks suppressed
Dec 31 21:33:00 uclibc user.debug kernel: [42949465.600011] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:33:01 uclibc user.debug kernel: [42949465.800000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:33:01 uclibc user.debug kernel: [42949466.000000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:33:01 uclibc user.debug kernel: [42949466.200000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
Dec 31 21:33:01 uclibc user.debug kernel: [42949466.400000] cpufreq-core: target for CPU 0: 0 kHz, relation 0
2.去System.map中,找到了函数__ratelimit,说明此函数,是内核里面有源码的。
3.去source Insight中搜索__ratelimit,发现其中一处:
int printk_ratelimit(void)
{
return __ratelimit(&printk_ratelimit_state);
}
EXPORT_SYMBOL(printk_ratelimit);
【解决办法】
上面信息,加上前面的log中的信息,所以想到了,估计是printk中的打印导致的,因为cpu freq core中,加了debug支持,所以会打印这些东西,而且由于cpu freq的调用频率很高,所以导致printk输出来不及了,所以提示__ratelimit: XXX callbacks suppressed。
知道原因,办法很简单,就是去kernel配置menuconfig中,把debug支持去掉:
CPU Power Management —> [ ] Enable CPUfreq debugging
然后同时也把内核启动参数bootargs中的cpufreq.debug=1也去掉,cpu freq code就会不会打印这么多信息了,就不会提示你打印太多,printk都来不及打印了。
【提示】
其他人出现此类问题,很可能也是这类原因,解决办法就是,找到你的内核中到底打印了哪些东西:
cat /var/log/messages
(注意此会无尽的输出,所以等输出一段,看清楚内容后,即可Ctrl +C 中止)
就知道是哪一部分的原因了。比如,USB相关打印太多,导致printk来不及打印等等。
转载地址:http://www.crifan.com/resolved___ratelimit_xxx_callbacks_suppressed/