diff --git a/include/sys/kmem.h b/include/sys/kmem.h index 082db032a..e3810eb2f 100644 --- a/include/sys/kmem.h +++ b/include/sys/kmem.h @@ -453,6 +453,14 @@ void spl_kmem_fini(void); #define kmem_cache_reap_now(skc) spl_kmem_cache_reap_now(skc) #define kmem_reap() spl_kmem_reap() +#ifdef HAVE_KMEM_CACHE_CREATE_DTOR +#define __kmem_cache_create(name, size, align, flags, ctor, dtor) \ + kmem_cache_create(name, size, align, flags, ctor, dtor) +#else +#define __kmem_cache_create(name, size, align, flags, ctor, dtor) \ + kmem_cache_create(name, size, align, flags, ctor) +#endif /* HAVE_KMEM_CACHE_CREATE_DTOR */ + #ifdef __cplusplus } #endif diff --git a/modules/spl/spl-kmem.c b/modules/spl/spl-kmem.c index e52f19935..24d53a6c2 100644 --- a/modules/spl/spl-kmem.c +++ b/modules/spl/spl-kmem.c @@ -427,6 +427,11 @@ spl_hash_ptr(void *ptr, unsigned int bits) return hash_long((unsigned long)ptr >> PAGE_SHIFT, bits); } +#ifndef list_first_entry +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) +#endif + void * spl_kmem_cache_alloc(spl_kmem_cache_t *skc, int flags) { @@ -640,20 +645,21 @@ spl_kmem_init(void) spl_slab_cache = NULL; spl_obj_cache = NULL; - spl_slab_cache = kmem_cache_create("spl_slab_cache", - sizeof(spl_kmem_slab_t), - 0, 0, NULL); + spl_slab_cache = __kmem_cache_create("spl_slab_cache", + sizeof(spl_kmem_slab_t), + 0, 0, NULL, NULL); if (spl_slab_cache == NULL) GOTO(out_cache, rc = -ENOMEM); - spl_obj_cache = kmem_cache_create("spl_obj_cache", - sizeof(spl_kmem_obj_t), - 0, 0, NULL); + spl_obj_cache = __kmem_cache_create("spl_obj_cache", + sizeof(spl_kmem_obj_t), + 0, 0, NULL, NULL); if (spl_obj_cache == NULL) GOTO(out_cache, rc = -ENOMEM); #ifdef HAVE_SET_SHRINKER - spl_kmem_cache_shrinker = set_shrinker(KMC_DEFAULT_SEEKS, shrinker); + spl_kmem_cache_shrinker = set_shrinker(KMC_DEFAULT_SEEKS, + kmem_cache_generic_shrinker); if (spl_kmem_cache_shrinker == NULL) GOTO(out_cache, rc = -ENOMEM); #else