Domanda

Ho scritto un driver di periferica Linux per una periferica PCI. Questo dispositivo esegue operazioni DMA. Un problema si pone quando il programma va in crash quando un'operazione DMA è in esecuzione.

In effetti, in caso di caduta, la funzione device_remove() viene chiamato dal sistema (come se fosse close() chiamato). Questa funzione esegue la pulitura delle aree di memoria utilizzate dal dispositivo PCI, libera la memoria allocata correttamente. Voglio dire che funziona correttamente in circostanze normali.

Ma se un DMA è in esecuzione, quando sarà effettivamente terminare, non sarà in grado di eseguire tale operazione DMA, perché non ha più accesso ai dati del dispositivo che sono stati liberati. Una soluzione semplice sarebbe quella di aspettare nella funzione close (). (Questa è la mia comprensione, ma forse l'ultima parte della funzione di DMA non viene mai eseguito?)

E 'una buona idea quella di lamento per il DMA effettivamente terminare nel device_remove() (aka close()) funzione di un driver di periferica? Ci sono altri mezzi per affrontare questo problema?

È stato utile?

Soluzione

Sì, attesa dovrebbe funzionare ma:

A meno che non si sta cercando di funzionamento rimozione test a sorpresa del dispositivo PCI, penso che una chiamata a rimuovere () dovrebbe fallire quando si dispone di DMA in corso da / per il dispositivo. Inoltre, non credo che close () può essere trattata allo stesso modo di remove (). Quest'ultimo sta per rimuovere completamente tutte le strutture di dati correlati dispositivo di memoria (ad esempio: vedere uno dei driver di dispositivo di rete). Quindi, in altre parole, quello che sto cercando di dire è: wait () in close () ma non riescono () su remove ()

Anche a seconda della situazione, si potrebbe anche voler dare un'occhiata a riferimento conteggio per liberare le risorse relative periferica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top