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: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
30b3710105
commit
a1084c8779
@ -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,
|
|||||||
*/
|
*/
|
||||||
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,25 +666,46 @@ static void delete_object_part(unsigned long ptr, size_t size)
|
|||||||
|
|
||||||
put_object(object);
|
put_object(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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("Trying to color unknown object "
|
||||||
|
"at 0x%08lx as %s\n", ptr,
|
||||||
|
(color == KMEMLEAK_GREY) ? "Grey" :
|
||||||
|
(color == KMEMLEAK_BLACK) ? "Black" : "Unknown");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
paint_it(object, color);
|
||||||
|
put_object(object);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make a object permanently as gray-colored so that it can no longer be
|
* 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.
|
* reported as a leak. This is used in general to mark a false positive.
|
||||||
*/
|
*/
|
||||||
static void make_gray_object(unsigned long ptr)
|
static void make_gray_object(unsigned long ptr)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
paint_ptr(ptr, KMEMLEAK_GREY);
|
||||||
struct kmemleak_object *object;
|
|
||||||
|
|
||||||
object = find_and_get_object(ptr, 0);
|
|
||||||
if (!object) {
|
|
||||||
kmemleak_warn("Graying unknown object at 0x%08lx\n", ptr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_irqsave(&object->lock, flags);
|
|
||||||
object->min_count = 0;
|
|
||||||
spin_unlock_irqrestore(&object->lock, flags);
|
|
||||||
put_object(object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -688,20 +714,7 @@ static void make_gray_object(unsigned long ptr)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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();
|
||||||
|
Loading…
Reference in New Issue
Block a user