lkml.org 
[lkml]   [2012]   [Jan]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 5/9] perf: Adding sysfs group format attribute for pmu device
Date
Adding sysfs group 'format' attribute for pmu device that
contains a syntax description on how to construct raw events.

The event configuration is described in following
struct pefr_event_attr attributes:

config
config1
config2

Each sysfs attribute within the format attribute group,
describes mapping of name and bitfield definition within
one of above attributes.

eg:
"/sys/...<dev>/format/event" contains "config:0-7"
"/sys/...<dev>/format/umask" contains "config:8-15"
"/sys/...<dev>/format/usr" contains "config:16"

the attribute value syntax is:

line: config ':' bits
config: 'config' | 'config1' | 'config2"
bits: bits ',' bit_term | bit_term
bit_term: VALUE '-' VALUE | VALUE

Adding format_defined bool to the struct pmu to specify wether
pmu defines its own set of format attributes (within the
attr_groups member) or the default format attributes should be
used:
"/sys/...<dev>/format/config" contains "config:0-63"
"/sys/...<dev>/format/config1" contains "config1:0-63"
"/sys/...<dev>/format/config2" contains "config2:0-63"

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
---
.../testing/sysfs-bus-event_source-devices-format | 14 ++++++++++++
include/linux/perf_event.h | 22 ++++++++++++++++++++
kernel/events/core.c | 22 ++++++++++++++++++++
3 files changed, 58 insertions(+), 0 deletions(-)
create mode 100644 Documentation/ABI/testing/sysfs-bus-event_source-devices-format

diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-format b/Documentation/ABI/testing/sysfs-bus-event_source-devices-format
new file mode 100644
index 0000000..079afc7
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-format
@@ -0,0 +1,14 @@
+Where: /sys/bus/event_source/devices/<dev>/format
+Date: January 2012
+Kernel Version: 3.3
+Contact: Jiri Olsa <jolsa@redhat.com>
+Description:
+ Attribute group to describe the magic bits that go into
+ perf_event_attr::config[012] for a particular pmu.
+ Each attribute of this group defines the 'hardware' bitmask
+ we want to export, so that userspace can deal with sane
+ name/value pairs.
+
+ Example: 'config1:1,6-10,44'
+ Defines contents of attribute that occupies bits 1,6-10,44 of
+ perf_event_attr::config1.
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 0b91db2..e2bf1c7 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -516,6 +516,7 @@ struct perf_guest_info_callbacks {
#include <linux/irq_work.h>
#include <linux/jump_label.h>
#include <linux/atomic.h>
+#include <linux/sysfs.h>
#include <asm/local.h>

#define PERF_MAX_STACK_DEPTH 255
@@ -626,6 +627,12 @@ struct pmu {
int task_ctx_nr;

/*
+ * True if the pmu defines its own set of format attributes within
+ * attr_groups. If false, default format attributes are used.
+ */
+ bool format_defined;
+
+ /*
* Fully disable/enable this PMU, can be used to protect from the PMI
* as well as for lazy/batch writing of the MSRs.
*/
@@ -1215,5 +1222,20 @@ do { \
register_cpu_notifier(&fn##_nb); \
} while (0)

+
+#define PMU_FORMAT_ATTR(_name, _format) \
+static ssize_t \
+pmu_format_attr_##_name##_show(struct device *dev, \
+ struct device_attribute *attr, \
+ char *page) \
+{ \
+ BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE); \
+ return sprintf(page, _format "\n"); \
+} \
+ \
+static struct device_attribute format_attr_##_name = \
+ __ATTR(_name, 0444, \
+ pmu_format_attr_##_name##_show, NULL)
+
#endif /* __KERNEL__ */
#endif /* _LINUX_PERF_EVENT_H */
diff --git a/kernel/events/core.c b/kernel/events/core.c
index de859fb..8d2d6f3 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -5503,6 +5503,22 @@ static struct bus_type pmu_bus = {
.dev_attrs = pmu_dev_attrs,
};

+/* Default format attributes. */
+PMU_FORMAT_ATTR(config, "config:0-63");
+PMU_FORMAT_ATTR(config1, "config1:0-63");
+PMU_FORMAT_ATTR(config2, "config2:0-63");
+
+static struct attribute *format_attrs[] = {
+ &format_attr_config.attr,
+ &format_attr_config1.attr,
+ &format_attr_config2.attr,
+};
+
+static struct attribute_group format_attr_group = {
+ .name = "format",
+ .attrs = format_attrs,
+};
+
static void pmu_dev_release(struct device *dev)
{
kfree(dev);
@@ -5529,6 +5545,12 @@ static int pmu_dev_alloc(struct pmu *pmu)
if (ret)
goto free_dev;

+ if (!pmu->format_defined) {
+ ret = sysfs_create_group(&pmu->dev->kobj, &format_attr_group);
+ if (ret)
+ goto free_dev;
+ }
+
out:
return ret;

--
1.7.4.4


\
 
 \ /
  Last update: 2012-01-27 15:37    [W:0.238 / U:1.728 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site