A structure is added, called nvdimm_pmu, for performance
stats reporting support of nvdimm devices. It can be used to add
nvdimm pmu data such as supported events and pmu event functions
like event_init/add/read/del with cpu hotplug support.

Acked-by: Peter Zijlstra (Intel) <pet...@infradead.org>
Reviewed-by: Madhavan Srinivasan <ma...@linux.ibm.com>
Tested-by: Nageswara R Sastry <rnsas...@linux.ibm.com>
Signed-off-by: Kajol Jain <kj...@linux.ibm.com>
---
 include/linux/nd.h | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/include/linux/nd.h b/include/linux/nd.h
index ee9ad76afbba..712499cf7335 100644
--- a/include/linux/nd.h
+++ b/include/linux/nd.h
@@ -8,6 +8,8 @@
 #include <linux/ndctl.h>
 #include <linux/device.h>
 #include <linux/badblocks.h>
+#include <linux/platform_device.h>
+#include <linux/perf_event.h>
 
 enum nvdimm_event {
        NVDIMM_REVALIDATE_POISON,
@@ -23,6 +25,47 @@ enum nvdimm_claim_class {
        NVDIMM_CCLASS_UNKNOWN,
 };
 
+/* Event attribute array index */
+#define NVDIMM_PMU_FORMAT_ATTR         0
+#define NVDIMM_PMU_EVENT_ATTR          1
+#define NVDIMM_PMU_CPUMASK_ATTR                2
+#define NVDIMM_PMU_NULL_ATTR           3
+
+/**
+ * struct nvdimm_pmu - data structure for nvdimm perf driver
+ *
+ * @name: name of the nvdimm pmu device.
+ * @pmu: pmu data structure for nvdimm performance stats.
+ * @dev: nvdimm device pointer.
+ * @functions(event_init/add/del/read): platform specific pmu functions.
+ * @attr_groups: data structure for events, formats and cpumask
+ * @cpu: designated cpu for counter access.
+ * @node: node for cpu hotplug notifier link.
+ * @cpuhp_state: state for cpu hotplug notification.
+ * @arch_cpumask: cpumask to get designated cpu for counter access.
+ */
+struct nvdimm_pmu {
+       const char *name;
+       struct pmu pmu;
+       struct device *dev;
+       int (*event_init)(struct perf_event *event);
+       int  (*add)(struct perf_event *event, int flags);
+       void (*del)(struct perf_event *event, int flags);
+       void (*read)(struct perf_event *event);
+       /*
+        * Attribute groups for the nvdimm pmu. Index 0 used for
+        * format attribute, index 1 used for event attribute,
+        * index 2 used for cpusmask attribute and index 3 kept as NULL.
+        */
+       const struct attribute_group *attr_groups[4];
+       int cpu;
+       struct hlist_node node;
+       enum cpuhp_state cpuhp_state;
+
+       /* cpumask provided by arch/platform specific code */
+       struct cpumask arch_cpumask;
+};
+
 struct nd_device_driver {
        struct device_driver drv;
        unsigned long type;
-- 
2.26.2


Reply via email to