perf stat: Helper functions for PCIe root ports list in iostat mode
authorAlexander Antonov <alexander.antonov@linux.intel.com>
Mon, 19 Apr 2021 09:41:45 +0000 (12:41 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 20 Apr 2021 11:40:20 +0000 (08:40 -0300)
Introduce helper functions to control PCIe root ports list.
These helpers will be used in the follow-up patch.

Signed-off-by: Alexander Antonov <alexander.antonov@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey V Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210419094147.15909-3-alexander.antonov@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/arch/x86/util/iostat.c [new file with mode: 0644]

diff --git a/tools/perf/arch/x86/util/iostat.c b/tools/perf/arch/x86/util/iostat.c
new file mode 100644 (file)
index 0000000..c4471f8
--- /dev/null
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * perf iostat
+ *
+ * Copyright (C) 2020, Intel Corporation
+ *
+ * Authors: Alexander Antonov <alexander.antonov@linux.intel.com>
+ */
+
+#include <api/fs/fs.h>
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <regex.h>
+#include "util/cpumap.h"
+#include "util/debug.h"
+#include "util/iostat.h"
+#include "util/counts.h"
+#include "path.h"
+
+struct iio_root_port {
+       u32 domain;
+       u8 bus;
+       u8 die;
+       u8 pmu_idx;
+       int idx;
+};
+
+struct iio_root_ports_list {
+       struct iio_root_port **rps;
+       int nr_entries;
+};
+
+static void iio_root_port_show(FILE *output,
+                              const struct iio_root_port * const rp)
+{
+       if (output && rp)
+               fprintf(output, "S%d-uncore_iio_%d<%04x:%02x>\n",
+                       rp->die, rp->pmu_idx, rp->domain, rp->bus);
+}
+
+static struct iio_root_port *iio_root_port_new(u32 domain, u8 bus,
+                                              u8 die, u8 pmu_idx)
+{
+       struct iio_root_port *p = calloc(1, sizeof(*p));
+
+       if (p) {
+               p->domain = domain;
+               p->bus = bus;
+               p->die = die;
+               p->pmu_idx = pmu_idx;
+       }
+       return p;
+}
+
+static void iio_root_ports_list_free(struct iio_root_ports_list *list)
+{
+       int idx;
+
+       if (list) {
+               for (idx = 0; idx < list->nr_entries; idx++)
+                       free(list->rps[idx]);
+               free(list->rps);
+               free(list);
+       }
+}
+
+static struct iio_root_port *iio_root_port_find_by_notation(
+       const struct iio_root_ports_list * const list, u32 domain, u8 bus)
+{
+       int idx;
+       struct iio_root_port *rp;
+
+       if (list) {
+               for (idx = 0; idx < list->nr_entries; idx++) {
+                       rp = list->rps[idx];
+                       if (rp && rp->domain == domain && rp->bus == bus)
+                               return rp;
+               }
+       }
+       return NULL;
+}
+
+static int iio_root_ports_list_insert(struct iio_root_ports_list *list,
+                                     struct iio_root_port * const rp)
+{
+       struct iio_root_port **tmp_buf;
+
+       if (list && rp) {
+               rp->idx = list->nr_entries++;
+               tmp_buf = realloc(list->rps,
+                                 list->nr_entries * sizeof(*list->rps));
+               if (!tmp_buf) {
+                       pr_err("Failed to realloc memory\n");
+                       return -ENOMEM;
+               }
+               tmp_buf[rp->idx] = rp;
+               list->rps = tmp_buf;
+       }
+       return 0;
+}