diff options
Diffstat (limited to 'drivers/oprofile/cpu_buffer.c')
| -rw-r--r-- | drivers/oprofile/cpu_buffer.c | 39 | 
1 files changed, 23 insertions, 16 deletions
| diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index 1b6590746be..ddba9d01f09 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
| @@ -363,31 +363,38 @@ void oprofile_add_sample(struct pt_regs * const regs, unsigned long event) | |||
| 363 | 363 | ||
| 364 | #ifdef CONFIG_OPROFILE_IBS | 364 | #ifdef CONFIG_OPROFILE_IBS | 
| 365 | 365 | ||
| 366 | void oprofile_add_ibs_sample(struct pt_regs * const regs, | 366 | /* | 
| 367 | unsigned int * const ibs_sample, int ibs_code) | 367 | * Add samples with data to the ring buffer. | 
| 368 | * | ||
| 369 | * Use op_cpu_buffer_add_data(&entry, val) to add data and | ||
| 370 | * op_cpu_buffer_write_commit(&entry) to commit the sample. | ||
| 371 | */ | ||
| 372 | void oprofile_add_data(struct op_entry *entry, struct pt_regs * const regs, | ||
| 373 | unsigned long pc, int code, int size) | ||
| 368 | { | 374 | { | 
| 375 | struct op_sample *sample; | ||
| 369 | int is_kernel = !user_mode(regs); | 376 | int is_kernel = !user_mode(regs); | 
| 370 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); | 377 | struct oprofile_cpu_buffer *cpu_buf = &__get_cpu_var(cpu_buffer); | 
| 371 | int fail = 0; | ||
| 372 | 378 | ||
| 373 | cpu_buf->sample_received++; | 379 | cpu_buf->sample_received++; | 
| 374 | 380 | ||
| 375 | /* backtraces disabled for ibs */ | 381 | /* no backtraces for samples with data */ | 
| 376 | fail = fail || op_add_code(cpu_buf, 0, is_kernel, current); | 382 | if (op_add_code(cpu_buf, 0, is_kernel, current)) | 
| 383 | goto fail; | ||
| 377 | 384 | ||
| 378 | fail = fail || op_add_sample(cpu_buf, ESCAPE_CODE, ibs_code); | 385 | sample = op_cpu_buffer_write_reserve(entry, size + 2); | 
| 379 | fail = fail || op_add_sample(cpu_buf, ibs_sample[0], ibs_sample[1]); | 386 | if (!sample) | 
| 380 | fail = fail || op_add_sample(cpu_buf, ibs_sample[2], ibs_sample[3]); | 387 | goto fail; | 
| 381 | fail = fail || op_add_sample(cpu_buf, ibs_sample[4], ibs_sample[5]); | 388 | sample->eip = ESCAPE_CODE; | 
| 389 | sample->event = 0; /* no flags */ | ||
| 382 | 390 | ||
| 383 | if (ibs_code == IBS_OP_BEGIN) { | 391 | op_cpu_buffer_add_data(entry, code); | 
| 384 | fail = fail || op_add_sample(cpu_buf, ibs_sample[6], ibs_sample[7]); | 392 | op_cpu_buffer_add_data(entry, pc); | 
| 385 | fail = fail || op_add_sample(cpu_buf, ibs_sample[8], ibs_sample[9]); | 393 | |
| 386 | fail = fail || op_add_sample(cpu_buf, ibs_sample[10], ibs_sample[11]); | 394 | return; | 
| 387 | } | ||
| 388 | 395 | ||
| 389 | if (fail) | 396 | fail: | 
| 390 | cpu_buf->sample_lost_overflow++; | 397 | cpu_buf->sample_lost_overflow++; | 
| 391 | } | 398 | } | 
| 392 | 399 | ||
| 393 | #endif | 400 | #endif | 
