The first problem is in wrong kerneld interface.
kerneld_send decides whether call should be atomic or not
on the base of intr_count.
arp.c (and, possibly another calls of kerneld. Bjorn, please check it!)
assumes, that it DOES NOT SLEEP!
Workaround: intr_count++ ... intr_count-- around kerneld_send
Ick... why not have a seperate kernel thread do all this stuff that
can sleep. Take a look at arch/sparc/mm/asyncd.c for an easy and
efficient method to get things done out of intterupt context in the
kernel.
Later,
David S. Miller
davem@caip.rutgers.edu