diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-06 17:05:09 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-06 17:05:09 -0400 |
| commit | 9861df15f44d98eb6fa9a839b558633ecee87194 (patch) | |
| tree | 587d1902c33c47fc0bc84f849b9431fd27967668 | |
| parent | 8871b201da6e443b7ab2967050e3064360d0604f (diff) | |
| parent | 67fc25ef34a27dc43ce6dfc98a8b249db304d641 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6:
SLAB: Fix lockdep annotations
fix RCU-callback-after-kmem_cache_destroy problem in sl[aou]b
| -rw-r--r-- | mm/slab.c | 8 | ||||
| -rw-r--r-- | mm/slob.c | 2 | ||||
| -rw-r--r-- | mm/slub.c | 2 |
3 files changed, 8 insertions, 4 deletions
| @@ -1544,9 +1544,6 @@ void __init kmem_cache_init(void) | |||
| 1544 | } | 1544 | } |
| 1545 | 1545 | ||
| 1546 | g_cpucache_up = EARLY; | 1546 | g_cpucache_up = EARLY; |
| 1547 | |||
| 1548 | /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
| 1549 | init_lock_keys(); | ||
| 1550 | } | 1547 | } |
| 1551 | 1548 | ||
| 1552 | void __init kmem_cache_init_late(void) | 1549 | void __init kmem_cache_init_late(void) |
| @@ -1563,6 +1560,9 @@ void __init kmem_cache_init_late(void) | |||
| 1563 | /* Done! */ | 1560 | /* Done! */ |
| 1564 | g_cpucache_up = FULL; | 1561 | g_cpucache_up = FULL; |
| 1565 | 1562 | ||
| 1563 | /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
| 1564 | init_lock_keys(); | ||
| 1565 | |||
| 1566 | /* | 1566 | /* |
| 1567 | * Register a cpu startup notifier callback that initializes | 1567 | * Register a cpu startup notifier callback that initializes |
| 1568 | * cpu_cache_get for all new cpus | 1568 | * cpu_cache_get for all new cpus |
| @@ -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) { |
