You must obtain a lock if you sharing data with any code, which can be executed on the same time. Kernel might execute both your softirq and your ioctl handler, so you must obtain a lock.
When you disable interrupts with either spin_lock_bh
or spin_lock_irqsave
, interrupts are disabled on current processor only. So, it's OK to handle interrupts on another one.