From 19bd024e92173e4482aea4d602f86e0ff444a0be Mon Sep 17 00:00:00 2001 From: Sebastien GODARD Date: Fri, 17 May 2019 15:19:18 +0200 Subject: [PATCH] sadf: PCP: Add support for A_PWR_USB activity Add metrics displayed by "sar -m USB" (USB devices) to PCP archive. Signed-off-by: Sebastien GODARD --- activity.c | 1 + pcp_def_metrics.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ pcp_def_metrics.h | 2 ++ pcp_stats.c | 45 +++++++++++++++++++++++++++++++++++++++++ pcp_stats.h | 2 ++ sadf_misc.c | 4 ++++ 6 files changed, 105 insertions(+) diff --git a/activity.c b/activity.c index 6404ede..8651bdb 100644 --- a/activity.c +++ b/activity.c @@ -1709,6 +1709,7 @@ struct activity pwr_usb_act = { .f_json_print = json_print_pwr_usb_stats, .f_svg_print = NULL, .f_raw_print = raw_print_pwr_usb_stats, + .f_pcp_print = pcp_print_pwr_usb_stats, .f_count_new = NULL, .item_list = NULL, .desc = "USB devices", diff --git a/pcp_def_metrics.c b/pcp_def_metrics.c index 4339385..cde34d1 100644 --- a/pcp_def_metrics.c +++ b/pcp_def_metrics.c @@ -1427,6 +1427,57 @@ void pcp_def_huge_metrics() #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Define PCP metrics for USB devices statistics. + * + * IN: + * @a Activity structure with statistics. + *************************************************************************** + */ +void pcp_def_pwr_usb_metrics(struct activity *a) +{ +#ifdef HAVE_PCP + int inst = 0; + static pmInDom indom = PM_INDOM_NULL; + char buf[16]; + + if (indom == PM_INDOM_NULL) { + /* Create domain */ + indom = pmInDom_build(0, PM_INDOM_USB); + + for (inst = 0; inst < a->item_list_sz; inst++) { + sprintf(buf, "usb%d", inst); + pmiAddInstance(indom,buf, inst); + } + } + + pmiAddMetric("power.usb.bus", + PM_IN_NULL, PM_TYPE_U32, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.usb.vendorId", + PM_IN_NULL, PM_TYPE_STRING, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.usb.productId", + PM_IN_NULL, PM_TYPE_STRING, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.usb.maxpower", + PM_IN_NULL, PM_TYPE_U32, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.usb.manufacturer", + PM_IN_NULL, PM_TYPE_STRING, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.usb.productName", + PM_IN_NULL, PM_TYPE_STRING, indom, PM_SEM_DISCRETE, + pmiUnits(0, 0, 0, 0, 0, 0)); +#endif /* HAVE_PCP */ +} + /* *************************************************************************** * Define PCP metrics for filesystem statistics. diff --git a/pcp_def_metrics.h b/pcp_def_metrics.h index 981d8a1..15a4875 100644 --- a/pcp_def_metrics.h +++ b/pcp_def_metrics.h @@ -40,6 +40,7 @@ void pcp_def_net_icmp6_metrics(void); void pcp_def_net_eicmp6_metrics(void); void pcp_def_net_udp6_metrics(void); void pcp_def_huge_metrics(void); +void pcp_def_pwr_usb_metrics(struct activity *); void pcp_def_filesystem_metrics(struct activity *); void pcp_def_fchost_metrics(struct activity *); @@ -51,6 +52,7 @@ void pcp_def_fchost_metrics(struct activity *); #define PM_INDOM_INT 4 #define PM_INDOM_FILESYSTEM 5 #define PM_INDOM_FCHOST 6 +#define PM_INDOM_USB 7 #endif /* _PCP_DEF_METRICS_H */ diff --git a/pcp_stats.c b/pcp_stats.c index cf47962..935042d 100644 --- a/pcp_stats.c +++ b/pcp_stats.c @@ -1772,6 +1772,51 @@ __print_funct_t pcp_print_huge_stats(struct activity *a, int curr, unsigned long #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Display USB devices in PCP format. + * + * IN: + * @a Activity structure with statistics. + * @curr Index in array for current sample statistics. + * @itv Interval of time in 1/100th of a second. + * @record_hdr Record header for current sample. + *************************************************************************** + */ +__print_funct_t pcp_print_pwr_usb_stats(struct activity *a, int curr, unsigned long long itv, + struct record_header *record_hdr) +{ +#ifdef HAVE_PCP + int i; + struct stats_pwr_usb *suc; + char buf[64], instance[32]; + + for (i = 0; i < a->nr[curr]; i++) { + + suc = (struct stats_pwr_usb *) ((char *) a->buf[curr] + i * a->msize); + sprintf(instance, "usb%d", i); + + snprintf(buf, sizeof(buf), "%d", suc->bus_nr); + pmiPutValue("power.usb.bus", instance, buf); + + snprintf(buf, sizeof(buf), "%x", suc->vendor_id); + pmiPutValue("power.usb.vendorId", instance, buf); + + snprintf(buf, sizeof(buf), "%x", suc->product_id); + pmiPutValue("power.usb.productId", instance, buf); + + snprintf(buf, sizeof(buf), "%u", suc->bmaxpower << 1); + pmiPutValue("power.usb.maxpower", instance, buf); + + snprintf(buf, sizeof(buf), "%s", suc->manufacturer); + pmiPutValue("power.usb.manufacturer", instance, buf); + + snprintf(buf, sizeof(buf), "%s", suc->product); + pmiPutValue("power.usb.productName", instance, buf); + } +#endif /* HAVE_PCP */ +} + /* *************************************************************************** * Display filesystem statistics in PCP format. diff --git a/pcp_stats.h b/pcp_stats.h index 073d111..79e1e60 100644 --- a/pcp_stats.h +++ b/pcp_stats.h @@ -73,6 +73,8 @@ __print_funct_t pcp_print_pwr_cpufreq_stats (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_huge_stats (struct activity *, int, unsigned long long, struct record_header *); +__print_funct_t pcp_print_pwr_usb_stats + (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_filesystem_stats (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_fchost_stats diff --git a/sadf_misc.c b/sadf_misc.c index 35000d5..7e33f6f 100644 --- a/sadf_misc.c +++ b/sadf_misc.c @@ -765,6 +765,10 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act pcp_def_huge_metrics(); break; + case A_PWR_USB: + pcp_def_pwr_usb_metrics(act[p]); + break; + case A_FS: pcp_def_filesystem_metrics(act[p]); break; -- 2.40.0