mirror_zfs/module/spl
Brian Behlendorf d4899f4747 kmem-cache: Fix slab ageing soft lockup
Commit a10287e00d slightly reworked
the slab ageing code such that it is no longer dependent on the
Linux delayed work queue interfaces.

This was good for portability and performance, but it requires us
to use the on_each_cpu() function to execute the spl_magazine_age()
function.  That means that the function is now executing in interrupt
context whereas before it was scheduled in normal process context.
And that means we need to be slightly more careful about the locking
in the interrupt handler.

With the reworked code it's possible that we'll be holding the
skc->skc_lock and be interrupted to handle the spl_magazine_age()
IRQ.  This will result in a deadlock and soft lockup errors unless
we're careful to detect the contention and avoid taking the lock in
the interupt handler.  So that's what this patch does.

Alternately, (and slightly more conventionally) we could have used
spin_lock_irqsave() to prevent this race entirely but I'd perfer to
avoid disabling interrupts as much as possible due to performance
concerns.  There is absolutely no penalty for us not aging objects
out of the magazine due to contention.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Prakash Surya <surya1@llnl.gov>
Closes zfsonlinux/zfs#1193
2013-01-14 10:07:58 -08:00
..
Makefile.in Add script for builtin module building. 2012-07-26 15:13:09 -07:00
spl-atomic.c Linux 2.6.39 compat, DEFINE_SPINLOCK() 2011-04-20 12:01:11 -07:00
spl-condvar.c Add cv_wait_io() to account I/O time 2013-01-07 10:29:26 -08:00
spl-cred.c Add crgetfsuid()/crgetfsgid() helpers 2011-03-22 12:18:44 -07:00
spl-debug.c Wrap trace_set_debug_header in trace_[get|put]_tcd 2012-08-23 10:01:20 -07:00
spl-err.c Add --enable-debug-log configure option 2012-02-02 11:27:54 -08:00
spl-generic.c call_usermodehelper() should wait for process 2013-01-09 16:54:19 -08:00
spl-kmem.c kmem-cache: Fix slab ageing soft lockup 2013-01-14 10:07:58 -08:00
spl-kobj.c Remove VN_HOLD/VN_RELE/VOP_PUTPAGE 2011-01-12 11:38:05 -08:00
spl-kstat.c Add KSTAT_TYPE_TXG type 2012-11-02 15:17:40 -07:00
spl-mutex.c Fix undefined reference on spl_mutex_spin_max(). 2012-07-26 14:54:53 -07:00
spl-proc.c Fix spl_kmem_init_kallsyms_lookup() panic 2012-12-19 09:06:35 -08:00
spl-rwlock.c Public Release Prep 2010-05-17 15:18:00 -07:00
spl-taskq.c taskq delay/cancel functionality 2012-12-12 09:54:07 -08:00
spl-thread.c Switch KM_SLEEP to KM_PUSHPAGE 2012-09-12 12:27:09 -07:00
spl-time.c Minor 32-bit fix cast to hrtime_t before the mutliply. 2010-05-23 09:51:17 -07:00
spl-tsd.c Switch KM_SLEEP to KM_PUSHPAGE 2012-10-11 16:22:29 -07:00
spl-vnode.c RHEL 6.4 compat, fallocate() 2013-01-08 09:53:13 -08:00
spl-xdr.c Prefix all SPL debug macros with 'S' 2010-07-20 13:30:40 -07:00
spl-zlib.c Set KMC_NOEMERGENCY for zlib workspaces 2012-09-07 14:36:26 -07:00