2010-05-12 4 views
3

J'ai écrit un pilote de périphérique Linux pour un périphérique PCI. Cet appareil effectue des opérations DMA. Un problème survient lorsque le programme se bloque lorsqu'une opération DMA est en cours d'exécution.Un pilote de périphérique Linux peut-il attendre la fin d'un DMA dans la fonction device_remove()?

En effet, lors du plantage, la fonction device_remove() est appelée par le système (comme si close() avait été appelée). Cette fonction effectue le nettoyage sur les régions de mémoire utilisées par le périphérique PCI, libère correctement la mémoire allouée. Je veux dire que cela fonctionne correctement dans des circonstances normales. Mais si un DMA est en cours d'exécution, il ne pourra pas effectuer le nettoyage DMA parce qu'il n'a plus accès aux données de l'appareil qui ont été libérées. Une solution simple serait d'attendre dans la fonction close(). (Ceci est ma compréhension, mais peut-être la dernière partie de la fonction DMA est jamais exécutée?)

Est-ce une bonne idée de se lamenter pour le DMA de mettre fin à fait dans la fonction d'un dispositif device_remove() (aka close()) chauffeur? Existe-t-il d'autres moyens de régler ce problème?

+0

Je sais que c'est très effronté, mais vous pouvez toujours dire non! Puis-je avoir une partie de votre code source pour ce pilote? D'intérêt partiel est la mise en place pour les transferts DMA ...?! PM moi, Cheers. –

+0

Non. Malheureusement pour nous deux, c'est un pilote propriétaire. –

Répondre

2

Oui, attendez devrait fonctionner, mais:

À moins que vous essayez de tester le comportement de retrait surprise de votre périphérique PCI, je pense un appel à supprimer() devrait échouer lorsque vous avez DMA passe à/de l'appareil . En outre, je ne pense pas que close() peut être traité de la même manière que remove(). Ce dernier va supprimer complètement toutes les structures de données liées à l'appareil de la mémoire (par exemple: voir l'un des pilotes de périphériques réseau). Donc, en d'autres termes, ce que j'essaie de dire est: wait() on close() mais fail() on remove()

En fonction de votre situation, vous pouvez aussi regarder reference counting pour libérer des ressources liées à l'appareil.

+0

Oh, oui. Je me trompe complètement. 'remove()' n'est pas appelé lorsque l'application utilisant le périphérique se termine. C'est 'release()' qui s'appelle! Je cherchais dans la mauvaise direction. –

+1

Ensuite, je pense que ce que vous faites est assez juste. Je viens de vérifier le pilote igb: si le lien est actif, un bit est activé. Quand close() est appelé, le pilote fait un test_and_set_bit() suivi d'un schedule_timeout() si le test_and_set_bit échoue. – Bandan

Questions connexes