perf/x86: Add cpumask for uncore pmu
authorYan, Zheng <zheng.z.yan@intel.com>
Mon, 10 Sep 2012 07:53:49 +0000 (15:53 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 17 Sep 2012 16:11:43 +0000 (13:11 -0300)
This patch adds a cpumask file to the uncore pmu sysfs directory.  The
cpumask file contains one active cpu for every socket.

Signed-off-by: "Yan, Zheng" <zheng.z.yan@intel.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: "Yan, Zheng" <zheng.z.yan@intel.com>
Link: http://lkml.kernel.org/r/1347263631-23175-2-git-send-email-zheng.z.yan@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
arch/x86/kernel/cpu/perf_event_intel_uncore.c
arch/x86/kernel/cpu/perf_event_intel_uncore.h

index 0a5571080e7453bc9d602061ffbe2c6ad81647a2..62ec3e6af7ea2eb43916ee2a49a83bf10e297a95 100644 (file)
@@ -2341,6 +2341,27 @@ int uncore_pmu_event_init(struct perf_event *event)
        return ret;
 }
 
+static ssize_t uncore_get_attr_cpumask(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       int n = cpulist_scnprintf(buf, PAGE_SIZE - 2, &uncore_cpu_mask);
+
+       buf[n++] = '\n';
+       buf[n] = '\0';
+       return n;
+}
+
+static DEVICE_ATTR(cpumask, S_IRUGO, uncore_get_attr_cpumask, NULL);
+
+static struct attribute *uncore_pmu_attrs[] = {
+       &dev_attr_cpumask.attr,
+       NULL,
+};
+
+static struct attribute_group uncore_pmu_attr_group = {
+       .attrs = uncore_pmu_attrs,
+};
+
 static int __init uncore_pmu_register(struct intel_uncore_pmu *pmu)
 {
        int ret;
@@ -2378,8 +2399,8 @@ static void __init uncore_type_exit(struct intel_uncore_type *type)
                free_percpu(type->pmus[i].box);
        kfree(type->pmus);
        type->pmus = NULL;
-       kfree(type->attr_groups[1]);
-       type->attr_groups[1] = NULL;
+       kfree(type->events_group);
+       type->events_group = NULL;
 }
 
 static void __init uncore_types_exit(struct intel_uncore_type **types)
@@ -2431,9 +2452,10 @@ static int __init uncore_type_init(struct intel_uncore_type *type)
                for (j = 0; j < i; j++)
                        attrs[j] = &type->event_descs[j].attr.attr;
 
-               type->attr_groups[1] = events_group;
+               type->events_group = events_group;
        }
 
+       type->pmu_group = &uncore_pmu_attr_group;
        type->pmus = pmus;
        return 0;
 fail:
index 5b81c1856aacadb95da71cdf7474bc1633ac7ecc..e68a4550e9529ffd1aa0fe5631397ed3360d03c8 100644 (file)
@@ -369,10 +369,12 @@ struct intel_uncore_type {
        struct intel_uncore_pmu *pmus;
        struct intel_uncore_ops *ops;
        struct uncore_event_desc *event_descs;
-       const struct attribute_group *attr_groups[3];
+       const struct attribute_group *attr_groups[4];
 };
 
-#define format_group attr_groups[0]
+#define pmu_group attr_groups[0]
+#define format_group attr_groups[1]
+#define events_group attr_groups[2]
 
 struct intel_uncore_ops {
        void (*init_box)(struct intel_uncore_box *);