kthread_should_stop과 kernel panic

RaspberryPi 3에서 Raspbian Stretch 4.14.70-v7+를 사용중입니다.

커널단에서 인터럽트 핸들링을 위해 ISR을 등록해놨는데

ISR을 가볍게 하기 위해 ISR에서는 플래깅을, 별도로 준비된 kthread에서는 무한루프를 돌면서 플래그에 따라 동작을 하도록 만들었습니다.

kthread의 구현은 단순합니다. 주기적으로 시그널을 날리는 작업밖에 안하기 때문에, 단일 스레드로 구성하여

while(!kthread_should_stop()) {
    ...
}

처럼 사용했는데 이상하게 커널 패닉이 계속 나더라구요

제가 커널을 잘 다룰줄 몰라서 rcu_read_lock을 사용을 안했었는데, 혹시 락때문이었나하는 의문이 들었습니다.

특히 kthread_should_stop부분에서 커널 패닉이 의심됐구요, 구글링하면서 잠깐 본거로는 kthread_should_stop에서 약간 대기시간이 있다고 하네요. 해당부분 대기시간과 인터럽트 발생 및 ISR이 같이 발생해서 CPU stall이 발생한게 아닐까 합니다.

while(true) {
    rcu_read_lock();
    if (kthread_should_stop()) {
        rcu_read_unlock();
        clean-up();
        break;
    } else {
        some_routine();
    }
}

결과적으로는 ISR의 플래깅부분과 kthread의 kthread_should_stop부분에 rcu_read_lock을 걸어줬더니 정상적으로 동작합니다. 사실 아직도 이게 해결책이 맞는지는 모르겠지만 당장 시간이 없어서 검증이 어렵네요. 알려줄 사람도 없고..

커널 너무 어렵네요

댓글 남기기