Em Tue, Feb 13, 2018 at 04:14:16PM +0100, Thomas Richter escreveu:
> When perf record ... is setup to record data, the s390
> cpu information was a fixed string "IBM/S390".
> 
> Replace this string with one containing more information
> about the machine. The information included in the cpuid is
> a comma separated list:
>    manufacturer,type,model-capacity,model[,version,authorization]
> with
> 
> - manufacturer: up to 16 byte name of the manufacturer (IBM).
> - type: a four digit number refering to the machine
>   generation.
> - model-capacitiy: up to 16 characters describing number
>   of cpus etc.
> - model: up to 16 characters describing model.
> - version: the CPU-MF counter facility version number,
>   available on LPARs only, omitted on z/VM guests.
> - authorization: the CPU-MF counter facility authorization level,
>   available on LPARs only, omitted on z/VM guests.
> 
> Before:
> [root@s8360047 perf]# ./perf record -- sleep 1
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.001 MB perf.data (4 samples) ]
> [root@s8360047 perf]# ./perf report --header | fgrep cpuid
>  # cpuid : IBM/S390
> [root@s8360047 perf]#


  49    38.13 ubuntu:16.04-x-s390           : FAIL s390x-linux-gnu-gcc (Ubuntu 
5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609


Humm, this seems to be the one causing this:

  LINK     /tmp/build/perf/plugin_hrtimer.so
  LINK     /tmp/build/perf/plugin_kmem.so
In file included from /usr/s390x-linux-gnu/include/string.h:635:0,
                 from arch/s390/util/header.c:16:
In function 'strncat',
    inlined from 'get_cpuid' at arch/s390/util/header.c:65:5:
/usr/s390x-linux-gnu/include/bits/string3.h:156:10: error: call to 
__builtin___strncat_chk might overflow destination buffer [-Werror]
   return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
          ^
In function 'strncat',
    inlined from 'get_cpuid' at arch/s390/util/header.c:72:5:
/usr/s390x-linux-gnu/include/bits/string3.h:156:10: error: call to 
__builtin___strncat_chk might overflow destination buffer [-Werror]
   return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
          ^
In function 'strncat',
    inlined from 'get_cpuid' at arch/s390/util/header.c:111:5:
/usr/s390x-linux-gnu/include/bits/string3.h:156:10: error: call to 
__builtin___strncat_chk might overflow destination buffer [-Werror]
   return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
          ^
In function 'strncat',
    inlined from 'get_cpuid' at arch/s390/util/header.c:117:5:
/usr/s390x-linux-gnu/include/bits/string3.h:156:10: error: call to 
__builtin___strncat_chk might overflow destination buffer [-Werror]
   return __builtin___strncat_chk (__dest, __src, __len, __bos (__dest));
          ^
  LINK     /tmp/build/perf/plugin_kvm.so
  MKDIR    /tmp/build/perf/arch/s390/util/
  LINK     /tmp/build/perf/plugin_mac80211.so
  CC       /tmp/build/perf/arch/s390/util/kvm-stat.o
  LINK     /tmp/build/perf/plugin_sched_switch.so
cc1: all warnings being treated as errors
mv: cannot stat '/tmp/build/perf/arch/s390/util/.header.o.tmp': No such file or 
directory
/git/linux/tools/build/Makefile.build:96: recipe for target 
'/tmp/build/perf/arch/s390/util/header.o' failed
make[6]: *** [/tmp/build/perf/arch/s390/util/header.o] Error 1
make[6]: *** Waiting for unfinished jobs....
  LINK     /tmp/build/perf/plugin_function.so

 
> After:
> [root@s35lp76 perf]# ./perf report --header|fgrep cpuid
>  # cpuid : IBM,3906,704,M03,3.5,002f
> [root@s35lp76 perf]#
> 
> Signed-off-by: Thomas Richter <[email protected]>
> Reviewed-by: Hendrik Brueckner <[email protected]>
> ---
>  tools/perf/arch/s390/util/header.c | 126 
> +++++++++++++++++++++++++++++++++++--
>  1 file changed, 121 insertions(+), 5 deletions(-)
> 
> diff --git a/tools/perf/arch/s390/util/header.c 
> b/tools/perf/arch/s390/util/header.c
> index 9fa6c3e5782c..3d29ba47edce 100644
> --- a/tools/perf/arch/s390/util/header.c
> +++ b/tools/perf/arch/s390/util/header.c
> @@ -1,8 +1,9 @@
>  /*
>   * Implementation of get_cpuid().
>   *
> - * Copyright 2014 IBM Corp.
> + * Copyright IBM Corp. 2014, 2018
>   * Author(s): Alexander Yarygin <[email protected]>
> + *         Thomas Richter <[email protected]>
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License (version 2 only)
> @@ -13,16 +14,131 @@
>  #include <unistd.h>
>  #include <stdio.h>
>  #include <string.h>
> +#include <ctype.h>
>  
>  #include "../../util/header.h"
> +#include "../../util/util.h"
> +
> +#define SYSINFO_MANU "Manufacturer:"
> +#define SYSINFO_TYPE "Type:"
> +#define SYSINFO_MODEL        "Model:"
> +#define SRVLVL_CPUMF "CPU-MF:"
> +#define SRVLVL_VERSION       "version="
> +#define SRVLVL_AUTHORIZATION "authorization="
> +#define SYSINFO              "/proc/sysinfo"
> +#define SRVLVL               "/proc/service_levels"
>  
>  int get_cpuid(char *buffer, size_t sz)
>  {
> -     const char *cpuid = "IBM/S390";
> +     char *cp, *line = NULL, *line2;
> +     char type[8], model[33], version[8], manufacturer[32], authorization[8];
> +     int read;
> +     unsigned long line_sz;
> +     size_t nbytes;
> +     FILE *sysinfo;
> +
> +     /*
> +      * Scan /proc/sysinfo line by line and read out values for
> +      * Manufacturer:, Type: and Model:, for example:
> +      * Manufacturer:    IBM
> +      * Type:            2964
> +      * Model:           702              N96
> +      * The first word is the Model Capacity and the second word is
> +      * Model (can be omitted). Both words have a maximum size of 16
> +      * bytes.
> +      */
> +     memset(manufacturer, 0, sizeof(manufacturer));
> +     memset(type, 0, sizeof(type));
> +     memset(model, 0, sizeof(model));
> +     memset(version, 0, sizeof(version));
> +     memset(authorization, 0, sizeof(authorization));
> +
> +     sysinfo = fopen(SYSINFO, "r");
> +     if (sysinfo == NULL)
> +             return -1;
> +
> +     while ((read = getline(&line, &line_sz, sysinfo)) != -1) {
> +             if (!strncmp(line, SYSINFO_MANU, strlen(SYSINFO_MANU))) {
> +                     line2 = line + strlen(SYSINFO_MANU);
> +
> +                     while ((cp = strtok_r(line2, "\n ", &line2)))
> +                             strncat(manufacturer, cp, sizeof(manufacturer));
> +             }
> +
> +             if (!strncmp(line, SYSINFO_TYPE, strlen(SYSINFO_TYPE))) {
> +                     line2 = line + strlen(SYSINFO_TYPE);
> +
> +                     while ((cp = strtok_r(line2, "\n ", &line2)))
> +                             strncat(type, cp, sizeof(type));
> +             }
> +
> +             if (!strncmp(line, SYSINFO_MODEL, strlen(SYSINFO_MODEL))) {
> +                     line2 = line + strlen(SYSINFO_MODEL);
> +
> +                     while ((cp = strtok_r(line2, "\n ", &line2))) {
> +                             if (model[0])
> +                                     strcat(model, ",");
> +                             if (strlen(model) + strlen(cp) < sizeof(model))
> +                                     strncat(model, cp, strlen(cp));
> +                     }
> +                     break;
> +             }
> +     }
> +     fclose(sysinfo);
>  
> -     if (strlen(cpuid) + 1 > sz)
> +     /* Missing manufacturer, type or model information should not happen */
> +     if (!manufacturer[0] || !type[0] || !model[0])
>               return -1;
>  
> -     strcpy(buffer, cpuid);
> -     return 0;
> +     /*
> +      * Scan /proc/service_levels and return the CPU-MF counter facility
> +      * version number and authorization level.
> +      * Optional, does not exist on z/VM guests.
> +      */
> +     sysinfo = fopen(SRVLVL, "r");
> +     if (sysinfo == NULL)
> +             goto skip_sysinfo;
> +     while ((read = getline(&line, &line_sz, sysinfo)) != -1) {
> +             if (strncmp(line, SRVLVL_CPUMF, strlen(SRVLVL_CPUMF)))
> +                     continue;
> +
> +             line2 = line + strlen(SRVLVL_CPUMF);
> +             while ((cp = strtok_r(line2, "\n ", &line2))) {
> +                     if (!strncmp(cp, SRVLVL_VERSION,
> +                                  strlen(SRVLVL_VERSION))) {
> +                             char *sep = strchr(cp, '=');
> +
> +                             strncat(version, sep + 1, sizeof(version));
> +                     }
> +                     if (!strncmp(cp, SRVLVL_AUTHORIZATION,
> +                                  strlen(SRVLVL_AUTHORIZATION))) {
> +                             char *sep = strchr(cp, '=');
> +
> +                             strncat(authorization, sep + 1,
> +                                     sizeof(authorization));
> +                     }
> +             }
> +     }
> +     fclose(sysinfo);
> +
> +skip_sysinfo:
> +     free(line);
> +
> +     if (version[0] && authorization[0] )
> +             nbytes = snprintf(buffer, sz, "%s,%s,%s,%s,%s",
> +                               manufacturer, type, model, version,
> +                               authorization);
> +     else
> +             nbytes = snprintf(buffer, sz, "%s,%s,%s", manufacturer, type,
> +                               model);
> +     return (nbytes >= sz) ? -1 : 0;
> +}
> +
> +char *get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
> +{
> +     char *buf = malloc(128);
> +
> +     if (buf && get_cpuid(buf, 128) < 0)
> +             zfree(&buf);
> +     return buf;
>  }
> -- 
> 2.14.3

Reply via email to