|
@@ -1757,10 +1757,7 @@ ssize_t x86_event_sysfs_show(char *page, u64 config, u64 event)
|
|
|
}
|
|
|
|
|
|
static struct attribute_group x86_pmu_attr_group;
|
|
|
-
|
|
|
-static struct attribute_group x86_pmu_caps_group = {
|
|
|
- .name = "caps",
|
|
|
-};
|
|
|
+static struct attribute_group x86_pmu_caps_group;
|
|
|
|
|
|
static int __init init_hw_perf_events(void)
|
|
|
{
|
|
@@ -1808,7 +1805,14 @@ static int __init init_hw_perf_events(void)
|
|
|
0, x86_pmu.num_counters, 0, 0);
|
|
|
|
|
|
x86_pmu_format_group.attrs = x86_pmu.format_attrs;
|
|
|
- x86_pmu_caps_group.attrs = x86_pmu.caps_attrs;
|
|
|
+
|
|
|
+ if (x86_pmu.caps_attrs) {
|
|
|
+ struct attribute **tmp;
|
|
|
+
|
|
|
+ tmp = merge_attr(x86_pmu_caps_group.attrs, x86_pmu.caps_attrs);
|
|
|
+ if (!WARN_ON(!tmp))
|
|
|
+ x86_pmu_caps_group.attrs = tmp;
|
|
|
+ }
|
|
|
|
|
|
if (x86_pmu.event_attrs)
|
|
|
x86_pmu_events_group.attrs = x86_pmu.event_attrs;
|
|
@@ -2224,6 +2228,25 @@ static struct attribute_group x86_pmu_attr_group = {
|
|
|
.attrs = x86_pmu_attrs,
|
|
|
};
|
|
|
|
|
|
+static ssize_t max_precise_show(struct device *cdev,
|
|
|
+ struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ return snprintf(buf, PAGE_SIZE, "%d\n", x86_pmu_max_precise());
|
|
|
+}
|
|
|
+
|
|
|
+static DEVICE_ATTR_RO(max_precise);
|
|
|
+
|
|
|
+static struct attribute *x86_pmu_caps_attrs[] = {
|
|
|
+ &dev_attr_max_precise.attr,
|
|
|
+ NULL
|
|
|
+};
|
|
|
+
|
|
|
+static struct attribute_group x86_pmu_caps_group = {
|
|
|
+ .name = "caps",
|
|
|
+ .attrs = x86_pmu_caps_attrs,
|
|
|
+};
|
|
|
+
|
|
|
static const struct attribute_group *x86_pmu_attr_groups[] = {
|
|
|
&x86_pmu_attr_group,
|
|
|
&x86_pmu_format_group,
|