diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 13:05:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 13:05:40 -0400 |
commit | 92fb83afd6664a6f8a05f990d264c998f9b99f69 (patch) | |
tree | b5c65f2a14d1019d8e00d94dafbc65696906455c /arch/x86/oprofile/op_model_amd.c | |
parent | a5344876065e047d507800d0801a637d68d3b129 (diff) | |
parent | df13b31c286b3e91c556167954eda088d90a4295 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rric/oprofile: (21 commits)
OProfile: Fix buffer synchronization for IBS
oprofile: hotplug cpu fix
oprofile: fixing whitespaces in arch/x86/oprofile/*
oprofile: fixing whitespaces in arch/x86/oprofile/*
oprofile: fixing whitespaces in drivers/oprofile/*
x86/oprofile: add the logic for enabling additional IBS bits
x86/oprofile: reordering functions in nmi_int.c
x86/oprofile: removing unused function parameter in add_ibs_begin()
oprofile: more whitespace fixes
oprofile: whitespace fixes
OProfile: Rename IBS sysfs dir into "ibs_op"
OProfile: Rework string handling in setup_ibs_files()
OProfile: Rework oprofile_add_ibs_sample() function
oprofile: discover counters for op ppro too
oprofile: Implement Intel architectural perfmon support
oprofile: Don't report Nehalem as core_2
oprofile: drop const in num counters field
Revert "Oprofile Multiplexing Patch"
x86, oprofile: BUG: using smp_processor_id() in preemptible code
x86/oprofile: fix on_each_cpu build error
...
Manually fixed trivial conflicts in
drivers/oprofile/{cpu_buffer.c,event_buffer.h}
Diffstat (limited to 'arch/x86/oprofile/op_model_amd.c')
-rw-r--r-- | arch/x86/oprofile/op_model_amd.c | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c index d9faf607b3a6..509513760a6e 100644 --- a/arch/x86/oprofile/op_model_amd.c +++ b/arch/x86/oprofile/op_model_amd.c | |||
@@ -67,8 +67,9 @@ static unsigned long reset_value[NUM_COUNTERS]; | |||
67 | 67 | ||
68 | /* The function interface needs to be fixed, something like add | 68 | /* The function interface needs to be fixed, something like add |
69 | data. Should then be added to linux/oprofile.h. */ | 69 | data. Should then be added to linux/oprofile.h. */ |
70 | extern void oprofile_add_ibs_sample(struct pt_regs *const regs, | 70 | extern void |
71 | unsigned int * const ibs_sample, u8 code); | 71 | oprofile_add_ibs_sample(struct pt_regs *const regs, |
72 | unsigned int *const ibs_sample, int ibs_code); | ||
72 | 73 | ||
73 | struct ibs_fetch_sample { | 74 | struct ibs_fetch_sample { |
74 | /* MSRC001_1031 IBS Fetch Linear Address Register */ | 75 | /* MSRC001_1031 IBS Fetch Linear Address Register */ |
@@ -309,12 +310,15 @@ static void op_amd_start(struct op_msrs const * const msrs) | |||
309 | #ifdef CONFIG_OPROFILE_IBS | 310 | #ifdef CONFIG_OPROFILE_IBS |
310 | if (ibs_allowed && ibs_config.fetch_enabled) { | 311 | if (ibs_allowed && ibs_config.fetch_enabled) { |
311 | low = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; | 312 | low = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; |
312 | high = IBS_FETCH_HIGH_ENABLE; | 313 | high = ((ibs_config.rand_en & 0x1) << 25) /* bit 57 */ |
314 | + IBS_FETCH_HIGH_ENABLE; | ||
313 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); | 315 | wrmsr(MSR_AMD64_IBSFETCHCTL, low, high); |
314 | } | 316 | } |
315 | 317 | ||
316 | if (ibs_allowed && ibs_config.op_enabled) { | 318 | if (ibs_allowed && ibs_config.op_enabled) { |
317 | low = ((ibs_config.max_cnt_op >> 4) & 0xFFFF) + IBS_OP_LOW_ENABLE; | 319 | low = ((ibs_config.max_cnt_op >> 4) & 0xFFFF) |
320 | + ((ibs_config.dispatched_ops & 0x1) << 19) /* bit 19 */ | ||
321 | + IBS_OP_LOW_ENABLE; | ||
318 | high = 0; | 322 | high = 0; |
319 | wrmsr(MSR_AMD64_IBSOPCTL, low, high); | 323 | wrmsr(MSR_AMD64_IBSOPCTL, low, high); |
320 | } | 324 | } |
@@ -468,11 +472,10 @@ static void clear_ibs_nmi(void) | |||
468 | on_each_cpu(apic_clear_ibs_nmi_per_cpu, NULL, 1); | 472 | on_each_cpu(apic_clear_ibs_nmi_per_cpu, NULL, 1); |
469 | } | 473 | } |
470 | 474 | ||
471 | static int (*create_arch_files)(struct super_block * sb, struct dentry * root); | 475 | static int (*create_arch_files)(struct super_block *sb, struct dentry *root); |
472 | 476 | ||
473 | static int setup_ibs_files(struct super_block * sb, struct dentry * root) | 477 | static int setup_ibs_files(struct super_block *sb, struct dentry *root) |
474 | { | 478 | { |
475 | char buf[12]; | ||
476 | struct dentry *dir; | 479 | struct dentry *dir; |
477 | int ret = 0; | 480 | int ret = 0; |
478 | 481 | ||
@@ -494,22 +497,22 @@ static int setup_ibs_files(struct super_block * sb, struct dentry * root) | |||
494 | ibs_config.max_cnt_op = 250000; | 497 | ibs_config.max_cnt_op = 250000; |
495 | ibs_config.op_enabled = 0; | 498 | ibs_config.op_enabled = 0; |
496 | ibs_config.dispatched_ops = 1; | 499 | ibs_config.dispatched_ops = 1; |
497 | snprintf(buf, sizeof(buf), "ibs_fetch"); | 500 | |
498 | dir = oprofilefs_mkdir(sb, root, buf); | 501 | dir = oprofilefs_mkdir(sb, root, "ibs_fetch"); |
499 | oprofilefs_create_ulong(sb, dir, "rand_enable", | ||
500 | &ibs_config.rand_en); | ||
501 | oprofilefs_create_ulong(sb, dir, "enable", | 502 | oprofilefs_create_ulong(sb, dir, "enable", |
502 | &ibs_config.fetch_enabled); | 503 | &ibs_config.fetch_enabled); |
503 | oprofilefs_create_ulong(sb, dir, "max_count", | 504 | oprofilefs_create_ulong(sb, dir, "max_count", |
504 | &ibs_config.max_cnt_fetch); | 505 | &ibs_config.max_cnt_fetch); |
505 | snprintf(buf, sizeof(buf), "ibs_uops"); | 506 | oprofilefs_create_ulong(sb, dir, "rand_enable", |
506 | dir = oprofilefs_mkdir(sb, root, buf); | 507 | &ibs_config.rand_en); |
508 | |||
509 | dir = oprofilefs_mkdir(sb, root, "ibs_op"); | ||
507 | oprofilefs_create_ulong(sb, dir, "enable", | 510 | oprofilefs_create_ulong(sb, dir, "enable", |
508 | &ibs_config.op_enabled); | 511 | &ibs_config.op_enabled); |
509 | oprofilefs_create_ulong(sb, dir, "max_count", | 512 | oprofilefs_create_ulong(sb, dir, "max_count", |
510 | &ibs_config.max_cnt_op); | 513 | &ibs_config.max_cnt_op); |
511 | oprofilefs_create_ulong(sb, dir, "dispatched_ops", | 514 | oprofilefs_create_ulong(sb, dir, "dispatched_ops", |
512 | &ibs_config.dispatched_ops); | 515 | &ibs_config.dispatched_ops); |
513 | 516 | ||
514 | return 0; | 517 | return 0; |
515 | } | 518 | } |
@@ -530,14 +533,14 @@ static void op_amd_exit(void) | |||
530 | #endif | 533 | #endif |
531 | 534 | ||
532 | struct op_x86_model_spec const op_amd_spec = { | 535 | struct op_x86_model_spec const op_amd_spec = { |
533 | .init = op_amd_init, | 536 | .init = op_amd_init, |
534 | .exit = op_amd_exit, | 537 | .exit = op_amd_exit, |
535 | .num_counters = NUM_COUNTERS, | 538 | .num_counters = NUM_COUNTERS, |
536 | .num_controls = NUM_CONTROLS, | 539 | .num_controls = NUM_CONTROLS, |
537 | .fill_in_addresses = &op_amd_fill_in_addresses, | 540 | .fill_in_addresses = &op_amd_fill_in_addresses, |
538 | .setup_ctrs = &op_amd_setup_ctrs, | 541 | .setup_ctrs = &op_amd_setup_ctrs, |
539 | .check_ctrs = &op_amd_check_ctrs, | 542 | .check_ctrs = &op_amd_check_ctrs, |
540 | .start = &op_amd_start, | 543 | .start = &op_amd_start, |
541 | .stop = &op_amd_stop, | 544 | .stop = &op_amd_stop, |
542 | .shutdown = &op_amd_shutdown | 545 | .shutdown = &op_amd_shutdown |
543 | }; | 546 | }; |