案例一 : tp(gsl915)驱动中大量打印警告log
现象 : 项目无法完整跑完cts,mtk怀疑是tp大量警告log导致
平台 : androidN,MTK6737
排查过程: 1. 以下log井喷:
[ 77.574558] -(1)[160:mtk-tpd]------------[ cut here ]------------
[ 77.574586] -(1)[160:mtk-tpd]WARNING: CPU: 1 PID: 160 at /home/android006/codec_37_n_base_v669_L500_cts_user_new/alps/kernel-3.18/kernel/irq/manage.c:454 __enable_irq+0x40/0x88()
[ 77.574603] -(1)[160:mtk-tpd]Unbalanced enable for IRQ 298
[ 77.574625] -(1)[160:mtk-tpd]CPU: 1 PID: 160 Comm: mtk-tpd Tainted: G W 3.18.19 #3
[ 77.574642] -(1)[160:mtk-tpd]Hardware name: MT6737M (DT)
[ 77.574658] -(1)[160:mtk-tpd]Call trace:
[ 77.574680] -(1)[160:mtk-tpd][<ffffffc000088dd0>] dump_backtrace+0x0/0x140
[ 77.574701] -(1)[160:mtk-tpd][<ffffffc000088f24>] show_stack+0x14/0x1c
[ 77.574722] -(1)[160:mtk-tpd][<ffffffc00098aba4>] dump_stack+0x80/0xa4
[ 77.574744] -(1)[160:mtk-tpd][<ffffffc00009c2e4>] warn_slowpath_common+0x88/0xb0
[ 77.574765] -(1)[160:mtk-tpd][<ffffffc00009c388>] warn_slowpath_fmt+0x50/0x58
[ 77.574787] -(1)[160:mtk-tpd][<ffffffc0000e434c>] __enable_irq+0x40/0x88
[ 77.574809] -(1)[160:mtk-tpd][<ffffffc0000e43fc>] enable_irq+0x68/0x78
[ 77.574831] -(1)[160:mtk-tpd][<ffffffc0006e5768>] touch_event_handler+0x5c/0x10c
[ 77.574855] -(1)[160:mtk-tpd][<ffffffc0000b68bc>] kthread+0xe0/0xe8
[ 77.574873] -(1)[160:mtk-tpd]---[ end trace f821033c5d672080 ]---
[ 77.589709] (1)[1079:PerfServiceMana][name:mt_cpufreq&][Power/cpufreq] @_mt_cpufreq_set_locked(): Vproc = 1062mv, freq = 858000 KHz
[ 77.589867] -(1)[1079:PerfServiceMana]===tpd irq interrupt===
[ 77.589915] -(1)[1079:PerfServiceMana]irq event 298: bogus return value edc4000
[ 77.589939] -(1)[1079:PerfServiceMana]CPU: 1 PID: 1079 Comm: PerfServiceMana Tainted: G W 3.18.19 #3
[ 77.589947] (0)[160:mtk-tpd]===touch_event_handler, task running===
[ 77.589970] -(1)[1079:PerfServiceMana]Hardware name: MT6737M (DT)
[ 77.589987] -(1)[1079:PerfServiceMana]Call trace:
[ 77.590018] -(1)[1079:PerfServiceMana][<ffffffc000088dd0>] dump_backtrace+0x0/0x140
[ 77.590038] -(1)[1079:PerfServiceMana][<ffffffc000088f24>] show_stack+0x14/0x1c
[ 77.590061] -(1)[1079:PerfServiceMana][<ffffffc00098aba4>] dump_stack+0x80/0xa4
[ 77.590086] -(1)[1079:PerfServiceMana][<ffffffc0000e523c>] __report_bad_irq+0x38/0xdc
[ 77.590107] -(1)[1079:PerfServiceMana][<ffffffc0000e5590>] note_interrupt+0x5c/0x274
[ 77.590129] -(1)[1079:PerfServiceMana][<ffffffc0000e3528>] handle_irq_event_percpu+0x1c8/0x20c
[ 77.590149] -(1)[1079:PerfServiceMana][<ffffffc0000e35b8>] handle_irq_event+0x4c/0x78
[ 77.590171] -(1)[1079:PerfServiceMana][<ffffffc0000e608c>] handle_level_irq+0xe0/0x114
[ 77.590192] -(1)[1079:PerfServiceMana][<ffffffc0000e2b60>] generic_handle_irq+0x2c/0x3c
[ 77.590216] -(1)[1079:PerfServiceMana][<ffffffc0002db5cc>] mt_eint_demux+0x268/0x364
[ 77.590235] -(1)[1079:PerfServiceMana][<ffffffc0000e2b60>] generic_handle_irq+0x2c/0x3c
[ 77.590255] -(1)[1079:PerfServiceMana][<ffffffc0000e2ca4>] __handle_domain_irq+0x134/0x1f0
[ 77.590275] -(1)[1079:PerfServiceMana][<ffffffc0000815c0>] gic_handle_irq+0x50/0x80
[ 77.590294] -(1)[1079:PerfServiceMana]Exception stack(0xffffffc00edc7eb0 to 0xffffffc00edc7fd0)
[ 77.590315] -(1)[1079:PerfServiceMana]7ea0: 00000000 00000000 e37199a0 0000007d
[ 77.590338] -(1)[1079:PerfServiceMana]7ec0: ffffffff ffffffff fdf59e00 0000007d e371a150 0000007d e37199a0 0000007d
[ 77.590360] -(1)[1079:PerfServiceMana]7ee0: 00000004 00000000 e37199e0 0000007d 00000058 00000000 e371a3d0 0000007d
[ 77.590382] -(1)[1079:PerfServiceMana]7f00: 00008000 00000000 fefefefe fefefefe 00000208 00000000 e3719bb0 0000007d
[ 77.590404] -(1)[1079:PerfServiceMana]7f20: 00000001 00000000 fdfc662c 0000007d ffffffff 00000000 0ccccccc 00000000
[ 77.590426] -(1)[1079:PerfServiceMana]7f40: fdfc663c 0000007d fdfa8668 0000007d fdfa830c 0000007d e3719bc0 0000007d
[ 77.590448] -(1)[1079:PerfServiceMana]7f60: 00000000 00000000 e371a150 0000007d e37199a0 0000007d e3719baf 0000007d
[ 77.590470] -(1)[1079:PerfServiceMana]7f80: 00000001 00000000 000003ff 00000000 e3719bc0 0000007d 00004200 00000000
[ 77.590492] -(1)[1079:PerfServiceMana]7fa0: 00000000 00000000 e3719bc0 0000007d defd2b20 4558a25c e37197c0 0000007d
[ 77.590511] -(1)[1079:PerfServiceMana]7fc0: fdf5e7fc 0000007d e3719770 0000007d
[ 77.590527] -(1)[1079:PerfServiceMana]handlers:
[ 77.590546] -(1)[1079:PerfServiceMana][<ffffffc0006e3ed4>] tpd_eint_interrupt_handler
2.WARN log井喷原因分析:
enable_irq()必须与disable_irq()成对出现。
diaable_irq()会对一个全局变量+1,enable_irq()会对该变量-1。初始值为0,如果原本就是0,再次-1,就会报警告信息
3.相关代码:
3.1 kernel-3.18/drivers/input/touchscreen/mediatek/gsl915/mtk_gslX680_V2.c
static int touch_event_handler(void *unused)
{
struct sched_param param = { .sched_priority = RTPM_PRIO_TPD };
sched_setscheduler(current, SCHED_RR, ¶m);
do
{
enable_irq(gsl_touch_irq); // 由此应发--调用 __enable_irq()
set_current_state(TASK_INTERRUPTIBLE);
wait_event_interruptible(waiter, tpd_flag != 0);
...
} while (!kthread_should_stop());
return 0;
}
3.2 kernel-3.18/kernel/irq/manage.c
void __enable_irq(struct irq_desc *desc, unsigned int irq)
{
switch (desc->depth) {
case 0:
err_out:
WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq); // 大量井喷的警告信息
break;
case 1:
...
default:
desc->depth--; // disable --
}
}
void __disable_irq(struct irq_desc *desc, unsigned int irq)
{
if (!desc->depth++) // enable ++
irq_disable(desc);
}
4.解决方法: 分析代码逻辑,去掉无必要的enable_irq
总结 : WARN()警告信息并不影响机器运行,
Unbalanced enable for IRQ 298问题的解决.txt
最新推荐文章于 2023-10-22 00:18:58 发布