저는 일반적으로 프로브 함수에서 request_irq()를 호출하여 Linux 커널의 드라이버 커널 모듈을 검사하고 있습니다. 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
이는 프로브가 완료되기 전에도 핸들러를 호출할 수 있음을 의미합니다.
그러나 나는 많은 드라이버에서 프로브와 인터럽트 핸들러에서 동시에 읽고 수정할 수 있는 공유 변수나 공격 필드에 대해 관심이 없다는 것을 알았습니다.
프로브와 인터럽트 핸들러가 병렬로 실행되는 경우가 얼마나 자주 발생하는지 알고 싶습니다.
답변1
프로브가 완료되지 않은 경우 인터럽트 핸들러를 호출할 수 있습니다. 그러나 이를 달성하려면 장치를 초기화하고 인터럽트를 생성해야 합니다. 일반적으로 프로브 기능은 먼저 장치를 초기화하고 irq를 요청하기 전에 인터럽트를 생성하지 않는지 확인합니다. 이렇게 하면 드라이버가 인터럽트를 처리할 준비가 될 때까지 핸들러가 호출되지 않습니다.
일반적인 예외는 RTC 드라이버인데, 그 중 일부는 최근에 수정되었습니다. 이는 RTC가 여전히 실행 중이지만 Linux는 실행되지 않고 드라이버가 부팅할 때마다 장치를 다시 초기화해서는 안 되기 때문에 발생합니다. 예는 다음과 같습니다.