diff options
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r-- | lib/debugobjects.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/lib/debugobjects.c b/lib/debugobjects.c index 3e79c100271f..faab2c4ea024 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c | |||
@@ -751,13 +751,13 @@ EXPORT_SYMBOL_GPL(debug_object_active_state); | |||
751 | static void __debug_check_no_obj_freed(const void *address, unsigned long size) | 751 | static void __debug_check_no_obj_freed(const void *address, unsigned long size) |
752 | { | 752 | { |
753 | unsigned long flags, oaddr, saddr, eaddr, paddr, chunks; | 753 | unsigned long flags, oaddr, saddr, eaddr, paddr, chunks; |
754 | struct hlist_node *tmp; | ||
755 | HLIST_HEAD(freelist); | ||
756 | struct debug_obj_descr *descr; | 754 | struct debug_obj_descr *descr; |
757 | enum debug_obj_state state; | 755 | enum debug_obj_state state; |
758 | struct debug_bucket *db; | 756 | struct debug_bucket *db; |
757 | struct hlist_node *tmp; | ||
759 | struct debug_obj *obj; | 758 | struct debug_obj *obj; |
760 | int cnt, objs_checked = 0; | 759 | int cnt, objs_checked = 0; |
760 | bool work = false; | ||
761 | 761 | ||
762 | saddr = (unsigned long) address; | 762 | saddr = (unsigned long) address; |
763 | eaddr = saddr + size; | 763 | eaddr = saddr + size; |
@@ -788,18 +788,12 @@ repeat: | |||
788 | goto repeat; | 788 | goto repeat; |
789 | default: | 789 | default: |
790 | hlist_del(&obj->node); | 790 | hlist_del(&obj->node); |
791 | hlist_add_head(&obj->node, &freelist); | 791 | work |= __free_object(obj); |
792 | break; | 792 | break; |
793 | } | 793 | } |
794 | } | 794 | } |
795 | raw_spin_unlock_irqrestore(&db->lock, flags); | 795 | raw_spin_unlock_irqrestore(&db->lock, flags); |
796 | 796 | ||
797 | /* Now free them */ | ||
798 | hlist_for_each_entry_safe(obj, tmp, &freelist, node) { | ||
799 | hlist_del(&obj->node); | ||
800 | free_object(obj); | ||
801 | } | ||
802 | |||
803 | if (cnt > debug_objects_maxchain) | 797 | if (cnt > debug_objects_maxchain) |
804 | debug_objects_maxchain = cnt; | 798 | debug_objects_maxchain = cnt; |
805 | 799 | ||
@@ -808,6 +802,10 @@ repeat: | |||
808 | 802 | ||
809 | if (objs_checked > debug_objects_maxchecked) | 803 | if (objs_checked > debug_objects_maxchecked) |
810 | debug_objects_maxchecked = objs_checked; | 804 | debug_objects_maxchecked = objs_checked; |
805 | |||
806 | /* Schedule work to actually kmem_cache_free() objects */ | ||
807 | if (work) | ||
808 | schedule_work(&debug_obj_work); | ||
811 | } | 809 | } |
812 | 810 | ||
813 | void debug_check_no_obj_freed(const void *address, unsigned long size) | 811 | void debug_check_no_obj_freed(const void *address, unsigned long size) |