Messages in this thread | ![/](/images/icornerl.gif) | | Subject | Re: [PATCH v4 3/5] perf stat: Helper functions for PCIe root ports list in iostat mode | From | Alexander Antonov <> | Date | Mon, 8 Feb 2021 14:58:17 +0300 |
| |
On 2/4/2021 3:32 PM, Namhyung Kim wrote: > On Wed, Feb 3, 2021 at 10:58 PM Alexander Antonov > <alexander.antonov@linux.intel.com> wrote: >> 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> >> --- >> tools/perf/arch/x86/util/iostat.c | 124 ++++++++++++++++++++++++++++++ >> 1 file changed, 124 insertions(+) >> create mode 100644 tools/perf/arch/x86/util/iostat.c >> >> diff --git a/tools/perf/arch/x86/util/iostat.c b/tools/perf/arch/x86/util/iostat.c >> new file mode 100644 >> index 000000000000..961e540106e6 >> --- /dev/null >> +++ b/tools/perf/arch/x86/util/iostat.c >> @@ -0,0 +1,124 @@ >> +// 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 struct iio_root_ports_list *iio_root_ports_list_new(void) >> +{ >> + struct iio_root_ports_list *list = calloc(1, sizeof(*list)); >> + >> + if (list) { >> + list->rps = calloc(1, sizeof(struct iio_root_port *)); > This seems unnecessary now. > > Thanks, > Namhyung >
Yes, you are right. Will be fixed.
Thank you, Alexander >> + if (!list->rps) { >> + free(list); >> + list = NULL; >> + } >> + } >> + return list; >> +} >> + >> +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; >> +} >> -- >> 2.19.1 >>
| ![\](/images/icornerr.gif) |