Linux 커널의 드라이버 커널 모듈을 살펴보고 있으며 일반적으로 request_irq()는 프로브 함수에서 호출됩니다. drivers/net/ethernet/natsemi/ns83820.ko가 그러한 예 중 하나일 수 있습니다.
request_irq()는 request_threaded_irq()를 호출하며 이는 주석에 언급되어 있습니다.
This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.
링크:https://elixir.bootlin.com/linux/latest/source/kernel/irq/manage.c#L1984
이는 프로브가 완료되기 전에도 핸들러를 호출할 수 있음을 의미합니다.
그러나 나는 많은 드라이버에서 공유 변수나 프로브 및 인터럽트 핸들러에서 동시에 읽고 수정할 수 있는 dev 필드에 대해 주의를 기울이지 않는다는 사실을 발견했습니다.
프로브와 인터럽트 핸들러가 병렬로 실행되는 경우가 얼마나 자주 발생하는지 알고 싶습니다.
답변1
프로브가 아직 완료되지 않은 동안 인터럽트 핸들러를 호출할 수 있습니다. 그러나 이를 위해서는 장치를 초기화하고 인터럽트를 생성해야 합니다. 종종 프로브 기능은 장치를 먼저 초기화하고 irq를 요청하기 전에 인터럽트를 생성하지 않는지 확인합니다. 이렇게 하면 드라이버가 인터럽트를 처리할 준비가 될 때까지 핸들러가 호출되지 않습니다.
한 가지 일반적인 예외는 RTC 드라이버이며 최근에 그 중 일부를 수정했습니다. 이는 Linux가 실행되지 않는 동안 RTC가 계속 실행되고 있고 드라이버가 부팅할 때마다 장치를 다시 초기화해서는 안 되기 때문에 발생합니다. 다음은 한 가지 예입니다.