|
@@ -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:
|