인터럽트 핸들러와 커널쓰레드의 spin_lock_bh 동기화에 대해...
글쓴이: show4682 / 작성시간: 목, 2009/09/03 - 5:11오후
*** 환경 ***
커널버전 : 2.6.29.3
SMP 적용
arch : x86_64
현재 넷 서브시스템에서 개발 중입니다.
먼저 제가 알고 있는 spin_lock_bh 는
do_softirq에서 올라오는 softirq를 잠그고 cpu 간
재진입 코드를 동기화 하는 걸로 알고 있는데요..
문제는 cpu간 공유데이터(softirq 핸들러 공유데이터)에
커널쓰레드 루틴도 접근 한다는 겁니다.
공유데이터의 동기화는 spin_lock_bh를 사용하는데
커널쓰레드 루틴에서도 같은 spin_lock_bh를 사용합니다.
그런데 테스트 해 본 결과 이 둘간의 동기화가 자꾸 깨지는거
같습니다.
제 예상은 커널쓰레드는 인터럽트 핸들러가 아니라
task 형태로 스케쥴링 되서 그런것 같은데..
그래서 질문은 다음과 같습니다.
1. 제가 예상한게 맞는지. 그렇다면 동기화 문제 해결 방법은?
2. 제가 예상한게 틀리다면 제가 말씀드린 현상에 나타날 수 있는 문제점은?
2. 제가 쓰고 있는 커널에서 softirq 인터럽트 핸들러가 중간에
선점 될 수 있는지?
Forums:
커널쓰레드는
커널쓰레드는 프로세스 수준입니다. softirq 보다도 못하죠.
hardirq(top half)가 아니라면 가로챌 수 있는 놈이 없는게 정상입니다.
softirq 핸들러라는게 잘 와닿지 않는데,
napi 의 poll() 콜백을 말씀하시는 건가요, 아니면 따로 tasklet 를 쓰시는게 있다는 건가요 ?
원인은 몰라도 증상만큼은 확실히 파악하고 디버깅을 시작하는 게 좋습니다.
spin_lock_bh() 가 뭔가에 의해 뚫리고 있다는 것부터 명확하게 증명하고,
그 원인을 '예상'해 보세요.
OTL
댓글 달기