powerpc/perf/hv-24x7: Display domain indices in sysfs
authorSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Wed, 17 Feb 2016 01:07:51 +0000 (20:07 -0500)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 10 Mar 2016 11:57:22 +0000 (22:57 +1100)
To help users determine domains, display the domain indices used by the
kernel in sysfs.

$ cat /sys/bus/event_source/devices/hv_24x7/interface/domains
1: Physical Chip
2: Physical Core
3: VCPU Home Core
4: VCPU Home Chip
5: VCPU Home Node
6: VCPU Remote Node

Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/perf/hv-24x7.c
arch/powerpc/perf/hv-24x7.h

index 77b958f213a0340ecb9962d6f1d33c362d62bca5..36b29fd9295d81b6fea5e23febc453cbd44df9a5 100644 (file)
@@ -68,6 +68,24 @@ static bool is_physical_domain(unsigned domain)
        }
 }
 
+static const char *domain_name(unsigned domain)
+{
+       if (!domain_is_valid(domain))
+               return NULL;
+
+       switch (domain) {
+       case HV_PERF_DOMAIN_PHYS_CHIP:          return "Physical Chip";
+       case HV_PERF_DOMAIN_PHYS_CORE:          return "Physical Core";
+       case HV_PERF_DOMAIN_VCPU_HOME_CORE:     return "VCPU Home Core";
+       case HV_PERF_DOMAIN_VCPU_HOME_CHIP:     return "VCPU Home Chip";
+       case HV_PERF_DOMAIN_VCPU_HOME_NODE:     return "VCPU Home Node";
+       case HV_PERF_DOMAIN_VCPU_REMOTE_NODE:   return "VCPU Remote Node";
+       }
+
+       WARN_ON_ONCE(domain);
+       return NULL;
+}
+
 static bool catalog_entry_domain_is_valid(unsigned domain)
 {
        return is_physical_domain(domain);
@@ -969,6 +987,27 @@ e_free:
        return ret;
 }
 
+static ssize_t domains_show(struct device *dev, struct device_attribute *attr,
+                           char *page)
+{
+       int d, n, count = 0;
+       const char *str;
+
+       for (d = 0; d < HV_PERF_DOMAIN_MAX; d++) {
+               str = domain_name(d);
+               if (!str)
+                       continue;
+
+               n = sprintf(page, "%d: %s\n", d, str);
+               if (n < 0)
+                       break;
+
+               count += n;
+               page += n;
+       }
+       return count;
+}
+
 #define PAGE_0_ATTR(_name, _fmt, _expr)                                \
 static ssize_t _name##_show(struct device *dev,                        \
                            struct device_attribute *dev_attr,  \
@@ -997,6 +1036,7 @@ PAGE_0_ATTR(catalog_version, "%lld\n",
 PAGE_0_ATTR(catalog_len, "%lld\n",
                (unsigned long long)be32_to_cpu(page_0->length) * 4096);
 static BIN_ATTR_RO(catalog, 0/* real length varies */);
+static DEVICE_ATTR_RO(domains);
 
 static struct bin_attribute *if_bin_attrs[] = {
        &bin_attr_catalog,
@@ -1006,6 +1046,7 @@ static struct bin_attribute *if_bin_attrs[] = {
 static struct attribute *if_attrs[] = {
        &dev_attr_catalog_len.attr,
        &dev_attr_catalog_version.attr,
+       &dev_attr_domains.attr,
        NULL,
 };
 
index c57d67dc9f3f20426b1197d9155c9ea24134ab75..791455e7f5cf7a93cd38f6ab6afddb3dfba82eab 100644 (file)
@@ -7,6 +7,7 @@ enum hv_perf_domains {
 #define DOMAIN(n, v, x, c) HV_PERF_DOMAIN_##n = v,
 #include "hv-24x7-domains.h"
 #undef DOMAIN
+       HV_PERF_DOMAIN_MAX,
 };
 
 struct hv_24x7_request {