diff options
author | Ben Greear <greearb@candelatech.com> | 2011-07-07 14:36:37 -0400 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2011-07-07 15:17:08 -0400 |
commit | d18a90dd85f8243ed20cdadb6d8a37d595df456d (patch) | |
tree | 35830bc434bfdb18605ff493b0a1406c3dcf8ac0 /mm | |
parent | d6543e3935cec9f66b9647c24c2e44c68f8a91fd (diff) |
slub: Add method to verify memory is not freed
This is for tracking down suspect memory usage.
Acked-by: Christoph Lameter <cl@linux.com>
Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slub.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -2964,6 +2964,42 @@ size_t ksize(const void *object) | |||
2964 | } | 2964 | } |
2965 | EXPORT_SYMBOL(ksize); | 2965 | EXPORT_SYMBOL(ksize); |
2966 | 2966 | ||
2967 | #ifdef CONFIG_SLUB_DEBUG | ||
2968 | bool verify_mem_not_deleted(const void *x) | ||
2969 | { | ||
2970 | struct page *page; | ||
2971 | void *object = (void *)x; | ||
2972 | unsigned long flags; | ||
2973 | bool rv; | ||
2974 | |||
2975 | if (unlikely(ZERO_OR_NULL_PTR(x))) | ||
2976 | return false; | ||
2977 | |||
2978 | local_irq_save(flags); | ||
2979 | |||
2980 | page = virt_to_head_page(x); | ||
2981 | if (unlikely(!PageSlab(page))) { | ||
2982 | /* maybe it was from stack? */ | ||
2983 | rv = true; | ||
2984 | goto out_unlock; | ||
2985 | } | ||
2986 | |||
2987 | slab_lock(page); | ||
2988 | if (on_freelist(page->slab, page, object)) { | ||
2989 | object_err(page->slab, page, object, "Object is on free-list"); | ||
2990 | rv = false; | ||
2991 | } else { | ||
2992 | rv = true; | ||
2993 | } | ||
2994 | slab_unlock(page); | ||
2995 | |||
2996 | out_unlock: | ||
2997 | local_irq_restore(flags); | ||
2998 | return rv; | ||
2999 | } | ||
3000 | EXPORT_SYMBOL(verify_mem_not_deleted); | ||
3001 | #endif | ||
3002 | |||
2967 | void kfree(const void *x) | 3003 | void kfree(const void *x) |
2968 | { | 3004 | { |
2969 | struct page *page; | 3005 | struct page *page; |