diff options
Diffstat (limited to 'kernel/trace/ring_buffer.c')
-rw-r--r-- | kernel/trace/ring_buffer.c | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index a1ca4956ab5e..edefe3b2801b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -423,7 +423,7 @@ struct ring_buffer_per_cpu { | |||
423 | int cpu; | 423 | int cpu; |
424 | struct ring_buffer *buffer; | 424 | struct ring_buffer *buffer; |
425 | spinlock_t reader_lock; /* serialize readers */ | 425 | spinlock_t reader_lock; /* serialize readers */ |
426 | raw_spinlock_t lock; | 426 | arch_spinlock_t lock; |
427 | struct lock_class_key lock_key; | 427 | struct lock_class_key lock_key; |
428 | struct list_head *pages; | 428 | struct list_head *pages; |
429 | struct buffer_page *head_page; /* read from head */ | 429 | struct buffer_page *head_page; /* read from head */ |
@@ -998,7 +998,7 @@ rb_allocate_cpu_buffer(struct ring_buffer *buffer, int cpu) | |||
998 | cpu_buffer->buffer = buffer; | 998 | cpu_buffer->buffer = buffer; |
999 | spin_lock_init(&cpu_buffer->reader_lock); | 999 | spin_lock_init(&cpu_buffer->reader_lock); |
1000 | lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key); | 1000 | lockdep_set_class(&cpu_buffer->reader_lock, buffer->reader_lock_key); |
1001 | cpu_buffer->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED; | 1001 | cpu_buffer->lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; |
1002 | 1002 | ||
1003 | bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()), | 1003 | bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()), |
1004 | GFP_KERNEL, cpu_to_node(cpu)); | 1004 | GFP_KERNEL, cpu_to_node(cpu)); |
@@ -1193,9 +1193,6 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages) | |||
1193 | struct list_head *p; | 1193 | struct list_head *p; |
1194 | unsigned i; | 1194 | unsigned i; |
1195 | 1195 | ||
1196 | atomic_inc(&cpu_buffer->record_disabled); | ||
1197 | synchronize_sched(); | ||
1198 | |||
1199 | spin_lock_irq(&cpu_buffer->reader_lock); | 1196 | spin_lock_irq(&cpu_buffer->reader_lock); |
1200 | rb_head_page_deactivate(cpu_buffer); | 1197 | rb_head_page_deactivate(cpu_buffer); |
1201 | 1198 | ||
@@ -1211,12 +1208,9 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages) | |||
1211 | return; | 1208 | return; |
1212 | 1209 | ||
1213 | rb_reset_cpu(cpu_buffer); | 1210 | rb_reset_cpu(cpu_buffer); |
1214 | spin_unlock_irq(&cpu_buffer->reader_lock); | ||
1215 | |||
1216 | rb_check_pages(cpu_buffer); | 1211 | rb_check_pages(cpu_buffer); |
1217 | 1212 | ||
1218 | atomic_dec(&cpu_buffer->record_disabled); | 1213 | spin_unlock_irq(&cpu_buffer->reader_lock); |
1219 | |||
1220 | } | 1214 | } |
1221 | 1215 | ||
1222 | static void | 1216 | static void |
@@ -1227,9 +1221,6 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer, | |||
1227 | struct list_head *p; | 1221 | struct list_head *p; |
1228 | unsigned i; | 1222 | unsigned i; |
1229 | 1223 | ||
1230 | atomic_inc(&cpu_buffer->record_disabled); | ||
1231 | synchronize_sched(); | ||
1232 | |||
1233 | spin_lock_irq(&cpu_buffer->reader_lock); | 1224 | spin_lock_irq(&cpu_buffer->reader_lock); |
1234 | rb_head_page_deactivate(cpu_buffer); | 1225 | rb_head_page_deactivate(cpu_buffer); |
1235 | 1226 | ||
@@ -1242,11 +1233,9 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer, | |||
1242 | list_add_tail(&bpage->list, cpu_buffer->pages); | 1233 | list_add_tail(&bpage->list, cpu_buffer->pages); |
1243 | } | 1234 | } |
1244 | rb_reset_cpu(cpu_buffer); | 1235 | rb_reset_cpu(cpu_buffer); |
1245 | spin_unlock_irq(&cpu_buffer->reader_lock); | ||
1246 | |||
1247 | rb_check_pages(cpu_buffer); | 1236 | rb_check_pages(cpu_buffer); |
1248 | 1237 | ||
1249 | atomic_dec(&cpu_buffer->record_disabled); | 1238 | spin_unlock_irq(&cpu_buffer->reader_lock); |
1250 | } | 1239 | } |
1251 | 1240 | ||
1252 | /** | 1241 | /** |
@@ -1254,11 +1243,6 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer, | |||
1254 | * @buffer: the buffer to resize. | 1243 | * @buffer: the buffer to resize. |
1255 | * @size: the new size. | 1244 | * @size: the new size. |
1256 | * | 1245 | * |
1257 | * The tracer is responsible for making sure that the buffer is | ||
1258 | * not being used while changing the size. | ||
1259 | * Note: We may be able to change the above requirement by using | ||
1260 | * RCU synchronizations. | ||
1261 | * | ||
1262 | * Minimum size is 2 * BUF_PAGE_SIZE. | 1246 | * Minimum size is 2 * BUF_PAGE_SIZE. |
1263 | * | 1247 | * |
1264 | * Returns -1 on failure. | 1248 | * Returns -1 on failure. |
@@ -1290,6 +1274,11 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
1290 | if (size == buffer_size) | 1274 | if (size == buffer_size) |
1291 | return size; | 1275 | return size; |
1292 | 1276 | ||
1277 | atomic_inc(&buffer->record_disabled); | ||
1278 | |||
1279 | /* Make sure all writers are done with this buffer. */ | ||
1280 | synchronize_sched(); | ||
1281 | |||
1293 | mutex_lock(&buffer->mutex); | 1282 | mutex_lock(&buffer->mutex); |
1294 | get_online_cpus(); | 1283 | get_online_cpus(); |
1295 | 1284 | ||
@@ -1352,6 +1341,8 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
1352 | put_online_cpus(); | 1341 | put_online_cpus(); |
1353 | mutex_unlock(&buffer->mutex); | 1342 | mutex_unlock(&buffer->mutex); |
1354 | 1343 | ||
1344 | atomic_dec(&buffer->record_disabled); | ||
1345 | |||
1355 | return size; | 1346 | return size; |
1356 | 1347 | ||
1357 | free_pages: | 1348 | free_pages: |
@@ -1361,6 +1352,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
1361 | } | 1352 | } |
1362 | put_online_cpus(); | 1353 | put_online_cpus(); |
1363 | mutex_unlock(&buffer->mutex); | 1354 | mutex_unlock(&buffer->mutex); |
1355 | atomic_dec(&buffer->record_disabled); | ||
1364 | return -ENOMEM; | 1356 | return -ENOMEM; |
1365 | 1357 | ||
1366 | /* | 1358 | /* |
@@ -1370,6 +1362,7 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size) | |||
1370 | out_fail: | 1362 | out_fail: |
1371 | put_online_cpus(); | 1363 | put_online_cpus(); |
1372 | mutex_unlock(&buffer->mutex); | 1364 | mutex_unlock(&buffer->mutex); |
1365 | atomic_dec(&buffer->record_disabled); | ||
1373 | return -1; | 1366 | return -1; |
1374 | } | 1367 | } |
1375 | EXPORT_SYMBOL_GPL(ring_buffer_resize); | 1368 | EXPORT_SYMBOL_GPL(ring_buffer_resize); |
@@ -2834,7 +2827,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
2834 | int ret; | 2827 | int ret; |
2835 | 2828 | ||
2836 | local_irq_save(flags); | 2829 | local_irq_save(flags); |
2837 | __raw_spin_lock(&cpu_buffer->lock); | 2830 | arch_spin_lock(&cpu_buffer->lock); |
2838 | 2831 | ||
2839 | again: | 2832 | again: |
2840 | /* | 2833 | /* |
@@ -2876,7 +2869,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
2876 | * Splice the empty reader page into the list around the head. | 2869 | * Splice the empty reader page into the list around the head. |
2877 | */ | 2870 | */ |
2878 | reader = rb_set_head_page(cpu_buffer); | 2871 | reader = rb_set_head_page(cpu_buffer); |
2879 | cpu_buffer->reader_page->list.next = reader->list.next; | 2872 | cpu_buffer->reader_page->list.next = rb_list_head(reader->list.next); |
2880 | cpu_buffer->reader_page->list.prev = reader->list.prev; | 2873 | cpu_buffer->reader_page->list.prev = reader->list.prev; |
2881 | 2874 | ||
2882 | /* | 2875 | /* |
@@ -2913,7 +2906,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
2913 | * | 2906 | * |
2914 | * Now make the new head point back to the reader page. | 2907 | * Now make the new head point back to the reader page. |
2915 | */ | 2908 | */ |
2916 | reader->list.next->prev = &cpu_buffer->reader_page->list; | 2909 | rb_list_head(reader->list.next)->prev = &cpu_buffer->reader_page->list; |
2917 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); | 2910 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); |
2918 | 2911 | ||
2919 | /* Finally update the reader page to the new head */ | 2912 | /* Finally update the reader page to the new head */ |
@@ -2923,7 +2916,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
2923 | goto again; | 2916 | goto again; |
2924 | 2917 | ||
2925 | out: | 2918 | out: |
2926 | __raw_spin_unlock(&cpu_buffer->lock); | 2919 | arch_spin_unlock(&cpu_buffer->lock); |
2927 | local_irq_restore(flags); | 2920 | local_irq_restore(flags); |
2928 | 2921 | ||
2929 | return reader; | 2922 | return reader; |
@@ -3286,9 +3279,9 @@ ring_buffer_read_start(struct ring_buffer *buffer, int cpu) | |||
3286 | synchronize_sched(); | 3279 | synchronize_sched(); |
3287 | 3280 | ||
3288 | spin_lock_irqsave(&cpu_buffer->reader_lock, flags); | 3281 | spin_lock_irqsave(&cpu_buffer->reader_lock, flags); |
3289 | __raw_spin_lock(&cpu_buffer->lock); | 3282 | arch_spin_lock(&cpu_buffer->lock); |
3290 | rb_iter_reset(iter); | 3283 | rb_iter_reset(iter); |
3291 | __raw_spin_unlock(&cpu_buffer->lock); | 3284 | arch_spin_unlock(&cpu_buffer->lock); |
3292 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | 3285 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |
3293 | 3286 | ||
3294 | return iter; | 3287 | return iter; |
@@ -3408,11 +3401,11 @@ void ring_buffer_reset_cpu(struct ring_buffer *buffer, int cpu) | |||
3408 | if (RB_WARN_ON(cpu_buffer, local_read(&cpu_buffer->committing))) | 3401 | if (RB_WARN_ON(cpu_buffer, local_read(&cpu_buffer->committing))) |
3409 | goto out; | 3402 | goto out; |
3410 | 3403 | ||
3411 | __raw_spin_lock(&cpu_buffer->lock); | 3404 | arch_spin_lock(&cpu_buffer->lock); |
3412 | 3405 | ||
3413 | rb_reset_cpu(cpu_buffer); | 3406 | rb_reset_cpu(cpu_buffer); |
3414 | 3407 | ||
3415 | __raw_spin_unlock(&cpu_buffer->lock); | 3408 | arch_spin_unlock(&cpu_buffer->lock); |
3416 | 3409 | ||
3417 | out: | 3410 | out: |
3418 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); | 3411 | spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); |