mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 09:44:18 +08:00
Merge branch 'oprofile-for-tip' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile into x86/urgent
This commit is contained in:
commit
01aab518b0
@ -21,7 +21,7 @@ config OPROFILE_IBS
|
||||
Instruction-Based Sampling (IBS) is a new profiling
|
||||
technique that provides rich, precise program performance
|
||||
information. IBS is introduced by AMD Family10h processors
|
||||
(AMD Opteron Quad-Core processor “Barcelona”) to overcome
|
||||
(AMD Opteron Quad-Core processor "Barcelona") to overcome
|
||||
the limitations of conventional performance counter
|
||||
sampling.
|
||||
|
||||
|
@ -27,8 +27,7 @@ static int num_counters = 2;
|
||||
static int counter_width = 32;
|
||||
|
||||
#define CTR_IS_RESERVED(msrs, c) (msrs->counters[(c)].addr ? 1 : 0)
|
||||
#define CTR_READ(l, h, msrs, c) do {rdmsr(msrs->counters[(c)].addr, (l), (h)); } while (0)
|
||||
#define CTR_OVERFLOWED(n) (!((n) & (1U<<(counter_width-1))))
|
||||
#define CTR_OVERFLOWED(n) (!((n) & (1ULL<<(counter_width-1))))
|
||||
|
||||
#define CTRL_IS_RESERVED(msrs, c) (msrs->controls[(c)].addr ? 1 : 0)
|
||||
#define CTRL_READ(l, h, msrs, c) do {rdmsr((msrs->controls[(c)].addr), (l), (h)); } while (0)
|
||||
@ -124,14 +123,14 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs)
|
||||
static int ppro_check_ctrs(struct pt_regs * const regs,
|
||||
struct op_msrs const * const msrs)
|
||||
{
|
||||
unsigned int low, high;
|
||||
u64 val;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < num_counters; ++i) {
|
||||
if (!reset_value[i])
|
||||
continue;
|
||||
CTR_READ(low, high, msrs, i);
|
||||
if (CTR_OVERFLOWED(low)) {
|
||||
rdmsrl(msrs->counters[i].addr, val);
|
||||
if (CTR_OVERFLOWED(val)) {
|
||||
oprofile_add_sample(regs, i);
|
||||
wrmsrl(msrs->counters[i].addr, -reset_value[i]);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ static int event_buffer_open(struct inode *inode, struct file *file)
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (test_and_set_bit(0, &buffer_opened))
|
||||
if (test_and_set_bit_lock(0, &buffer_opened))
|
||||
return -EBUSY;
|
||||
|
||||
/* Register as a user of dcookies
|
||||
@ -129,7 +129,7 @@ static int event_buffer_open(struct inode *inode, struct file *file)
|
||||
fail:
|
||||
dcookie_unregister(file->private_data);
|
||||
out:
|
||||
clear_bit(0, &buffer_opened);
|
||||
__clear_bit_unlock(0, &buffer_opened);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@ static int event_buffer_release(struct inode *inode, struct file *file)
|
||||
dcookie_unregister(file->private_data);
|
||||
buffer_pos = 0;
|
||||
atomic_set(&buffer_ready, 0);
|
||||
clear_bit(0, &buffer_opened);
|
||||
__clear_bit_unlock(0, &buffer_opened);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user