Jim Keniston [off-list ref] wrote:
+int kernel_error_event_iov(const struct iovec *iov, unsigned int nseg,
+ u32 groups)
+{
...
+
+ return netlink_broadcast(kerror_nl, skb, 0, ~0, GFP_ATOMIC);
This appears to be deadlocky when called from interrupt handlers.
netlink_broadcast() does read_lock(&nl_table_lock). But nl_table_lock is
not an irq-safe lock.
Possibly netlink_broadcast() can be made callable from hardirq context, but
it looks to be non trivial. The various error and delivery handlers need
to be reviewed, the kfree_skb() calls should be thought about, etc.