lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 25 Oct 2023 10:00:38 -0700
From:   Namhyung Kim <namhyung@...il.com>
To:     Thomas Richter <tmricht@...ux.ibm.com>
Cc:     linux-kernel@...r.kernel.org, linux-perf-users@...r.kernel.org,
        acme@...nel.org, svens@...ux.ibm.com, gor@...ux.ibm.com,
        sumanthk@...ux.ibm.com, hca@...ux.ibm.com
Subject: Re: [PATCH] perf report: Add s390 raw data interpretation for PAI counters

Hello,

On Tue, Oct 24, 2023 at 2:17 AM Thomas Richter <tmricht@...ux.ibm.com> wrote:
>
> commit 1bf54f32f525 ("s390/pai: Add support for cryptography counters")
> added support for Processor Activity Instrumentation Facility (PAI)
> counters.  These counters values are added as raw data with the perf
> sample during perf record.
> Now add support to display these counters in perf report command.
> The counter number, its assigned name and value is now printed in
> addition to the hexadecimal output.
>
> Output before:
>  # perf report -D
>
>  6 514766399626050 0x7b058 [0x48]: PERF_RECORD_SAMPLE(IP, 0x1):
>                                 303977/303977: 0 period: 1 addr: 0
>  ... thread: paitest:303977
>  ...... dso: <not found>
>
>  0x7b0a0@...ot/perf.data.paicrypto [0x48]: event: 9
>  .
>  . ... raw event: size 72 bytes
>  . 0000:  00 00 00 09 00 01 00 48 00 00 00 00 00 00 00 00  .......H........
>  . 0010:  00 04 a3 69 00 04 a3 69 00 01 d4 2d 76 de a0 bb  ...i...i...-v...
>  . 0020:  00 00 00 00 00 01 5c 53 00 00 00 06 00 00 00 00  ......\S........
>  . 0030:  00 00 00 00 00 00 00 01 00 00 00 0c 00 07 00 00  ................
>  . 0040:  00 00 00 53 96 af 00 00                          ...S....
>
> Output after:
>  # perf report -D
>
>  6 514766399626050 0x7b058 [0x48]: PERF_RECORD_SAMPLE(IP, 0x1):
>                                 303977/303977: 0 period: 1 addr: 0
>  ... thread: paitest:303977
>  ...... dso: <not found>
>
>  0x7b0a0@...ot/perf.data.paicrypto [0x48]: event: 9
>  .
>  . ... raw event: size 72 bytes
>  . 0000:  00 00 00 09 00 01 00 48 00 00 00 00 00 00 00 00  .......H........
>  . 0010:  00 04 a3 69 00 04 a3 69 00 01 d4 2d 76 de a0 bb  ...i...i...-v...
>  . 0020:  00 00 00 00 00 01 5c 53 00 00 00 06 00 00 00 00  ......\S........
>  . 0030:  00 00 00 00 00 00 00 01 00 00 00 0c 00 07 00 00  ................
>  . 0040:  00 00 00 53 96 af 00 00                          ...S....
>
>         Counter:007 km_aes_128 Value:0x00000000005396af     <--- new
>
> Signed-off-by: Thomas Richter <tmricht@...ux.ibm.com>
> ---
>  tools/perf/util/s390-cpumcf-kernel.h |  2 +
>  tools/perf/util/s390-sample-raw.c    | 89 ++++++++++++++++++++++++++--
>  2 files changed, 85 insertions(+), 6 deletions(-)
>
> diff --git a/tools/perf/util/s390-cpumcf-kernel.h b/tools/perf/util/s390-cpumcf-kernel.h
> index f55ca07f3ca1..74b36644e384 100644
> --- a/tools/perf/util/s390-cpumcf-kernel.h
> +++ b/tools/perf/util/s390-cpumcf-kernel.h
> @@ -12,6 +12,8 @@
>  #define        S390_CPUMCF_DIAG_DEF    0xfeef  /* Counter diagnostic entry ID */
>  #define        PERF_EVENT_CPUM_CF_DIAG 0xBC000 /* Event: Counter sets */
>  #define PERF_EVENT_CPUM_SF_DIAG        0xBD000 /* Event: Combined-sampling */
> +#define PERF_EVENT_PAI_CRYPTO_ALL      0x1000 /* Event: CRYPTO_ALL */
> +#define PERF_EVENT_PAI_NNPA_ALL        0x1800 /* Event: NNPA_ALL */
>
>  struct cf_ctrset_entry {       /* CPU-M CF counter set entry (8 byte) */
>         unsigned int def:16;    /* 0-15  Data Entry Format */
> diff --git a/tools/perf/util/s390-sample-raw.c b/tools/perf/util/s390-sample-raw.c
> index 115b16edb451..f360aed3bf0a 100644
> --- a/tools/perf/util/s390-sample-raw.c
> +++ b/tools/perf/util/s390-sample-raw.c
> @@ -125,6 +125,9 @@ static int get_counterset_start(int setnr)
>                 return 128;
>         case CPUMF_CTR_SET_MT_DIAG:             /* Diagnostic counter set */
>                 return 448;
> +       case PERF_EVENT_PAI_NNPA_ALL:           /* PAI NNPA counter set */
> +       case PERF_EVENT_PAI_CRYPTO_ALL:         /* PAI CRYPTO counter set */
> +               return setnr;
>         default:
>                 return -1;
>         }
> @@ -212,27 +215,101 @@ static void s390_cpumcfdg_dump(struct perf_pmu *pmu, struct perf_sample *sample)
>         }
>  }
>
> +/*
> + * Check for consistency of PAI_CRYPTO/PAI_NNPA raw data.
> + */
> +struct pai_data {              /* Event number and value */
> +       u16 event_nr;
> +       u64 event_val;
> +} __packed;
> +
> +/*
> + * Test for valid raw data. At least one PAI event should be in the raw
> + * data section.
> + */
> +static bool s390_pai_all_test(struct perf_sample *sample)
> +{
> +       unsigned char *buf = sample->raw_data;
> +       size_t len = sample->raw_size;
> +
> +       if (len < 0xa || !buf)
> +               return false;
> +       return true;
> +}
> +
> +static void s390_pai_all_dump(struct evsel *evsel, struct perf_sample *sample)
> +{
> +       size_t len = sample->raw_size, offset = 0;
> +       unsigned char *p = sample->raw_data;
> +       const char *color = PERF_COLOR_BLUE;
> +       struct pai_data pai_data;
> +       char *ev_name;
> +
> +       evsel->pmu = perf_pmus__find_by_type(evsel->core.attr.type);

Does it need to find evsel->pmu everytime?

Thanks,
Namhyung


> +       while (offset < len) {
> +               memcpy(&pai_data.event_nr, p, sizeof(pai_data.event_nr));
> +               pai_data.event_nr = be16_to_cpu(pai_data.event_nr);
> +               p += sizeof(pai_data.event_nr);
> +               offset += sizeof(pai_data.event_nr);
> +
> +               memcpy(&pai_data.event_val, p, sizeof(pai_data.event_val));
> +               pai_data.event_val = be64_to_cpu(pai_data.event_val);
> +               p += sizeof(pai_data.event_val);
> +               offset += sizeof(pai_data.event_val);
> +
> +               ev_name = get_counter_name(evsel->core.attr.config,
> +                                          pai_data.event_nr, evsel->pmu);
> +               color_fprintf(stdout, color, "\tCounter:%03d %s Value:%#018lx\n",
> +                             pai_data.event_nr, ev_name ?: "<unknown>",
> +                             pai_data.event_val);
> +
> +               if (offset + 0xa > len)
> +                       break;
> +       }
> +       color_fprintf(stdout, color, "\n");
> +}
> +
>  /* S390 specific trace event function. Check for PERF_RECORD_SAMPLE events
>   * and if the event was triggered by a counter set diagnostic event display
>   * its raw data.
>   * The function is only invoked when the dump flag -D is set.
>   */
> -void evlist__s390_sample_raw(struct evlist *evlist, union perf_event *event, struct perf_sample *sample)
> +void evlist__s390_sample_raw(struct evlist *evlist, union perf_event *event,
> +                            struct perf_sample *sample)
>  {
> +       const char *pai_name;
>         struct evsel *evsel;
>
>         if (event->header.type != PERF_RECORD_SAMPLE)
>                 return;
>
>         evsel = evlist__event2evsel(evlist, event);
> -       if (evsel == NULL ||
> -           evsel->core.attr.config != PERF_EVENT_CPUM_CF_DIAG)
> +       if (evsel == NULL)
>                 return;
>
>         /* Display raw data on screen */
> -       if (!s390_cpumcfdg_testctr(sample)) {
> -               pr_err("Invalid counter set data encountered\n");
> +       if (evsel->core.attr.config == PERF_EVENT_CPUM_CF_DIAG) {
> +               evsel->pmu = perf_pmus__find("cpum_cf");
> +               if (!s390_cpumcfdg_testctr(sample))
> +                       pr_err("Invalid counter set data encountered\n");
> +               else
> +                       s390_cpumcfdg_dump(evsel->pmu, sample);
>                 return;
>         }
> -       s390_cpumcfdg_dump(evsel->pmu, sample);
> +
> +       switch (evsel->core.attr.config) {
> +       case PERF_EVENT_PAI_NNPA_ALL:
> +               pai_name = "NNPA_ALL";
> +               break;
> +       case PERF_EVENT_PAI_CRYPTO_ALL:
> +               pai_name = "CRYPTO_ALL";
> +               break;
> +       default:
> +               return;
> +       }
> +
> +       if (!s390_pai_all_test(sample))
> +               pr_err("Invalid %s raw data encountered\n", pai_name);
> +       else
> +               s390_pai_all_dump(evsel, sample);
>  }
> --
> 2.41.0
>
>

Powered by blists - more mailing lists