&nd_region_attribute_group,
        &nd_mapping_attribute_group,
        &nd_device_attribute_group,
+       &nd_numa_attribute_group,
        &acpi_nfit_region_attribute_group,
        NULL,
 };
 
 static const struct attribute_group *nd_btt_attribute_groups[] = {
        &nd_btt_attribute_group,
        &nd_device_attribute_group,
+       &nd_numa_attribute_group,
        NULL,
 };
 
 
 };
 EXPORT_SYMBOL_GPL(nd_device_attribute_group);
 
+static ssize_t numa_node_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%d\n", dev_to_node(dev));
+}
+static DEVICE_ATTR_RO(numa_node);
+
+static struct attribute *nd_numa_attributes[] = {
+       &dev_attr_numa_node.attr,
+       NULL,
+};
+
+static umode_t nd_numa_attr_visible(struct kobject *kobj, struct attribute *a,
+               int n)
+{
+       if (!IS_ENABLED(CONFIG_NUMA))
+               return 0;
+
+       return a->mode;
+}
+
+/**
+ * nd_numa_attribute_group - NUMA attributes for all devices on an nd bus
+ */
+struct attribute_group nd_numa_attribute_group = {
+       .attrs = nd_numa_attributes,
+       .is_visible = nd_numa_attr_visible,
+};
+EXPORT_SYMBOL_GPL(nd_numa_attribute_group);
+
 int nvdimm_bus_create_ndctl(struct nvdimm_bus *nvdimm_bus)
 {
        dev_t devt = MKDEV(nvdimm_bus_major, nvdimm_bus->id);
 
 static const struct attribute_group *nd_namespace_attribute_groups[] = {
        &nd_device_attribute_group,
        &nd_namespace_attribute_group,
+       &nd_numa_attribute_group,
        NULL,
 };
 
 
 extern struct attribute_group nvdimm_bus_attribute_group;
 extern struct attribute_group nvdimm_attribute_group;
 extern struct attribute_group nd_device_attribute_group;
+extern struct attribute_group nd_numa_attribute_group;
 extern struct attribute_group nd_region_attribute_group;
 extern struct attribute_group nd_mapping_attribute_group;