Received: by 10.223.185.116 with SMTP id b49csp1041472wrg; Fri, 16 Feb 2018 11:19:29 -0800 (PST) X-Google-Smtp-Source: AH8x224IgpXvG6JnHzDWR+uiWQ/WgpkKsq7k6btM1yJOoc2yBfcXmY3turfawYiMQaI3+FVRdMOF X-Received: by 10.98.198.1 with SMTP id m1mr6895578pfg.90.1518808769265; Fri, 16 Feb 2018 11:19:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518808769; cv=none; d=google.com; s=arc-20160816; b=GANAQg72TA9erZ38VWbwu+NSWFBeGxRSqYJXhYoiB2jOFD8rSb8dCkS4JGCYgXuuAe OqVX2vVGtNEYr9W9lVrwkkk4LaUCOa4oD4i/SblQL2/PC3AZr81bXFUCAreb/yO2oO+v A0JdJb8YYTVJ0eIko5H0MpxOYTQTWopi9jNkWH+QdMHVi5B0QD78/tg0zA+M2HROxxmT GgBntpt/BtoidPW1NAikjHeApd1eJzaZ/+1taA8byh+hf0zrdXNjR60EsfI/jIYRh8Ap t5U1gMWoJtiJsHXZiAZqccEncImewun+FdSt72k8ZBoKF7OXN83E0jFGW/shggljVNtx EQpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dmarc-filter:arc-authentication-results; bh=wU+G+zIFqqduezfqMKA4q23dYozIb43ZyMelg0N6Ar8=; b=pyJxP7JDlPKiiUfVTeWH2hf6VkB1nBIJtHEW71aOc3jXC7SD7qmwaBEgw9Ejb/Sw6j 3D9qTYnHlEcaIB0ClSOgbGUSulO9fFUfsu+nfckkabRPSe0zptOWD8lp0+cg54LouPSI +xUFWdWM0Mg8c+16L1BfJTeh3Am2OjsxG7jCzEZnh5ehmm0i6NU/WIvyxMPapgwvhEyz g/1NNrmwcyi2D1eM3tEClrptlbXQFJpgjvceqzG42gNtDiPhCGeZDuHkEOjyjggnIUa0 0GfSQyL/PqPHsnoZ+QmJlDFEuhVGA6ikut9wOxy3e/TBbX2/QHEuMfYBoD7r54oqzKRx Hqzw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p33-v6si2412210pld.310.2018.02.16.11.19.14; Fri, 16 Feb 2018 11:19:29 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161646AbeBPQzu (ORCPT + 99 others); Fri, 16 Feb 2018 11:55:50 -0500 Received: from mail.kernel.org ([198.145.29.99]:32792 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161053AbeBPQzs (ORCPT ); Fri, 16 Feb 2018 11:55:48 -0500 Received: from jouet.infradead.org (unknown [179.97.41.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5CFDB217C1; Fri, 16 Feb 2018 16:55:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5CFDB217C1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=acme@kernel.org Received: by jouet.infradead.org (Postfix, from userid 1000) id 11D0C1450DD; Fri, 16 Feb 2018 13:55:44 -0300 (-03) Date: Fri, 16 Feb 2018 13:55:43 -0300 From: Arnaldo Carvalho de Melo To: Thomas Richter Cc: linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, brueckner@linux.vnet.ibm.com, schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com Subject: Re: [PATCH 1/4] perf record: Provide detailed information on s390 CPU Message-ID: <20180216165543.GE24436@kernel.org> References: <20180213151419.80737-1-tmricht@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180213151419.80737-1-tmricht@linux.vnet.ibm.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.9.1 (2017-09-22) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > Reviewed-by: Hendrik Brueckner > --- > 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 > + * Thomas Richter > * > * 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 > #include > #include > +#include > > #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