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

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
...@@ -123,6 +123,9 @@ struct kmemleak_scan_area { ...@@ -123,6 +123,9 @@ struct kmemleak_scan_area {
size_t length; size_t length;
}; };
#define KMEMLEAK_GREY 0
#define KMEMLEAK_BLACK -1
/* /*
* Structure holding the metadata for each allocated memory block. * Structure holding the metadata for each allocated memory block.
* Modifications to such objects should be made while holding the * Modifications to such objects should be made while holding the
...@@ -310,17 +313,19 @@ static void hex_dump_object(struct seq_file *seq, ...@@ -310,17 +313,19 @@ static void hex_dump_object(struct seq_file *seq,
*/ */
static bool color_white(const struct kmemleak_object *object) 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) 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) 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) ...@@ -661,47 +666,55 @@ static void delete_object_part(unsigned long ptr, size_t size)
put_object(object); put_object(object);
} }
/*
* Make a object permanently as gray-colored so that it can no longer be static void __paint_it(struct kmemleak_object *object, int color)
* reported as a leak. This is used in general to mark a false positive. {
*/ object->min_count = color;
static void make_gray_object(unsigned long ptr) if (color == KMEMLEAK_BLACK)
object->flags |= OBJECT_NO_SCAN;
}
static void paint_it(struct kmemleak_object *object, int color)
{ {
unsigned long flags; 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; struct kmemleak_object *object;
object = find_and_get_object(ptr, 0); object = find_and_get_object(ptr, 0);
if (!object) { 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; return;
} }
paint_it(object, color);
spin_lock_irqsave(&object->lock, flags);
object->min_count = 0;
spin_unlock_irqrestore(&object->lock, flags);
put_object(object); 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 * Mark the object as black-colored so that it is ignored from scans and
* reporting. * reporting.
*/ */
static void make_black_object(unsigned long ptr) static void make_black_object(unsigned long ptr)
{ {
unsigned long flags; paint_ptr(ptr, KMEMLEAK_BLACK);
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);
} }
/* /*
...@@ -1436,7 +1449,7 @@ static void kmemleak_clear(void) ...@@ -1436,7 +1449,7 @@ static void kmemleak_clear(void)
spin_lock_irqsave(&object->lock, flags); spin_lock_irqsave(&object->lock, flags);
if ((object->flags & OBJECT_REPORTED) && if ((object->flags & OBJECT_REPORTED) &&
unreferenced_object(object)) unreferenced_object(object))
object->min_count = 0; __paint_it(object, KMEMLEAK_GREY);
spin_unlock_irqrestore(&object->lock, flags); spin_unlock_irqrestore(&object->lock, flags);
} }
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment