Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d18a90dd authored by Ben Greear's avatar Ben Greear Committed by Pekka Enberg
Browse files

slub: Add method to verify memory is not freed



This is for tracking down suspect memory usage.

Acked-by: default avatarChristoph Lameter <cl@linux.com>
Signed-off-by: default avatarBen Greear <greearb@candelatech.com>
Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
parent d6543e39
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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);
+36 −0
Original line number Diff line number Diff line
@@ -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;