Description:
                The directory containing symlinks to memory targets that
                this initiator node has class "Y" access.
+
+What:          /sys/devices/system/node/nodeX/accessY/initiators/read_bandwidth
+Date:          December 2018
+Contact:       Keith Busch <keith.busch@intel.com>
+Description:
+               This node's read bandwidth in MB/s when accessed from
+               nodes found in this access class's linked initiators.
+
+What:          /sys/devices/system/node/nodeX/accessY/initiators/read_latency
+Date:          December 2018
+Contact:       Keith Busch <keith.busch@intel.com>
+Description:
+               This node's read latency in nanoseconds when accessed
+               from nodes found in this access class's linked initiators.
+
+What:          /sys/devices/system/node/nodeX/accessY/initiators/write_bandwidth
+Date:          December 2018
+Contact:       Keith Busch <keith.busch@intel.com>
+Description:
+               This node's write bandwidth in MB/s when accessed from
+               found in this access class's linked initiators.
+
+What:          /sys/devices/system/node/nodeX/accessY/initiators/write_latency
+Date:          December 2018
+Contact:       Keith Busch <keith.busch@intel.com>
+Description:
+               This node's write latency in nanoseconds when access
+               from nodes found in this class's linked initiators.
 
        struct device           dev;
        struct list_head        list_node;
        unsigned                access;
+#ifdef CONFIG_HMEM_REPORTING
+       struct node_hmem_attrs  hmem_attrs;
+#endif
 };
 #define to_access_nodes(dev) container_of(dev, struct node_access_nodes, dev)
 
        return NULL;
 }
 
+#ifdef CONFIG_HMEM_REPORTING
+#define ACCESS_ATTR(name)                                                 \
+static ssize_t name##_show(struct device *dev,                            \
+                          struct device_attribute *attr,                  \
+                          char *buf)                                      \
+{                                                                         \
+       return sprintf(buf, "%u\n", to_access_nodes(dev)->hmem_attrs.name); \
+}                                                                         \
+static DEVICE_ATTR_RO(name);
+
+ACCESS_ATTR(read_bandwidth)
+ACCESS_ATTR(read_latency)
+ACCESS_ATTR(write_bandwidth)
+ACCESS_ATTR(write_latency)
+
+static struct attribute *access_attrs[] = {
+       &dev_attr_read_bandwidth.attr,
+       &dev_attr_read_latency.attr,
+       &dev_attr_write_bandwidth.attr,
+       &dev_attr_write_latency.attr,
+       NULL,
+};
+
+/**
+ * node_set_perf_attrs - Set the performance values for given access class
+ * @nid: Node identifier to be set
+ * @hmem_attrs: Heterogeneous memory performance attributes
+ * @access: The access class the for the given attributes
+ */
+void node_set_perf_attrs(unsigned int nid, struct node_hmem_attrs *hmem_attrs,
+                        unsigned access)
+{
+       struct node_access_nodes *c;
+       struct node *node;
+       int i;
+
+       if (WARN_ON_ONCE(!node_online(nid)))
+               return;
+
+       node = node_devices[nid];
+       c = node_init_node_access(node, access);
+       if (!c)
+               return;
+
+       c->hmem_attrs = *hmem_attrs;
+       for (i = 0; access_attrs[i] != NULL; i++) {
+               if (sysfs_add_file_to_group(&c->dev.kobj, access_attrs[i],
+                                           "initiators")) {
+                       pr_info("failed to add performance attribute to node %d\n",
+                               nid);
+                       break;
+               }
+       }
+}
+#endif
+
 #define K(x) ((x) << (PAGE_SHIFT - 10))
 static ssize_t node_read_meminfo(struct device *dev,
                        struct device_attribute *attr, char *buf)
 
 #include <linux/list.h>
 #include <linux/workqueue.h>
 
+/**
+ * struct node_hmem_attrs - heterogeneous memory performance attributes
+ *
+ * @read_bandwidth:    Read bandwidth in MB/s
+ * @write_bandwidth:   Write bandwidth in MB/s
+ * @read_latency:      Read latency in nanoseconds
+ * @write_latency:     Write latency in nanoseconds
+ */
+struct node_hmem_attrs {
+       unsigned int read_bandwidth;
+       unsigned int write_bandwidth;
+       unsigned int read_latency;
+       unsigned int write_latency;
+};
+
+#ifdef CONFIG_HMEM_REPORTING
+void node_set_perf_attrs(unsigned int nid, struct node_hmem_attrs *hmem_attrs,
+                        unsigned access);
+#else
+static inline void node_set_perf_attrs(unsigned int nid,
+                                      struct node_hmem_attrs *hmem_attrs,
+                                      unsigned access)
+{
+}
+#endif
+
 struct node {
        struct device   dev;
        struct list_head access_list;