aboutsummaryrefslogtreecommitdiffstats
path: root/lib/debugobjects.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-07-31 12:43:41 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-31 12:43:41 -0400
commit85e9ca333d03fbd56b9e123c8456f0d98e20faad (patch)
tree7bb15ada5f536950efa23ad60ea9eea60380ca1c /lib/debugobjects.c
parenta300bec952127d9a15e666b391bb35c9aecb3002 (diff)
parent6e86841d05f371b5b9b86ce76c02aaee83352298 (diff)
Merge branch 'linus' into timers/hpet
Diffstat (limited to 'lib/debugobjects.c')
-rw-r--r--lib/debugobjects.c34
1 files changed, 12 insertions, 22 deletions
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index a76a5e122ae1..45a6bde762d1 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -68,6 +68,7 @@ static int fill_pool(void)
68{ 68{
69 gfp_t gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN; 69 gfp_t gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN;
70 struct debug_obj *new; 70 struct debug_obj *new;
71 unsigned long flags;
71 72
72 if (likely(obj_pool_free >= ODEBUG_POOL_MIN_LEVEL)) 73 if (likely(obj_pool_free >= ODEBUG_POOL_MIN_LEVEL))
73 return obj_pool_free; 74 return obj_pool_free;
@@ -81,10 +82,10 @@ static int fill_pool(void)
81 if (!new) 82 if (!new)
82 return obj_pool_free; 83 return obj_pool_free;
83 84
84 spin_lock(&pool_lock); 85 spin_lock_irqsave(&pool_lock, flags);
85 hlist_add_head(&new->node, &obj_pool); 86 hlist_add_head(&new->node, &obj_pool);
86 obj_pool_free++; 87 obj_pool_free++;
87 spin_unlock(&pool_lock); 88 spin_unlock_irqrestore(&pool_lock, flags);
88 } 89 }
89 return obj_pool_free; 90 return obj_pool_free;
90} 91}
@@ -110,16 +111,13 @@ static struct debug_obj *lookup_object(void *addr, struct debug_bucket *b)
110} 111}
111 112
112/* 113/*
113 * Allocate a new object. If the pool is empty and no refill possible, 114 * Allocate a new object. If the pool is empty, switch off the debugger.
114 * switch off the debugger.
115 */ 115 */
116static struct debug_obj * 116static struct debug_obj *
117alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) 117alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr)
118{ 118{
119 struct debug_obj *obj = NULL; 119 struct debug_obj *obj = NULL;
120 int retry = 0;
121 120
122repeat:
123 spin_lock(&pool_lock); 121 spin_lock(&pool_lock);
124 if (obj_pool.first) { 122 if (obj_pool.first) {
125 obj = hlist_entry(obj_pool.first, typeof(*obj), node); 123 obj = hlist_entry(obj_pool.first, typeof(*obj), node);
@@ -141,9 +139,6 @@ repeat:
141 } 139 }
142 spin_unlock(&pool_lock); 140 spin_unlock(&pool_lock);
143 141
144 if (fill_pool() && !obj && !retry++)
145 goto repeat;
146
147 return obj; 142 return obj;
148} 143}
149 144
@@ -210,9 +205,8 @@ static void debug_print_object(struct debug_obj *obj, char *msg)
210 205
211 if (limit < 5 && obj->descr != descr_test) { 206 if (limit < 5 && obj->descr != descr_test) {
212 limit++; 207 limit++;
213 printk(KERN_ERR "ODEBUG: %s %s object type: %s\n", msg, 208 WARN(1, KERN_ERR "ODEBUG: %s %s object type: %s\n", msg,
214 obj_states[obj->state], obj->descr->name); 209 obj_states[obj->state], obj->descr->name);
215 WARN_ON(1);
216 } 210 }
217 debug_objects_warnings++; 211 debug_objects_warnings++;
218} 212}
@@ -231,15 +225,13 @@ debug_object_fixup(int (*fixup)(void *addr, enum debug_obj_state state),
231 225
232static void debug_object_is_on_stack(void *addr, int onstack) 226static void debug_object_is_on_stack(void *addr, int onstack)
233{ 227{
234 void *stack = current->stack;
235 int is_on_stack; 228 int is_on_stack;
236 static int limit; 229 static int limit;
237 230
238 if (limit > 4) 231 if (limit > 4)
239 return; 232 return;
240 233
241 is_on_stack = (addr >= stack && addr < (stack + THREAD_SIZE)); 234 is_on_stack = object_is_on_stack(addr);
242
243 if (is_on_stack == onstack) 235 if (is_on_stack == onstack)
244 return; 236 return;
245 237
@@ -261,6 +253,8 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack)
261 struct debug_obj *obj; 253 struct debug_obj *obj;
262 unsigned long flags; 254 unsigned long flags;
263 255
256 fill_pool();
257
264 db = get_bucket((unsigned long) addr); 258 db = get_bucket((unsigned long) addr);
265 259
266 spin_lock_irqsave(&db->lock, flags); 260 spin_lock_irqsave(&db->lock, flags);
@@ -738,26 +732,22 @@ check_results(void *addr, enum debug_obj_state state, int fixups, int warnings)
738 732
739 obj = lookup_object(addr, db); 733 obj = lookup_object(addr, db);
740 if (!obj && state != ODEBUG_STATE_NONE) { 734 if (!obj && state != ODEBUG_STATE_NONE) {
741 printk(KERN_ERR "ODEBUG: selftest object not found\n"); 735 WARN(1, KERN_ERR "ODEBUG: selftest object not found\n");
742 WARN_ON(1);
743 goto out; 736 goto out;
744 } 737 }
745 if (obj && obj->state != state) { 738 if (obj && obj->state != state) {
746 printk(KERN_ERR "ODEBUG: selftest wrong state: %d != %d\n", 739 WARN(1, KERN_ERR "ODEBUG: selftest wrong state: %d != %d\n",
747 obj->state, state); 740 obj->state, state);
748 WARN_ON(1);
749 goto out; 741 goto out;
750 } 742 }
751 if (fixups != debug_objects_fixups) { 743 if (fixups != debug_objects_fixups) {
752 printk(KERN_ERR "ODEBUG: selftest fixups failed %d != %d\n", 744 WARN(1, KERN_ERR "ODEBUG: selftest fixups failed %d != %d\n",
753 fixups, debug_objects_fixups); 745 fixups, debug_objects_fixups);
754 WARN_ON(1);
755 goto out; 746 goto out;
756 } 747 }
757 if (warnings != debug_objects_warnings) { 748 if (warnings != debug_objects_warnings) {
758 printk(KERN_ERR "ODEBUG: selftest warnings failed %d != %d\n", 749 WARN(1, KERN_ERR "ODEBUG: selftest warnings failed %d != %d\n",
759 warnings, debug_objects_warnings); 750 warnings, debug_objects_warnings);
760 WARN_ON(1);
761 goto out; 751 goto out;
762 } 752 }
763 res = 0; 753 res = 0;