瀏覽代碼

Merge branch 'oprofile-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'oprofile-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  oprofile: introduce module_param oprofile.cpu_type
  oprofile: add support for Core i7 and Atom
  oprofile: remove undocumented oprofile.p4force option
  oprofile: re-add force_arch_perfmon option
Linus Torvalds 16 年之前
父節點
當前提交
57eee9ae7b
共有 2 個文件被更改,包括 31 次插入4 次删除
  1. 8 0
      Documentation/kernel-parameters.txt
  2. 23 4
      arch/x86/oprofile/nmi_int.c

+ 8 - 0
Documentation/kernel-parameters.txt

@@ -1665,6 +1665,14 @@ and is between 256 and 4096 characters. It is defined in the file
 	oprofile.timer=	[HW]
 	oprofile.timer=	[HW]
 			Use timer interrupt instead of performance counters
 			Use timer interrupt instead of performance counters
 
 
+	oprofile.cpu_type=	Force an oprofile cpu type
+			This might be useful if you have an older oprofile
+			userland or if you want common events.
+			Format: { archperfmon }
+			archperfmon: [X86] Force use of architectural
+				perfmon on Intel CPUs instead of the
+				CPU specific event set.
+
 	osst=		[HW,SCSI] SCSI Tape Driver
 	osst=		[HW,SCSI] SCSI Tape Driver
 			Format: <buffer_size>,<write_threshold>
 			Format: <buffer_size>,<write_threshold>
 			See also Documentation/scsi/st.txt.
 			See also Documentation/scsi/st.txt.

+ 23 - 4
arch/x86/oprofile/nmi_int.c

@@ -356,14 +356,11 @@ static void exit_sysfs(void)
 #define exit_sysfs() do { } while (0)
 #define exit_sysfs() do { } while (0)
 #endif /* CONFIG_PM */
 #endif /* CONFIG_PM */
 
 
-static int p4force;
-module_param(p4force, int, 0);
-
 static int __init p4_init(char **cpu_type)
 static int __init p4_init(char **cpu_type)
 {
 {
 	__u8 cpu_model = boot_cpu_data.x86_model;
 	__u8 cpu_model = boot_cpu_data.x86_model;
 
 
-	if (!p4force && (cpu_model > 6 || cpu_model == 5))
+	if (cpu_model > 6 || cpu_model == 5)
 		return 0;
 		return 0;
 
 
 #ifndef CONFIG_SMP
 #ifndef CONFIG_SMP
@@ -389,10 +386,25 @@ static int __init p4_init(char **cpu_type)
 	return 0;
 	return 0;
 }
 }
 
 
+static int force_arch_perfmon;
+static int force_cpu_type(const char *str, struct kernel_param *kp)
+{
+	if (!strcmp(str, "archperfmon")) {
+		force_arch_perfmon = 1;
+		printk(KERN_INFO "oprofile: forcing architectural perfmon\n");
+	}
+
+	return 0;
+}
+module_param_call(cpu_type, force_cpu_type, NULL, NULL, 0);
+
 static int __init ppro_init(char **cpu_type)
 static int __init ppro_init(char **cpu_type)
 {
 {
 	__u8 cpu_model = boot_cpu_data.x86_model;
 	__u8 cpu_model = boot_cpu_data.x86_model;
 
 
+	if (force_arch_perfmon && cpu_has_arch_perfmon)
+		return 0;
+
 	switch (cpu_model) {
 	switch (cpu_model) {
 	case 0 ... 2:
 	case 0 ... 2:
 		*cpu_type = "i386/ppro";
 		*cpu_type = "i386/ppro";
@@ -414,6 +426,13 @@ static int __init ppro_init(char **cpu_type)
 	case 15: case 23:
 	case 15: case 23:
 		*cpu_type = "i386/core_2";
 		*cpu_type = "i386/core_2";
 		break;
 		break;
+	case 26:
+		arch_perfmon_setup_counters();
+		*cpu_type = "i386/core_i7";
+		break;
+	case 28:
+		*cpu_type = "i386/atom";
+		break;
 	default:
 	default:
 		/* Unknown */
 		/* Unknown */
 		return 0;
 		return 0;