diff options
| -rw-r--r-- | mm/slab.c | 2 | ||||
| -rw-r--r-- | mm/slob.c | 2 | ||||
| -rw-r--r-- | mm/slub.c | 2 |
3 files changed, 5 insertions, 1 deletions
| @@ -2547,7 +2547,7 @@ void kmem_cache_destroy(struct kmem_cache *cachep) | |||
| 2547 | } | 2547 | } |
| 2548 | 2548 | ||
| 2549 | if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) | 2549 | if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) |
| 2550 | synchronize_rcu(); | 2550 | rcu_barrier(); |
| 2551 | 2551 | ||
| 2552 | __kmem_cache_destroy(cachep); | 2552 | __kmem_cache_destroy(cachep); |
| 2553 | mutex_unlock(&cache_chain_mutex); | 2553 | mutex_unlock(&cache_chain_mutex); |
| @@ -595,6 +595,8 @@ EXPORT_SYMBOL(kmem_cache_create); | |||
| 595 | void kmem_cache_destroy(struct kmem_cache *c) | 595 | void kmem_cache_destroy(struct kmem_cache *c) |
| 596 | { | 596 | { |
| 597 | kmemleak_free(c); | 597 | kmemleak_free(c); |
| 598 | if (c->flags & SLAB_DESTROY_BY_RCU) | ||
| 599 | rcu_barrier(); | ||
| 598 | slob_free(c, sizeof(struct kmem_cache)); | 600 | slob_free(c, sizeof(struct kmem_cache)); |
| 599 | } | 601 | } |
| 600 | EXPORT_SYMBOL(kmem_cache_destroy); | 602 | EXPORT_SYMBOL(kmem_cache_destroy); |
| @@ -2595,6 +2595,8 @@ static inline int kmem_cache_close(struct kmem_cache *s) | |||
| 2595 | */ | 2595 | */ |
| 2596 | void kmem_cache_destroy(struct kmem_cache *s) | 2596 | void kmem_cache_destroy(struct kmem_cache *s) |
| 2597 | { | 2597 | { |
| 2598 | if (s->flags & SLAB_DESTROY_BY_RCU) | ||
| 2599 | rcu_barrier(); | ||
| 2598 | down_write(&slub_lock); | 2600 | down_write(&slub_lock); |
| 2599 | s->refcount--; | 2601 | s->refcount--; |
| 2600 | if (!s->refcount) { | 2602 | if (!s->refcount) { |
