OProfile: enable IBS for AMD CPUs
authorRobert Richter <robert.richter@amd.com>
Tue, 22 Jul 2008 19:09:01 +0000 (21:09 +0200)
committerIngo Molnar <mingo@elte.hu>
Sat, 26 Jul 2008 09:48:09 +0000 (11:48 +0200)
Signed-off-by: Robert Richter <robert.richter@amd.com>
Cc: oprofile-list <oprofile-list@lists.sourceforge.net>
Cc: Barry Kasindorf <barry.kasindorf@amd.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/oprofile/nmi_int.c
arch/x86/oprofile/op_model_athlon.c

index b298193..287513a 100644 (file)
@@ -468,6 +468,14 @@ int __init op_nmi_init(struct oprofile_operations *ops)
                return -ENODEV;
        }
 
+       /* default values, can be overwritten by model */
+       ops->create_files = nmi_create_files;
+       ops->setup = nmi_setup;
+       ops->shutdown = nmi_shutdown;
+       ops->start = nmi_start;
+       ops->stop = nmi_stop;
+       ops->cpu_type = cpu_type;
+
        if (model->init)
                ret = model->init(ops);
        if (ret)
@@ -475,12 +483,6 @@ int __init op_nmi_init(struct oprofile_operations *ops)
 
        init_sysfs();
        using_nmi = 1;
-       ops->create_files = nmi_create_files;
-       ops->setup = nmi_setup;
-       ops->shutdown = nmi_shutdown;
-       ops->start = nmi_start;
-       ops->stop = nmi_stop;
-       ops->cpu_type = cpu_type;
        printk(KERN_INFO "oprofile: using NMI interrupt.\n");
        return 0;
 }
index 2650b12..0d83903 100644 (file)
@@ -446,13 +446,25 @@ static void clear_ibs_nmi(void)
                on_each_cpu(apic_clear_ibs_nmi_per_cpu, NULL, 1);
 }
 
+static int (*create_arch_files)(struct super_block * sb, struct dentry * root);
+
 static int setup_ibs_files(struct super_block * sb, struct dentry * root)
 {
        char buf[12];
        struct dentry *dir;
+       int ret = 0;
+
+       /* architecture specific files */
+       if (create_arch_files)
+               ret = create_arch_files(sb, root);
+
+       if (ret)
+               return ret;
 
        if (!ibs_allowed)
-               return 0;
+               return ret;
+
+       /* model specific files */
 
        /* setup some reasonable defaults */
        ibs_config.max_cnt_fetch = 250000;
@@ -482,11 +494,15 @@ static int setup_ibs_files(struct super_block * sb, struct dentry * root)
 
 static int op_amd_init(struct oprofile_operations *ops)
 {
+       setup_ibs();
+       create_arch_files = ops->create_files;
+       ops->create_files = setup_ibs_files;
        return 0;
 }
 
 static void op_amd_exit(void)
 {
+       clear_ibs_nmi();
 }
 
 struct op_x86_model_spec const op_amd_spec = {