Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

229224
1178
109351


와치독 Watchdog Kick 동작 비교 (Qualcomm vs Intel vs Mediatek vs nVidia) Linux Kernel - Core Analysis

커널 이슈를 접하면 자연스럽게 와치독 리셋 문제를 만납니다. 많은 커널 개발자들이 디버깅하기 어려운 문제 중 하나가와치독 리셋이라고 말합니다. 하지만 각 SoC 시스템에서 와치독 구현 원리를 정확히 파악하면 디버깅이 커널 패닉보다 오히려 쉬운 경우가 많습니다. 

이제 각각 SoC별로 와치독 동작에 대해 간단히 비교 리뷰를 해볼께요.

Qualcomm - MSM
msm_watchdog이라는 커널 쓰레드가 와치독 동작을 담당합니다. 이 커널 쓰레드는 부팅 과정에서 생성된 후 10초 간격으로 실행됩니다. 

10초 후 msm_watchdog 쓰레드가 실행 되면
1> 현재 핫플러그인 되지 않은 active 한 CPU에 IPI(Interprocess Interrupt: CPU간 통신을 위해 인터럽트 인터페이스 지원) 콜을 수행합니다.
2> 모든 CPU에서 응답이 제대로 오면 와치독 킥을 수행 합니다. 이 동작은 pet_watchdog 함수에서 확인할 수 있습니다.
만약 CPU에 IPI 콜을 수행하고 응답이 안오면 와치독 킥을 수행하지 못해 6초후 와치독 Bark란 IRQ가 Trigger되어 시스템이 리셋됩니다.

MSM에서는 watchdog kick을 watchdog pet이라고 하는데요. 사실 임베디드 세상에서 많이 불리는 용어는 아니죠.

Mediatek - MT675x(MT6750/MT6755)
MTK SoC에서는 CPU별 hotplugin 동작을 Trigger할 때 CPU별 비트 필드를 enable/disable하구요,
이후 hotplugin동작이 완료되면 호출되는 notifier 함수가 실행될 때 CPU별 비트 필드를 enable/disable 하죠.

10초 주기로 타이머를 수행하는데요.
두개의 CPU별 비트 필드를 비교해서 비트 값이 같으면 Watchdog kick을 수행하구요 반대의 경우 CPU가 Stuck되어 hotplugin이 제대로 완료가 되지 않았다고 판단하고, Watchdog Kick을 안하게 되죠. 이후 20초 후에 Watchdog Reset이 Trigger되죠.

Intel x86 - Moorestone/Medfiled
Intel x86 Architecture를 탑재한 SoC(Moorestone/Medfiled) SCU Watchdog 동작에 대해서 간단히 리뷰를 하고자 해요.
다른 SoC와는 다르게 Intel Moorestone/Medfiled SoC는 시스템 콜로 Watchdog kick을 수행해요.
[  136.22493 01-01 00:02:20.560 CPU0] Call Trace:
[  136.22506 01-01 00:02:20.560 CPU0]  [<ffffffff826726d1>] watchdog_keepalive+0x81/0xb0
[  136.22521 01-01 00:02:20.560 CPU0]  [<ffffffff82672cd5>] intel_scu_write+0x35/0x60
[  136.22535 01-01 00:02:20.560 CPU0]  [<ffffffff821ba6a6>] vfs_write+0xb6/0x1c0
[  136.22549 01-01 00:02:20.560 CPU0]  [<ffffffff821bab3d>] SyS_write+0x4d/0x90
[  136.22563 01-01 00:02:20.560 CPU0]  [<ffffffff82a24ae5>] sysenter_dispatch+0x7/0x23

해당 코드는 아래와 같아요.
static ssize_t intel_scu_write(struct file *file, char const *data, size_t len,
                              loff_t *ppos)
{
        pr_debug("watchdog %s\n", __func__);

        if (watchdog_device.shutdown_flag == true)
                /* do nothing if we are shutting down */
                return len;

        if (watchdog_device.started) {
                /* Watchdog already started, keep it alive */
                watchdog_keepalive();
        }

        return len;
}

nVidia - Tegra
Tegra SoC에서는 10초 주기로 실행되는 delayed_work 타입의 와치독용 워크큐를 실행하고 delayed_work가 실행될 시 Watchdog Kick을 수행하죠.
만약 delayed_work이 실행이 안되면 Watchdog Kick을 못해서 Tegra Watchdog Reset(테그라 와치독 리셋)이 Trigger되죠.
 
어떤 SoC를 탑재해서 일을 하던 가장 먼저 점검해야 할 SW 구조는 Watchdog Kick 드라이버 랍니다.
이 구조를 모르면 Watchdog Reset이 발생했을때 어떤 포인트로 디버깅을 할 지 감을 잡기 어렵죠.



Reference(프로세스 관리)
4.9 프로세스 컨택스트 정보는 어떻게 저장할까?
 4.9.1 컨택스트 소개
 4.9.2 인터럽트 컨택스트 정보 확인하기
 4.9.3 Soft IRQ 컨택스트 정보 확인하기
 4.9.4 선점 스케줄링 여부 정보 저장
4.10 프로세스 디스크립터 접근 매크로 함수
 4.10.1 current_thread_info()
 4.10.2 current 매크로란
4.11 프로세스 디버깅
 4.11.1 glibc fork 함수 gdb 디버깅
 4.11.2 유저 프로그램 실행 추적 

덧글

댓글 입력 영역