Unbalanced enable for IRQ 298问题的解决.txt


案例一	: 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()警告信息并不影响机器运行,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值