2010-05-12 6 views
3

저는 PCI 장치 용 리눅스 장치 드라이버를 작성했습니다. 이 장치는 DMA 작업을 수행합니다. DMA 작업이 실행 중일 때 프로그램이 충돌 할 때 문제가 발생합니다.Linux 디바이스 드라이버가 device_remove() 함수에서 DMA가 종료 될 때까지 기다릴 수 있습니까?

실제로 충돌이 발생하면 device_remove() 함수가 시스템에서 호출됩니다 (close()이 호출 된 것처럼). 이 함수는 PCI 장치가 사용하는 메모리 영역을 정리하여 할당 된 메모리를 올바르게 해제합니다. 정상적인 상황에서 제대로 작동한다는 뜻입니다.

그러나 DMA가 실행 중이면 실제로 종료 될 때 해제 된 장치 데이터에 더 이상 액세스 할 수 없기 때문에 DMA 정리를 수행 할 수 없습니다. 간단한 해결책은 close() 함수에서 대기하는 것입니다. 는 (이것은 나의 이해하지만, 어쩌면 DMA 함수의 마지막 부분은 실행되지 않습니다?)

는 그것을 실제로 장치의 device_remove() (일명 close()) 함수에 종료 할 DMA를 위해 통곡하는 것이 좋습니다 운전사? 이 문제를 해결할 다른 방법이 있습니까?

+0

나는 이것이 매우 건방진 것을 알고 있지만, 언제나 아니오라고 말할 수 있습니다! 이 드라이버의 일부 소스 코드를 얻을 수 있습니까? 부분적인 관심은 DMA 전송을 설정하는 것입니다 ...! 저예요, 건배. –

+0

아니요. 불행히도 우리 둘 모두에게 독점 드라이버입니다. –

답변

2

예, 작동합니다 기다려야하지만 :

당신이 당신의 PCI 장치의 놀라운 제거 동작을 테스트하려고하지 않는 한, 나는) (제거하는 호출하면 DMA 장치로 /부터 진행 한 경우 실패한다고 생각합니다 . 또한 close()는 remove()와 같은 방식으로 처리 할 수 ​​있다고 생각하지 않습니다. 후자는 메모리에서 모든 장치 관련 데이터 구조를 완전히 제거합니다 (예 : 네트워크 장치 드라이버 중 하나 참조). 즉, 내가 말하고자하는 것은 close()에서 wait()를 실행하지만 remove()에서는 fail()입니다.

또한 상황에 따라 reference counting을 살펴볼 수도 있습니다. 장치 관련 리소스를 해제합니다.

+0

아, 네. 나는 완전히 틀리다. 'remove()'는 장치를 사용하는 응용 프로그램이 종료 될 때 호출되지 않습니다. 호출되는 것은'release()'입니다! 나는 나쁜 방향을 찾고 있었다. –

+1

다음, 당신이하고있는 일이 충분히 공정하다고 생각합니다. 방금 igb 드라이버를 체크인했습니다 : 링크가 활성화되어 있으면 비트가 설정됩니다. close()가 호출되면 test_and_set_bit가 실패하면 드라이버는 test_and_set_bit()과 schedule_timeout()을 수행합니다. – Bandan