|
@@ -1622,6 +1622,29 @@ ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr, cha
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(events_sysfs_show);
|
|
EXPORT_SYMBOL_GPL(events_sysfs_show);
|
|
|
|
|
|
|
|
+ssize_t events_ht_sysfs_show(struct device *dev, struct device_attribute *attr,
|
|
|
|
+ char *page)
|
|
|
|
+{
|
|
|
|
+ struct perf_pmu_events_ht_attr *pmu_attr =
|
|
|
|
+ container_of(attr, struct perf_pmu_events_ht_attr, attr);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Report conditional events depending on Hyper-Threading.
|
|
|
|
+ *
|
|
|
|
+ * This is overly conservative as usually the HT special
|
|
|
|
+ * handling is not needed if the other CPU thread is idle.
|
|
|
|
+ *
|
|
|
|
+ * Note this does not (and cannot) handle the case when thread
|
|
|
|
+ * siblings are invisible, for example with virtualization
|
|
|
|
+ * if they are owned by some other guest. The user tool
|
|
|
|
+ * has to re-read when a thread sibling gets onlined later.
|
|
|
|
+ */
|
|
|
|
+ return sprintf(page, "%s",
|
|
|
|
+ topology_max_smt_threads() > 1 ?
|
|
|
|
+ pmu_attr->event_str_ht :
|
|
|
|
+ pmu_attr->event_str_noht);
|
|
|
|
+}
|
|
|
|
+
|
|
EVENT_ATTR(cpu-cycles, CPU_CYCLES );
|
|
EVENT_ATTR(cpu-cycles, CPU_CYCLES );
|
|
EVENT_ATTR(instructions, INSTRUCTIONS );
|
|
EVENT_ATTR(instructions, INSTRUCTIONS );
|
|
EVENT_ATTR(cache-references, CACHE_REFERENCES );
|
|
EVENT_ATTR(cache-references, CACHE_REFERENCES );
|