diff options
author | Brian Behlendorf <[email protected]> | 2009-02-12 13:32:10 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2009-02-12 13:32:10 -0800 |
commit | 37db7d8cf9936e6d2851a4329c11efcd9f61305c (patch) | |
tree | f4fe4f3523de9302b80e56d3240a8c6f58f5c0e4 /include/sys | |
parent | f500ccff35a55d04e7f6b8ddb54ff6e54e9c5d70 (diff) |
kmem slab fixes
- Default SPL_KMEM_CACHE_DELAY changed to 15 to match Solaris.
- Aged out slab checking occurs every SPL_KMEM_CACHE_DELAY / 3.
- skc->skc_reap tunable added whichs allows callers of
spl_slab_reclaim() to cap the number of slabs reclaimed.
On Solaris all eligible slabs are always reclaimed, and this
is still the default behavior. However, I suspect that is
not always wise for reasons such as in the next comment.
- spl_slab_reclaim() added cond_resched() while walking the
slab/object free lists. Soft lockups were observed when
freeing large numbers of vmalloc'd slabs/objets.
- spl_slab_reclaim() 'sks->sks_ref > 0' check changes from
incorrect 'break' to 'continue' to ensure all slabs are
checked.
- spl_cache_age() reworked to avoid a deadlock with
do_flush_tlb_all() which occured because we slept waiting
for completion in spl_cache_age(). To waiting for magazine
reclamation to finish is not required so we no longer wait.
- spl_magazine_create() and spl_magazine_destroy() shifted
back to using for_each_online_cpu() instead of the
spl_on_each_cpu() approach which was of course a bad idea
due to memory allocations which Ricardo pointed out.
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/kmem.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/sys/kmem.h b/include/sys/kmem.h index 7281f1063..dc66a9153 100644 --- a/include/sys/kmem.h +++ b/include/sys/kmem.h @@ -239,7 +239,8 @@ extern struct rw_semaphore spl_kmem_cache_sem; #define SKS_MAGIC 0x22222222 #define SKC_MAGIC 0x2c2c2c2c -#define SPL_KMEM_CACHE_DELAY 5 /* Minimum slab release age */ +#define SPL_KMEM_CACHE_DELAY 15 /* Minimum slab release age */ +#define SPL_KMEM_CACHE_REAP 0 /* Default reap everything */ #define SPL_KMEM_CACHE_OBJ_PER_SLAB 32 /* Target objects per slab */ #define SPL_KMEM_CACHE_OBJ_PER_SLAB_MIN 8 /* Minimum objects per slab */ #define SPL_KMEM_CACHE_ALIGN 8 /* Default object alignment */ @@ -292,6 +293,7 @@ typedef struct spl_kmem_cache { uint32_t skc_slab_objs; /* Objects per slab */ uint32_t skc_slab_size; /* Slab size */ uint32_t skc_delay; /* Slab reclaim interval */ + uint32_t skc_reap; /* Slab reclaim count */ atomic_t skc_ref; /* Ref count callers */ struct delayed_work skc_work; /* Slab reclaim work */ struct work_struct work; |