]> granicus.if.org Git - spl/commit
kmem-cache: Fix slab ageing soft lockup
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 11 Jan 2013 22:29:32 +0000 (14:29 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 14 Jan 2013 18:07:58 +0000 (10:07 -0800)
commitd4899f4747fd03be748fd1a589b9db5786fa1375
treea4c1f17a6ca2a89fe58eb52334264f56558d7b1e
parent8842263bd0f3c2f78c9cd52be8a74d4376396501
kmem-cache: Fix slab ageing soft lockup

Commit a10287e00d13c4c4dbbff14f42b00b03da363fcb 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
module/spl/spl-kmem.c