aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-05-17 01:10:50 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-17 08:23:03 -0400
commitc59def9f222d44bb7e2f0a559f2906191a0862d7 (patch)
tree51bc0c12906b13887c6e53d1e06b48b411443129
parentafc0cedbe9138e3e8b38bfa1e4dfd01a2c537d62 (diff)
Slab allocators: Drop support for destructors
There is no user of destructors left. There is no reason why we should keep checking for destructors calls in the slab allocators. The RFC for this patch was discussed at http://marc.info/?l=linux-kernel&m=117882364330705&w=2 Destructors were mainly used for list management which required them to take a spinlock. Taking a spinlock in a destructor is a bit risky since the slab allocators may run the destructors anytime they decide a slab is no longer needed. Patch drops destructor support. Any attempt to use a destructor will BUG(). Acked-by: Pekka Enberg <penberg@cs.helsinki.fi> Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/slub_def.h1
-rw-r--r--mm/slab.c27
-rw-r--r--mm/slob.c5
-rw-r--r--mm/slub.c45
4 files changed, 16 insertions, 62 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index c6c1f4a120e3..5e2e7297dfaa 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -40,7 +40,6 @@ struct kmem_cache {
40 int objects; /* Number of objects in slab */ 40 int objects; /* Number of objects in slab */
41 int refcount; /* Refcount for slab cache destroy */ 41 int refcount; /* Refcount for slab cache destroy */
42 void (*ctor)(void *, struct kmem_cache *, unsigned long); 42 void (*ctor)(void *, struct kmem_cache *, unsigned long);
43 void (*dtor)(void *, struct kmem_cache *, unsigned long);
44 int inuse; /* Offset to metadata */ 43 int inuse; /* Offset to metadata */
45 int align; /* Alignment */ 44 int align; /* Alignment */
46 const char *name; /* Name (only for display!) */ 45 const char *name; /* Name (only for display!) */
diff --git a/mm/slab.c b/mm/slab.c
index 944b20581f8c..12344432e201 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -409,9 +409,6 @@ struct kmem_cache {
409 /* constructor func */ 409 /* constructor func */
410 void (*ctor) (void *, struct kmem_cache *, unsigned long); 410 void (*ctor) (void *, struct kmem_cache *, unsigned long);
411 411
412 /* de-constructor func */
413 void (*dtor) (void *, struct kmem_cache *, unsigned long);
414
415/* 5) cache creation/removal */ 412/* 5) cache creation/removal */
416 const char *name; 413 const char *name;
417 struct list_head next; 414 struct list_head next;
@@ -1911,20 +1908,11 @@ static void slab_destroy_objs(struct kmem_cache *cachep, struct slab *slabp)
1911 slab_error(cachep, "end of a freed object " 1908 slab_error(cachep, "end of a freed object "
1912 "was overwritten"); 1909 "was overwritten");
1913 } 1910 }
1914 if (cachep->dtor && !(cachep->flags & SLAB_POISON))
1915 (cachep->dtor) (objp + obj_offset(cachep), cachep, 0);
1916 } 1911 }
1917} 1912}
1918#else 1913#else
1919static void slab_destroy_objs(struct kmem_cache *cachep, struct slab *slabp) 1914static void slab_destroy_objs(struct kmem_cache *cachep, struct slab *slabp)
1920{ 1915{
1921 if (cachep->dtor) {
1922 int i;
1923 for (i = 0; i < cachep->num; i++) {
1924 void *objp = index_to_obj(cachep, slabp, i);
1925 (cachep->dtor) (objp, cachep, 0);
1926 }
1927 }
1928} 1916}
1929#endif 1917#endif
1930 1918
@@ -2124,7 +2112,7 @@ static int setup_cpu_cache(struct kmem_cache *cachep)
2124 * @align: The required alignment for the objects. 2112 * @align: The required alignment for the objects.
2125 * @flags: SLAB flags 2113 * @flags: SLAB flags
2126 * @ctor: A constructor for the objects. 2114 * @ctor: A constructor for the objects.
2127 * @dtor: A destructor for the objects. 2115 * @dtor: A destructor for the objects (not implemented anymore).
2128 * 2116 *
2129 * Returns a ptr to the cache on success, NULL on failure. 2117 * Returns a ptr to the cache on success, NULL on failure.
2130 * Cannot be called within a int, but can be interrupted. 2118 * Cannot be called within a int, but can be interrupted.
@@ -2159,7 +2147,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2159 * Sanity checks... these are all serious usage bugs. 2147 * Sanity checks... these are all serious usage bugs.
2160 */ 2148 */
2161 if (!name || in_interrupt() || (size < BYTES_PER_WORD) || 2149 if (!name || in_interrupt() || (size < BYTES_PER_WORD) ||
2162 (size > (1 << MAX_OBJ_ORDER) * PAGE_SIZE) || (dtor && !ctor)) { 2150 (size > (1 << MAX_OBJ_ORDER) * PAGE_SIZE) || dtor) {
2163 printk(KERN_ERR "%s: Early error in slab %s\n", __FUNCTION__, 2151 printk(KERN_ERR "%s: Early error in slab %s\n", __FUNCTION__,
2164 name); 2152 name);
2165 BUG(); 2153 BUG();
@@ -2213,9 +2201,6 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2213 if (flags & SLAB_DESTROY_BY_RCU) 2201 if (flags & SLAB_DESTROY_BY_RCU)
2214 BUG_ON(flags & SLAB_POISON); 2202 BUG_ON(flags & SLAB_POISON);
2215#endif 2203#endif
2216 if (flags & SLAB_DESTROY_BY_RCU)
2217 BUG_ON(dtor);
2218
2219 /* 2204 /*
2220 * Always checks flags, a caller might be expecting debug support which 2205 * Always checks flags, a caller might be expecting debug support which
2221 * isn't available. 2206 * isn't available.
@@ -2370,7 +2355,6 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2370 BUG_ON(!cachep->slabp_cache); 2355 BUG_ON(!cachep->slabp_cache);
2371 } 2356 }
2372 cachep->ctor = ctor; 2357 cachep->ctor = ctor;
2373 cachep->dtor = dtor;
2374 cachep->name = name; 2358 cachep->name = name;
2375 2359
2376 if (setup_cpu_cache(cachep)) { 2360 if (setup_cpu_cache(cachep)) {
@@ -2835,7 +2819,6 @@ failed:
2835 * Perform extra freeing checks: 2819 * Perform extra freeing checks:
2836 * - detect bad pointers. 2820 * - detect bad pointers.
2837 * - POISON/RED_ZONE checking 2821 * - POISON/RED_ZONE checking
2838 * - destructor calls, for caches with POISON+dtor
2839 */ 2822 */
2840static void kfree_debugcheck(const void *objp) 2823static void kfree_debugcheck(const void *objp)
2841{ 2824{
@@ -2894,12 +2877,6 @@ static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
2894 BUG_ON(objnr >= cachep->num); 2877 BUG_ON(objnr >= cachep->num);
2895 BUG_ON(objp != index_to_obj(cachep, slabp, objnr)); 2878 BUG_ON(objp != index_to_obj(cachep, slabp, objnr));
2896 2879
2897 if (cachep->flags & SLAB_POISON && cachep->dtor) {
2898 /* we want to cache poison the object,
2899 * call the destruction callback
2900 */
2901 cachep->dtor(objp + obj_offset(cachep), cachep, 0);
2902 }
2903#ifdef CONFIG_DEBUG_SLAB_LEAK 2880#ifdef CONFIG_DEBUG_SLAB_LEAK
2904 slab_bufctl(slabp)[objnr] = BUFCTL_FREE; 2881 slab_bufctl(slabp)[objnr] = BUFCTL_FREE;
2905#endif 2882#endif
diff --git a/mm/slob.c b/mm/slob.c
index 57bb72ed0d46..79164a4f54ad 100644
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -280,7 +280,6 @@ struct kmem_cache {
280 unsigned long flags; 280 unsigned long flags;
281 const char *name; 281 const char *name;
282 void (*ctor)(void *, struct kmem_cache *, unsigned long); 282 void (*ctor)(void *, struct kmem_cache *, unsigned long);
283 void (*dtor)(void *, struct kmem_cache *, unsigned long);
284}; 283};
285 284
286struct kmem_cache *kmem_cache_create(const char *name, size_t size, 285struct kmem_cache *kmem_cache_create(const char *name, size_t size,
@@ -296,13 +295,11 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
296 c->name = name; 295 c->name = name;
297 c->size = size; 296 c->size = size;
298 if (flags & SLAB_DESTROY_BY_RCU) { 297 if (flags & SLAB_DESTROY_BY_RCU) {
299 BUG_ON(dtor);
300 /* leave room for rcu footer at the end of object */ 298 /* leave room for rcu footer at the end of object */
301 c->size += sizeof(struct slob_rcu); 299 c->size += sizeof(struct slob_rcu);
302 } 300 }
303 c->flags = flags; 301 c->flags = flags;
304 c->ctor = ctor; 302 c->ctor = ctor;
305 c->dtor = dtor;
306 /* ignore alignment unless it's forced */ 303 /* ignore alignment unless it's forced */
307 c->align = (flags & SLAB_HWCACHE_ALIGN) ? SLOB_ALIGN : 0; 304 c->align = (flags & SLAB_HWCACHE_ALIGN) ? SLOB_ALIGN : 0;
308 if (c->align < align) 305 if (c->align < align)
@@ -371,8 +368,6 @@ void kmem_cache_free(struct kmem_cache *c, void *b)
371 slob_rcu->size = c->size; 368 slob_rcu->size = c->size;
372 call_rcu(&slob_rcu->head, kmem_rcu_free); 369 call_rcu(&slob_rcu->head, kmem_rcu_free);
373 } else { 370 } else {
374 if (c->dtor)
375 c->dtor(b, c, 0);
376 __kmem_cache_free(b, c->size); 371 __kmem_cache_free(b, c->size);
377 } 372 }
378} 373}
diff --git a/mm/slub.c b/mm/slub.c
index 5e3e8bc9838f..022c1b4d74d4 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -891,13 +891,13 @@ static void kmem_cache_open_debug_check(struct kmem_cache *s)
891 * On 32 bit platforms the limit is 256k. On 64bit platforms 891 * On 32 bit platforms the limit is 256k. On 64bit platforms
892 * the limit is 512k. 892 * the limit is 512k.
893 * 893 *
894 * Debugging or ctor/dtors may create a need to move the free 894 * Debugging or ctor may create a need to move the free
895 * pointer. Fail if this happens. 895 * pointer. Fail if this happens.
896 */ 896 */
897 if (s->size >= 65535 * sizeof(void *)) { 897 if (s->size >= 65535 * sizeof(void *)) {
898 BUG_ON(s->flags & (SLAB_RED_ZONE | SLAB_POISON | 898 BUG_ON(s->flags & (SLAB_RED_ZONE | SLAB_POISON |
899 SLAB_STORE_USER | SLAB_DESTROY_BY_RCU)); 899 SLAB_STORE_USER | SLAB_DESTROY_BY_RCU));
900 BUG_ON(s->ctor || s->dtor); 900 BUG_ON(s->ctor);
901 } 901 }
902 else 902 else
903 /* 903 /*
@@ -1030,15 +1030,12 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
1030{ 1030{
1031 int pages = 1 << s->order; 1031 int pages = 1 << s->order;
1032 1032
1033 if (unlikely(SlabDebug(page) || s->dtor)) { 1033 if (unlikely(SlabDebug(page))) {
1034 void *p; 1034 void *p;
1035 1035
1036 slab_pad_check(s, page); 1036 slab_pad_check(s, page);
1037 for_each_object(p, s, page_address(page)) { 1037 for_each_object(p, s, page_address(page))
1038 if (s->dtor)
1039 s->dtor(p, s, 0);
1040 check_object(s, page, p, 0); 1038 check_object(s, page, p, 0);
1041 }
1042 } 1039 }
1043 1040
1044 mod_zone_page_state(page_zone(page), 1041 mod_zone_page_state(page_zone(page),
@@ -1871,7 +1868,7 @@ static int calculate_sizes(struct kmem_cache *s)
1871 * then we should never poison the object itself. 1868 * then we should never poison the object itself.
1872 */ 1869 */
1873 if ((flags & SLAB_POISON) && !(flags & SLAB_DESTROY_BY_RCU) && 1870 if ((flags & SLAB_POISON) && !(flags & SLAB_DESTROY_BY_RCU) &&
1874 !s->ctor && !s->dtor) 1871 !s->ctor)
1875 s->flags |= __OBJECT_POISON; 1872 s->flags |= __OBJECT_POISON;
1876 else 1873 else
1877 s->flags &= ~__OBJECT_POISON; 1874 s->flags &= ~__OBJECT_POISON;
@@ -1901,7 +1898,7 @@ static int calculate_sizes(struct kmem_cache *s)
1901 1898
1902#ifdef CONFIG_SLUB_DEBUG 1899#ifdef CONFIG_SLUB_DEBUG
1903 if (((flags & (SLAB_DESTROY_BY_RCU | SLAB_POISON)) || 1900 if (((flags & (SLAB_DESTROY_BY_RCU | SLAB_POISON)) ||
1904 s->ctor || s->dtor)) { 1901 s->ctor)) {
1905 /* 1902 /*
1906 * Relocate free pointer after the object if it is not 1903 * Relocate free pointer after the object if it is not
1907 * permitted to overwrite the first word of the object on 1904 * permitted to overwrite the first word of the object on
@@ -1970,13 +1967,11 @@ static int calculate_sizes(struct kmem_cache *s)
1970static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags, 1967static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags,
1971 const char *name, size_t size, 1968 const char *name, size_t size,
1972 size_t align, unsigned long flags, 1969 size_t align, unsigned long flags,
1973 void (*ctor)(void *, struct kmem_cache *, unsigned long), 1970 void (*ctor)(void *, struct kmem_cache *, unsigned long))
1974 void (*dtor)(void *, struct kmem_cache *, unsigned long))
1975{ 1971{
1976 memset(s, 0, kmem_size); 1972 memset(s, 0, kmem_size);
1977 s->name = name; 1973 s->name = name;
1978 s->ctor = ctor; 1974 s->ctor = ctor;
1979 s->dtor = dtor;
1980 s->objsize = size; 1975 s->objsize = size;
1981 s->flags = flags; 1976 s->flags = flags;
1982 s->align = align; 1977 s->align = align;
@@ -2161,7 +2156,7 @@ static struct kmem_cache *create_kmalloc_cache(struct kmem_cache *s,
2161 2156
2162 down_write(&slub_lock); 2157 down_write(&slub_lock);
2163 if (!kmem_cache_open(s, gfp_flags, name, size, ARCH_KMALLOC_MINALIGN, 2158 if (!kmem_cache_open(s, gfp_flags, name, size, ARCH_KMALLOC_MINALIGN,
2164 flags, NULL, NULL)) 2159 flags, NULL))
2165 goto panic; 2160 goto panic;
2166 2161
2167 list_add(&s->list, &slab_caches); 2162 list_add(&s->list, &slab_caches);
@@ -2463,7 +2458,7 @@ static int slab_unmergeable(struct kmem_cache *s)
2463 if (slub_nomerge || (s->flags & SLUB_NEVER_MERGE)) 2458 if (slub_nomerge || (s->flags & SLUB_NEVER_MERGE))
2464 return 1; 2459 return 1;
2465 2460
2466 if (s->ctor || s->dtor) 2461 if (s->ctor)
2467 return 1; 2462 return 1;
2468 2463
2469 return 0; 2464 return 0;
@@ -2471,15 +2466,14 @@ static int slab_unmergeable(struct kmem_cache *s)
2471 2466
2472static struct kmem_cache *find_mergeable(size_t size, 2467static struct kmem_cache *find_mergeable(size_t size,
2473 size_t align, unsigned long flags, 2468 size_t align, unsigned long flags,
2474 void (*ctor)(void *, struct kmem_cache *, unsigned long), 2469 void (*ctor)(void *, struct kmem_cache *, unsigned long))
2475 void (*dtor)(void *, struct kmem_cache *, unsigned long))
2476{ 2470{
2477 struct list_head *h; 2471 struct list_head *h;
2478 2472
2479 if (slub_nomerge || (flags & SLUB_NEVER_MERGE)) 2473 if (slub_nomerge || (flags & SLUB_NEVER_MERGE))
2480 return NULL; 2474 return NULL;
2481 2475
2482 if (ctor || dtor) 2476 if (ctor)
2483 return NULL; 2477 return NULL;
2484 2478
2485 size = ALIGN(size, sizeof(void *)); 2479 size = ALIGN(size, sizeof(void *));
@@ -2521,8 +2515,9 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
2521{ 2515{
2522 struct kmem_cache *s; 2516 struct kmem_cache *s;
2523 2517
2518 BUG_ON(dtor);
2524 down_write(&slub_lock); 2519 down_write(&slub_lock);
2525 s = find_mergeable(size, align, flags, ctor, dtor); 2520 s = find_mergeable(size, align, flags, ctor);
2526 if (s) { 2521 if (s) {
2527 s->refcount++; 2522 s->refcount++;
2528 /* 2523 /*
@@ -2536,7 +2531,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
2536 } else { 2531 } else {
2537 s = kmalloc(kmem_size, GFP_KERNEL); 2532 s = kmalloc(kmem_size, GFP_KERNEL);
2538 if (s && kmem_cache_open(s, GFP_KERNEL, name, 2533 if (s && kmem_cache_open(s, GFP_KERNEL, name,
2539 size, align, flags, ctor, dtor)) { 2534 size, align, flags, ctor)) {
2540 if (sysfs_slab_add(s)) { 2535 if (sysfs_slab_add(s)) {
2541 kfree(s); 2536 kfree(s);
2542 goto err; 2537 goto err;
@@ -3177,17 +3172,6 @@ static ssize_t ctor_show(struct kmem_cache *s, char *buf)
3177} 3172}
3178SLAB_ATTR_RO(ctor); 3173SLAB_ATTR_RO(ctor);
3179 3174
3180static ssize_t dtor_show(struct kmem_cache *s, char *buf)
3181{
3182 if (s->dtor) {
3183 int n = sprint_symbol(buf, (unsigned long)s->dtor);
3184
3185 return n + sprintf(buf + n, "\n");
3186 }
3187 return 0;
3188}
3189SLAB_ATTR_RO(dtor);
3190
3191static ssize_t aliases_show(struct kmem_cache *s, char *buf) 3175static ssize_t aliases_show(struct kmem_cache *s, char *buf)
3192{ 3176{
3193 return sprintf(buf, "%d\n", s->refcount - 1); 3177 return sprintf(buf, "%d\n", s->refcount - 1);
@@ -3419,7 +3403,6 @@ static struct attribute * slab_attrs[] = {
3419 &partial_attr.attr, 3403 &partial_attr.attr,
3420 &cpu_slabs_attr.attr, 3404 &cpu_slabs_attr.attr,
3421 &ctor_attr.attr, 3405 &ctor_attr.attr,
3422 &dtor_attr.attr,
3423 &aliases_attr.attr, 3406 &aliases_attr.attr,
3424 &align_attr.attr, 3407 &align_attr.attr,
3425 &sanity_checks_attr.attr, 3408 &sanity_checks_attr.attr,