У меня есть список ядра, который доступен как ISR (верхняя половина), так и нижняя половина (рабочая очередь в моем случае).Первоначально я использовал spin_lock_irqsave () / spin_unlock_irqstore () для отключения прерываний как внутри ISR, так и в нижней половине.
Программа работает нормально, за исключением предупреждения, потому что я вызываю dma_alloc_coherent () внутри spin_lock_irqsave () / spin_lock_irqstore ().Я проверил, что код выглядит так, как будто эта функция не должна вызываться, когда прерывание отключено ... После переключения на использование spin_lock () внутри рабочей очереди, но оставьте spin_lock_irqsave () внутри ISR, и предупреждение исчезнет ...
Я должен использовать spin_lock () внутри очереди задач, потому что это ограничение проекта.Так действительно ли эта программа безопасна после компромисса?
PS: я использовал GFP_KERNEL с dma_alloc_coherent () ранее, не уверен, является ли GFP_ATOMIC правильным флагом для использования вместо этого?