diff options
Diffstat (limited to 'lib/debugobjects.c')
| -rw-r--r-- | lib/debugobjects.c | 34 |
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 | */ |
| 116 | static struct debug_obj * | 116 | static struct debug_obj * |
| 117 | alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr) | 117 | alloc_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 | ||
| 122 | repeat: | ||
| 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 | ||
| 232 | static void debug_object_is_on_stack(void *addr, int onstack) | 226 | static 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; |
