Как работает ядро ​​IRQ потока в ядре Linux? - PullRequest
0 голосов
/ 20 марта 2020

В драйвере mm c я видел функцию devm_request_threaded_irq, используемую для запуска sdhci_msm_pwr_irq, например:

ret = devm_request_threaded_irq(&pdev->dev, msm_host->pwr_irq, NULL,
                    sdhci_msm_pwr_irq, IRQF_ONESHOT,
                    dev_name(&pdev->dev), host);

Но когда я звоню rmmod, я не видел отпускания или остановки этой темы IRQ. Можете ли вы объяснить мне, как работает эта тема?

1 Ответ

1 голос
/ 20 марта 2020

Удаление модуля sdhci-msm приводит к вызову функции-обработчика модуля module_exit, которая вызывает platform_device_unregister для отмены регистрации в качестве драйвера устройства платформы. (Большая часть этого скрыта при вызове макроса module_platform_driver(sdhci_msm_driver); в "drivers / mmc / host / sdhci-msm. c".)

Когда драйвер платформы не зарегистрирован, все устройства, которые были успешно проверены будет удален автоматически. Обработчик «удаления» драйвера sdhci_msm_remove будет вызываться автоматически для каждого успешно проверенного устройства.

Так что вы можете быть удивлены, почему sdhci_msm_remove не освобождает прерывание, назначенное вызовом devm_request_threaded_irq в " зонд "функция sdhci_msm_probe? Ответ заключается в том, что в этом нет необходимости, поскольку прерывание было выделено как «ресурс управляемого устройства» (см. Ниже).

devm_request_threaded_irq - это оболочка «управляемый ресурс устройства» («devres») функция request_threaded_irq. Все ресурсы, управляемые devres, автоматически очищаются при удалении зондируемого устройства. (Очистка ресурсов, управляемых devres, происходит после возврата обработчика «удалить».) Для ресурсов прерываний, управляемых devres, в результате очистки автоматически вызывается функция free_irq, которая освобождает прерывание.

...