softirq 의 re-entrance ?
글쓴이: 김희상 / 작성시간: 수, 2004/01/07 - 10:03오전
리눅스 커널에서, softirq는 여러개의 CPU에서 병렬로 수행될 수 있는걸로 아는데요,
Processor A ----(call)-------> (Handler) | Processor B ----(call)---+
와 같은 경우에서 ,
Processor A가 Handler를 수행하는 도중에 다른이유(interrupt 등)로 "Processor A"에서 다시 Handler로 재진입하는 경우가 있을 수 있나요?
즉, Handler에서 spin_lock 같은걸 써도 되냐는 거죠.. Handler 수행도중 같은 Processor에서 재진입이 일어난다면 spin_lock를 쓸 경우 deadlock이 발행할테니깐요..
(Processor B는 interrupt가 발생했으면 handler를 수행하는건 당연할테고....이때는 spin_lock이 다른 Processor에서 수행되니깐 상관없죠?)
Forums:
리눅스 2.4.20 를 기준으로 말씀드리겠습니다...softirq
리눅스 2.4.20 를 기준으로 말씀드리겠습니다...
softirq는 같은 함수가 다른 cpu 에서 동시에 수행이 가능해야하기 때문에 spin_lock 은 필요가 없습니다...
그리고 같은 cpu 내에서는 중첩이 생길수도 있습니다. 왜냐하면 softirq_vec 에 등록된 함수를 처리하는 동안 interrupt 를 막아놓지 않기 때문이죠...
do_softirq() 에 진입 후 in_interrupt() 에서 위와 같은 상황을 검사를 합니다. 만약에 같은 cpu 내에서 softirq 를 처리 중이였다면 여기서 바로 return 해버립니다...
그렇다고 다시 발생한 softirq 를 무시하는건 아닙니다. 먼저 처리한걸 다 처리한 후에 뒤에 발생한 것도 다 처리를 해줍니다...
softirq 처리 함수인 do_softirq() 를 보시면 아마 쉽게 이해가 되실 껍니다...
참고로 위와 같은 상황을 감지하기 위해 만들어놓은 자료가 irq_cpustat_t 입니다. smp 의 경우 각각의 cpu 에 하나씩 할당이 됩니다.
그럼 열심히 하세요! 저도 열심히!
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
헛...이런...제가 실수한 곳이 있네요...--;soft
헛...이런...
제가 실수한 곳이 있네요...--;
softirq_vec 에 등록된 함수는 재진입 가능해야 하기때문에 당연히 smp 에서는 spin_lock 이 필요합니다...
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
댓글 달기