|
@@ -805,6 +805,22 @@ fail:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void trace(struct kmem_cache *s, struct page *page, void *object, int alloc)
|
|
|
+{
|
|
|
+ if (s->flags & SLAB_TRACE) {
|
|
|
+ printk(KERN_INFO "TRACE %s %s 0x%p inuse=%d fp=0x%p\n",
|
|
|
+ s->name,
|
|
|
+ alloc ? "alloc" : "free",
|
|
|
+ object, page->inuse,
|
|
|
+ page->freelist);
|
|
|
+
|
|
|
+ if (!alloc)
|
|
|
+ print_section("Object", (void *)object, s->objsize);
|
|
|
+
|
|
|
+ dump_stack();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Slab allocation and freeing
|
|
|
*/
|
|
@@ -1289,12 +1305,7 @@ debug:
|
|
|
goto another_slab;
|
|
|
if (s->flags & SLAB_STORE_USER)
|
|
|
set_track(s, object, TRACK_ALLOC, addr);
|
|
|
- if (s->flags & SLAB_TRACE) {
|
|
|
- printk(KERN_INFO "TRACE %s alloc 0x%p inuse=%d fp=0x%p\n",
|
|
|
- s->name, object, page->inuse,
|
|
|
- page->freelist);
|
|
|
- dump_stack();
|
|
|
- }
|
|
|
+ trace(s, page, object, 1);
|
|
|
init_object(s, object, 1);
|
|
|
goto have_object;
|
|
|
}
|
|
@@ -1379,13 +1390,7 @@ debug:
|
|
|
remove_full(s, page);
|
|
|
if (s->flags & SLAB_STORE_USER)
|
|
|
set_track(s, x, TRACK_FREE, addr);
|
|
|
- if (s->flags & SLAB_TRACE) {
|
|
|
- printk(KERN_INFO "TRACE %s free 0x%p inuse=%d fp=0x%p\n",
|
|
|
- s->name, object, page->inuse,
|
|
|
- page->freelist);
|
|
|
- print_section("Object", (void *)object, s->objsize);
|
|
|
- dump_stack();
|
|
|
- }
|
|
|
+ trace(s, page, object, 0);
|
|
|
init_object(s, object, 0);
|
|
|
goto checks_ok;
|
|
|
}
|