Я написал модуль ядра, который выполняет nf_register_hook и использует механизм символьных устройств для передачи захваченных пакетов в пользовательское пространство с перехватом чтения с устройства. Я использую глобальные переменные буфера и размера буфера, поэтому мне нужно заблокировать его, когда приходит новый пакет или пользователь читает мое устройство. Я использовал splinlock_irqsave и spin_unlock_irqrestore(&locker,flags), но мой модуль зашел в тупик и система зависла.
unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int(*okfn)(struct sk_buff*)) {
unsigned long flags;
spin_lock_irqsave(&locker,flags);
...
spin_unlock_irqrestore(&locker,flags);
}
ssize_t sniffer_dev_read(struct file *filep, char *buff, size_t count, loff_t *offp) {
spin_lock_irqsave(&locker,flags);
...
spin_unlock_irqrestore(&locker,flags);
}
main_hook is registered in nf_register_hook()
sniffer_dev_read is registered in register_chrdev
когда пользователь читает с устройства, система переходит в тупик. идеи? или может быть сохранение/восстановление irq несовместимо с чтением устройства netfiler hook/char, и я должен использовать здесь специальную блокировку?