mm: kmemleak: factor object reference updating out of scan_block()
scan_block() updates the number of references (pointers) to objects, adding them to the gray_list when object->min_count is reached. The patch factors out this functionality into a separate update_refs() function. Link: http://lkml.kernel.org/r/1495726937-23557-3-git-send-email-catalin.marinas@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: "Luis R. Rodriguez" <mcgrof@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f66abf09e0
commit
04f70d13ca
|
@ -1187,6 +1187,30 @@ static bool update_checksum(struct kmemleak_object *object)
|
||||||
return object->checksum != old_csum;
|
return object->checksum != old_csum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update an object's references. object->lock must be held by the caller.
|
||||||
|
*/
|
||||||
|
static void update_refs(struct kmemleak_object *object)
|
||||||
|
{
|
||||||
|
if (!color_white(object)) {
|
||||||
|
/* non-orphan, ignored or new */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Increase the object's reference count (number of pointers to the
|
||||||
|
* memory block). If this count reaches the required minimum, the
|
||||||
|
* object's color will become gray and it will be added to the
|
||||||
|
* gray_list.
|
||||||
|
*/
|
||||||
|
object->count++;
|
||||||
|
if (color_gray(object)) {
|
||||||
|
/* put_object() called when removing from gray_list */
|
||||||
|
WARN_ON(!get_object(object));
|
||||||
|
list_add_tail(&object->gray_list, &gray_list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Memory scanning is a long process and it needs to be interruptable. This
|
* Memory scanning is a long process and it needs to be interruptable. This
|
||||||
* function checks whether such interrupt condition occurred.
|
* function checks whether such interrupt condition occurred.
|
||||||
|
@ -1259,24 +1283,7 @@ static void scan_block(void *_start, void *_end,
|
||||||
* enclosed by scan_mutex.
|
* enclosed by scan_mutex.
|
||||||
*/
|
*/
|
||||||
spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
|
spin_lock_nested(&object->lock, SINGLE_DEPTH_NESTING);
|
||||||
if (!color_white(object)) {
|
update_refs(object);
|
||||||
/* non-orphan, ignored or new */
|
|
||||||
spin_unlock(&object->lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Increase the object's reference count (number of pointers
|
|
||||||
* to the memory block). If this count reaches the required
|
|
||||||
* minimum, the object's color will become gray and it will be
|
|
||||||
* added to the gray_list.
|
|
||||||
*/
|
|
||||||
object->count++;
|
|
||||||
if (color_gray(object)) {
|
|
||||||
/* put_object() called when removing from gray_list */
|
|
||||||
WARN_ON(!get_object(object));
|
|
||||||
list_add_tail(&object->gray_list, &gray_list);
|
|
||||||
}
|
|
||||||
spin_unlock(&object->lock);
|
spin_unlock(&object->lock);
|
||||||
}
|
}
|
||||||
read_unlock_irqrestore(&kmemleak_lock, flags);
|
read_unlock_irqrestore(&kmemleak_lock, flags);
|
||||||
|
|
Loading…
Reference in New Issue