mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 12:14:06 +00:00
perf stat: Helper functions for PCIe root ports list in iostat mode
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>
This commit is contained in:
parent
f07952b179
commit
19776d3ced
1 changed files with 110 additions and 0 deletions
110
tools/perf/arch/x86/util/iostat.c
Normal file
110
tools/perf/arch/x86/util/iostat.c
Normal file
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue