mm/sl[aou]b: Extract a common function for kmem_cache_destroy
kmem_cache_destroy does basically the same in all allocators. Extract common code which is easy since we already have common mutex handling. Reviewed-by: Glauber Costa <glommer@parallels.com> Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:

committed by
Pekka Enberg

parent
7c9adf5a54
commit
945cf2b619
45
mm/slab.c
45
mm/slab.c
@@ -2206,7 +2206,7 @@ static void slab_destroy(struct kmem_cache *cachep, struct slab *slabp)
|
||||
}
|
||||
}
|
||||
|
||||
static void __kmem_cache_destroy(struct kmem_cache *cachep)
|
||||
void __kmem_cache_destroy(struct kmem_cache *cachep)
|
||||
{
|
||||
int i;
|
||||
struct kmem_list3 *l3;
|
||||
@@ -2763,49 +2763,10 @@ int kmem_cache_shrink(struct kmem_cache *cachep)
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_shrink);
|
||||
|
||||
/**
|
||||
* kmem_cache_destroy - delete a cache
|
||||
* @cachep: the cache to destroy
|
||||
*
|
||||
* Remove a &struct kmem_cache object from the slab cache.
|
||||
*
|
||||
* It is expected this function will be called by a module when it is
|
||||
* unloaded. This will remove the cache completely, and avoid a duplicate
|
||||
* cache being allocated each time a module is loaded and unloaded, if the
|
||||
* module doesn't have persistent in-kernel storage across loads and unloads.
|
||||
*
|
||||
* The cache must be empty before calling this function.
|
||||
*
|
||||
* The caller must guarantee that no one will allocate memory from the cache
|
||||
* during the kmem_cache_destroy().
|
||||
*/
|
||||
void kmem_cache_destroy(struct kmem_cache *cachep)
|
||||
int __kmem_cache_shutdown(struct kmem_cache *cachep)
|
||||
{
|
||||
BUG_ON(!cachep || in_interrupt());
|
||||
|
||||
/* Find the cache in the chain of caches. */
|
||||
get_online_cpus();
|
||||
mutex_lock(&slab_mutex);
|
||||
/*
|
||||
* the chain is never empty, cache_cache is never destroyed
|
||||
*/
|
||||
list_del(&cachep->list);
|
||||
if (__cache_shrink(cachep)) {
|
||||
slab_error(cachep, "Can't free all objects");
|
||||
list_add(&cachep->list, &slab_caches);
|
||||
mutex_unlock(&slab_mutex);
|
||||
put_online_cpus();
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU))
|
||||
rcu_barrier();
|
||||
|
||||
__kmem_cache_destroy(cachep);
|
||||
mutex_unlock(&slab_mutex);
|
||||
put_online_cpus();
|
||||
return __cache_shrink(cachep);
|
||||
}
|
||||
EXPORT_SYMBOL(kmem_cache_destroy);
|
||||
|
||||
/*
|
||||
* Get the memory for a slab management obj.
|
||||
|
Reference in New Issue
Block a user