Loading include/linux/slub_def.h +13 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,19 @@ kmalloc_order(size_t size, gfp_t flags, unsigned int order) return ret; } /** * Calling this on allocated memory will check that the memory * is expected to be in use, and print warnings if not. */ #ifdef CONFIG_SLUB_DEBUG extern bool verify_mem_not_deleted(const void *x); #else static inline bool verify_mem_not_deleted(const void *x) { return true; } #endif #ifdef CONFIG_TRACING extern void * kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size); Loading mm/slub.c +36 −0 Original line number Diff line number Diff line Loading @@ -2964,6 +2964,42 @@ size_t ksize(const void *object) } EXPORT_SYMBOL(ksize); #ifdef CONFIG_SLUB_DEBUG bool verify_mem_not_deleted(const void *x) { struct page *page; void *object = (void *)x; unsigned long flags; bool rv; if (unlikely(ZERO_OR_NULL_PTR(x))) return false; local_irq_save(flags); page = virt_to_head_page(x); if (unlikely(!PageSlab(page))) { /* maybe it was from stack? */ rv = true; goto out_unlock; } slab_lock(page); if (on_freelist(page->slab, page, object)) { object_err(page->slab, page, object, "Object is on free-list"); rv = false; } else { rv = true; } slab_unlock(page); out_unlock: local_irq_restore(flags); return rv; } EXPORT_SYMBOL(verify_mem_not_deleted); #endif void kfree(const void *x) { struct page *page; Loading Loading
include/linux/slub_def.h +13 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,19 @@ kmalloc_order(size_t size, gfp_t flags, unsigned int order) return ret; } /** * Calling this on allocated memory will check that the memory * is expected to be in use, and print warnings if not. */ #ifdef CONFIG_SLUB_DEBUG extern bool verify_mem_not_deleted(const void *x); #else static inline bool verify_mem_not_deleted(const void *x) { return true; } #endif #ifdef CONFIG_TRACING extern void * kmem_cache_alloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size); Loading
mm/slub.c +36 −0 Original line number Diff line number Diff line Loading @@ -2964,6 +2964,42 @@ size_t ksize(const void *object) } EXPORT_SYMBOL(ksize); #ifdef CONFIG_SLUB_DEBUG bool verify_mem_not_deleted(const void *x) { struct page *page; void *object = (void *)x; unsigned long flags; bool rv; if (unlikely(ZERO_OR_NULL_PTR(x))) return false; local_irq_save(flags); page = virt_to_head_page(x); if (unlikely(!PageSlab(page))) { /* maybe it was from stack? */ rv = true; goto out_unlock; } slab_lock(page); if (on_freelist(page->slab, page, object)) { object_err(page->slab, page, object, "Object is on free-list"); rv = false; } else { rv = true; } slab_unlock(page); out_unlock: local_irq_restore(flags); return rv; } EXPORT_SYMBOL(verify_mem_not_deleted); #endif void kfree(const void *x) { struct page *page; Loading