Во-первых, вам следует перекомпилировать ядро с включенными параметрами отладки блокировки и повторить попытку.Они могут помочь указать причину.
Существует несколько возможных причин тупика в spin_lock_irqsave.Это может быть рекурсивная блокировка (то есть вы пытаетесь снова вызвать spin_lock_ * в той части кода, в которой заблокирована спин-блокировка).Может случиться так, что вы спите с заблокированной спин-блокировкой (не делайте этого никогда - для каждой функции, которую вы вызываете с удерживаемой блокировкой, вы должны знать, может ли она спать или нет).Это может быть тупик AB / BA (одна часть кода сначала блокирует A, а затем B; другая часть сначала блокирует B, а затем A; если первая часть заблокирована A, но не B, а вторая часть заблокирована B, но не A, у вас естьтупиковая).И так далее.Параметры отладки блокировки могут обнаружить и предупредить вас о многих из них.
Поскольку блокируемый объект является «глобальным буфером и переменными размера буфера», попробуйте уменьшить заблокированную область до минимума.Вместо того, чтобы блокировать в верхней части функции и разблокировать в конце, делайте как можно больше за пределами блокировки и блокируйте только при манипулировании буфером.В идеале, заблокированный раздел должен быть всего лишь несколькими инструкциями без вызовов функций.В этом случае гораздо труднее зайти в тупик.
Теперь, когда я сказал все это, моя попытка психической отладки (то есть угадывание, где проблема): вы вызываете copy_to_user (который может спать) сспин-замок удерживается.