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

Commit a1084c87 authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by Catalin Marinas
Browse files

kmemleak: move common painting code together



When painting grey or black we do the same thing, bring
this together into a helper and identify coloring grey or
black explicitly with defines. This makes this a little
easier to read.

Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 30b37101
Loading
Loading
Loading
Loading
+41 −28
Original line number Diff line number Diff line
@@ -123,6 +123,9 @@ struct kmemleak_scan_area {
	size_t length;
};

#define KMEMLEAK_GREY	0
#define KMEMLEAK_BLACK	-1

/*
 * Structure holding the metadata for each allocated memory block.
 * Modifications to such objects should be made while holding the
@@ -310,17 +313,19 @@ static void hex_dump_object(struct seq_file *seq,
 */
static bool color_white(const struct kmemleak_object *object)
{
	return object->count != -1 && object->count < object->min_count;
	return object->count != KMEMLEAK_BLACK &&
		object->count < object->min_count;
}

static bool color_gray(const struct kmemleak_object *object)
{
	return object->min_count != -1 && object->count >= object->min_count;
	return object->min_count != KMEMLEAK_BLACK &&
		object->count >= object->min_count;
}

static bool color_black(const struct kmemleak_object *object)
{
	return object->min_count == -1;
	return object->min_count == KMEMLEAK_BLACK;
}

/*
@@ -661,47 +666,55 @@ static void delete_object_part(unsigned long ptr, size_t size)

	put_object(object);
}
/*
 * Make a object permanently as gray-colored so that it can no longer be
 * reported as a leak. This is used in general to mark a false positive.
 */
static void make_gray_object(unsigned long ptr)

static void __paint_it(struct kmemleak_object *object, int color)
{
	object->min_count = color;
	if (color == KMEMLEAK_BLACK)
		object->flags |= OBJECT_NO_SCAN;
}

static void paint_it(struct kmemleak_object *object, int color)
{
	unsigned long flags;

	spin_lock_irqsave(&object->lock, flags);
	__paint_it(object, color);
	spin_unlock_irqrestore(&object->lock, flags);
}

static void paint_ptr(unsigned long ptr, int color)
{
	struct kmemleak_object *object;

	object = find_and_get_object(ptr, 0);
	if (!object) {
		kmemleak_warn("Graying unknown object at 0x%08lx\n", ptr);
		kmemleak_warn("Trying to color unknown object "
			      "at 0x%08lx as %s\n", ptr,
			      (color == KMEMLEAK_GREY) ? "Grey" :
			      (color == KMEMLEAK_BLACK) ? "Black" : "Unknown");
		return;
	}

	spin_lock_irqsave(&object->lock, flags);
	object->min_count = 0;
	spin_unlock_irqrestore(&object->lock, flags);
	paint_it(object, color);
	put_object(object);
}

/*
 * Make a object permanently as gray-colored so that it can no longer be
 * reported as a leak. This is used in general to mark a false positive.
 */
static void make_gray_object(unsigned long ptr)
{
	paint_ptr(ptr, KMEMLEAK_GREY);
}

/*
 * Mark the object as black-colored so that it is ignored from scans and
 * reporting.
 */
static void make_black_object(unsigned long ptr)
{
	unsigned long flags;
	struct kmemleak_object *object;

	object = find_and_get_object(ptr, 0);
	if (!object) {
		kmemleak_warn("Blacking unknown object at 0x%08lx\n", ptr);
		return;
	}

	spin_lock_irqsave(&object->lock, flags);
	object->min_count = -1;
	object->flags |= OBJECT_NO_SCAN;
	spin_unlock_irqrestore(&object->lock, flags);
	put_object(object);
	paint_ptr(ptr, KMEMLEAK_BLACK);
}

/*
@@ -1436,7 +1449,7 @@ static void kmemleak_clear(void)
		spin_lock_irqsave(&object->lock, flags);
		if ((object->flags & OBJECT_REPORTED) &&
		    unreferenced_object(object))
			object->min_count = 0;
			__paint_it(object, KMEMLEAK_GREY);
		spin_unlock_irqrestore(&object->lock, flags);
	}
	rcu_read_unlock();