diff options
| -rw-r--r-- | drivers/oprofile/buffer_sync.c | 31 | ||||
| -rw-r--r-- | drivers/oprofile/cpu_buffer.h | 27 |
2 files changed, 29 insertions, 29 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 44f676c8a51d..aed286c3f16e 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
| @@ -464,33 +464,6 @@ static inline int is_code(unsigned long val) | |||
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | 466 | ||
| 467 | /* "acquire" as many cpu buffer slots as we can */ | ||
| 468 | static unsigned long get_slots(struct oprofile_cpu_buffer *b) | ||
| 469 | { | ||
| 470 | unsigned long head = b->head_pos; | ||
| 471 | unsigned long tail = b->tail_pos; | ||
| 472 | |||
| 473 | /* | ||
| 474 | * Subtle. This resets the persistent last_task | ||
| 475 | * and in_kernel values used for switching notes. | ||
| 476 | * BUT, there is a small window between reading | ||
| 477 | * head_pos, and this call, that means samples | ||
| 478 | * can appear at the new head position, but not | ||
| 479 | * be prefixed with the notes for switching | ||
| 480 | * kernel mode or a task switch. This small hole | ||
| 481 | * can lead to mis-attribution or samples where | ||
| 482 | * we don't know if it's in the kernel or not, | ||
| 483 | * at the start of an event buffer. | ||
| 484 | */ | ||
| 485 | cpu_buffer_reset(b); | ||
| 486 | |||
| 487 | if (head >= tail) | ||
| 488 | return head - tail; | ||
| 489 | |||
| 490 | return head + (b->buffer_size - tail); | ||
| 491 | } | ||
| 492 | |||
| 493 | |||
| 494 | /* Move tasks along towards death. Any tasks on dead_tasks | 467 | /* Move tasks along towards death. Any tasks on dead_tasks |
| 495 | * will definitely have no remaining references in any | 468 | * will definitely have no remaining references in any |
| 496 | * CPU buffers at this point, because we use two lists, | 469 | * CPU buffers at this point, because we use two lists, |
| @@ -576,11 +549,11 @@ void sync_buffer(int cpu) | |||
| 576 | /* Remember, only we can modify tail_pos */ | 549 | /* Remember, only we can modify tail_pos */ |
| 577 | 550 | ||
| 578 | #ifndef CONFIG_OPROFILE_IBS | 551 | #ifndef CONFIG_OPROFILE_IBS |
| 579 | available = get_slots(cpu_buf); | 552 | available = cpu_buffer_entries(cpu_buf); |
| 580 | 553 | ||
| 581 | for (i = 0; i < available; ++i) { | 554 | for (i = 0; i < available; ++i) { |
| 582 | #else | 555 | #else |
| 583 | while (get_slots(cpu_buf)) { | 556 | while (cpu_buffer_entries(cpu_buf)) { |
| 584 | #endif | 557 | #endif |
| 585 | struct op_sample *s = cpu_buffer_read_entry(cpu_buf); | 558 | struct op_sample *s = cpu_buffer_read_entry(cpu_buf); |
| 586 | 559 | ||
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index e6089768ae66..6055b5678394 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
| @@ -81,6 +81,33 @@ struct op_sample *cpu_buffer_read_entry(struct oprofile_cpu_buffer *cpu_buf) | |||
| 81 | return &cpu_buf->buffer[cpu_buf->tail_pos]; | 81 | return &cpu_buf->buffer[cpu_buf->tail_pos]; |
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | /* "acquire" as many cpu buffer slots as we can */ | ||
| 85 | static inline | ||
| 86 | unsigned long cpu_buffer_entries(struct oprofile_cpu_buffer *b) | ||
| 87 | { | ||
| 88 | unsigned long head = b->head_pos; | ||
| 89 | unsigned long tail = b->tail_pos; | ||
| 90 | |||
| 91 | /* | ||
| 92 | * Subtle. This resets the persistent last_task | ||
| 93 | * and in_kernel values used for switching notes. | ||
| 94 | * BUT, there is a small window between reading | ||
| 95 | * head_pos, and this call, that means samples | ||
| 96 | * can appear at the new head position, but not | ||
| 97 | * be prefixed with the notes for switching | ||
| 98 | * kernel mode or a task switch. This small hole | ||
| 99 | * can lead to mis-attribution or samples where | ||
| 100 | * we don't know if it's in the kernel or not, | ||
| 101 | * at the start of an event buffer. | ||
| 102 | */ | ||
| 103 | cpu_buffer_reset(b); | ||
| 104 | |||
| 105 | if (head >= tail) | ||
| 106 | return head - tail; | ||
| 107 | |||
| 108 | return head + (b->buffer_size - tail); | ||
| 109 | } | ||
| 110 | |||
| 84 | /* transient events for the CPU buffer -> event buffer */ | 111 | /* transient events for the CPU buffer -> event buffer */ |
| 85 | #define CPU_IS_KERNEL 1 | 112 | #define CPU_IS_KERNEL 1 |
| 86 | #define CPU_TRACE_BEGIN 2 | 113 | #define CPU_TRACE_BEGIN 2 |
