aboutsummaryrefslogtreecommitdiffstats
path: root/lib/debugobjects.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r--lib/debugobjects.c16
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);
751static void __debug_check_no_obj_freed(const void *address, unsigned long size) 751static 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
813void debug_check_no_obj_freed(const void *address, unsigned long size) 811void debug_check_no_obj_freed(const void *address, unsigned long size)