Received: by 10.213.65.68 with SMTP id h4csp1240109imn; Wed, 14 Mar 2018 14:00:39 -0700 (PDT) X-Google-Smtp-Source: AG47ELun87HqaqWMvvqc4V5JENp2YpzZZx9bX8taZSlGWiBVwMv7ZJsOXvAJGIsKMRNQj5Q8XTR4 X-Received: by 2002:a17:902:22a:: with SMTP id 39-v6mr5429527plc.128.1521061238964; Wed, 14 Mar 2018 14:00:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521061238; cv=none; d=google.com; s=arc-20160816; b=UeIM8qHo/4eNJuW18nxY7X/ufsCcucogi73R48v4ABtgaJU5ai1lRg2MZ7YdbfwEAN B4pCZvbHd2js99TwWyHnaKJbKA1zsF7+b4GjijsGLtZrSX2e+lq27CNOdaftMNe2SiBt X+NnWOqVYPxvHtjXrI+HdbETaLN7rkFNQ6mgmCOxFoCz4T3DN8HoBIHs0RKrFwzrBVZZ iu+7E9kRTKP/xUJx8A0EHgKgeXOrhb93tgu0gIcQtyCUSIlqlyO8sk0zDE9czzsBtPnp eR85cLS/QNP+ZyR3NJralZeinrKnGZ7BGwb2SuiI+VuBN6qUYqkFeL0WanWyB20jZnNA h+hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=PFz91TWqIJjx2oulzrYZtQOG1kmC8I/Nh7RIKzkxezc=; b=SFLC+Ch1RSQUMLhBZAUukdtjbWeEyE5zA+L9hobRwkCakJTSaG1Laa7+zZ4CTOpymf rYNH++KKtxYJsiF+Blk6UPVrzynjJ0qpoIdoBhl2XlGFMk5MpqYSXw6nsTDao5fBjadU U5uHveurbseK07uAR4kEAsEwmpXLvDuVn2z2ttoGjhC2m31zlckHlcoabgTKWFL4QG2V E/lX3hhDM7wxDMJrzLjMMcttkdfeT6mWa65+0xA7T9q2UiTtOjCa3pitKwHH7UnDipUJ kxY0cWF78Umn0LEBKRomnKmeP6SJ52Zy0zD6Adi6zIUeLqRt3ltzMFyF3K3yz05b9cPn L3Dw== 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 m3-v6si2624015pld.351.2018.03.14.14.00.24; Wed, 14 Mar 2018 14:00:38 -0700 (PDT) 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 S1752003AbeCNU7E (ORCPT + 99 others); Wed, 14 Mar 2018 16:59:04 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:6234 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751780AbeCNU7B (ORCPT ); Wed, 14 Mar 2018 16:59:01 -0400 Received: from DGGEMS402-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 3B27F485741AD; Thu, 15 Mar 2018 04:58:47 +0800 (CST) Received: from [127.0.0.1] (10.47.95.230) by DGGEMS402-HUB.china.huawei.com (10.3.19.202) with Microsoft SMTP Server id 14.3.361.1; Thu, 15 Mar 2018 04:58:40 +0800 Subject: Re: [PATCH] perf vendor events: fix processing for xfs To: Arnaldo Carvalho de Melo References: <1521047452-28565-1-git-send-email-john.garry@huawei.com> <20180314185355.GC27335@kernel.org> <20180314202643.GG27335@kernel.org> CC: , , , , , , , , , From: John Garry Message-ID: <4f8d9085-8415-5b99-daee-34994ae95cb1@huawei.com> Date: Wed, 14 Mar 2018 20:58:33 +0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <20180314202643.GG27335@kernel.org> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.47.95.230] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 14/03/2018 20:26, Arnaldo Carvalho de Melo wrote: > Em Wed, Mar 14, 2018 at 07:39:25PM +0000, John Garry escreveu: >> On 14/03/2018 18:53, Arnaldo Carvalho de Melo wrote: >>> Em Thu, Mar 15, 2018 at 01:10:52AM +0800, John Garry escreveu: >>>> In the recently introduced support for vendor subdirectory, >>>> the checking for directory entries under xfs (or any other fs >>>> which does not support dirent.d_type) is missing the check >>>> for links for current and parent directory. This can result >>>> in a broken pmu_events.c being generated. >>>> >>>> Fix this by adding the appropriate check in is_leaf_dir(). >>> >>> So I'll lookup the patch that introduced the patch and squash this one >>> with it, so that we don't break 'git bisect' on ppc. >> >> Right, so it's going to be "perf vendor events: add support for pmu events >> vendor subdirectory". >> >> BTW, I don't think it's specifically ppc which was broken, but just when >> building from xfs. >> >> Much appreciated, >> John > > This is the ammended cset, and yes, I mentioned just XFS not ppc, added > Sukadev to the CC list and the link to your patch that he tested. Also > stamped his Tested-by there. > > This will all go again the container build test set before a new pull > req to Ingo, where I'll avoid sending the previous 31 patches to the > mailing list, just the ones that came after it, as perf/core keeps > growing :-) It looks ok, Thanks a lot, John > > - Arnaldo > > commit d24081387a00d2e10789eb012429144c549598be > Author: John Garry > Date: Thu Mar 8 18:58:29 2018 +0800 > > perf vendor events: Add support for pmu events vendor subdirectory > > For some architectures (like arm), it is required to support a vendor > subdirectory and not locate all the JSONs for a specific vendor in the > same folder. > > This is because all the events for the same vendor will be placed in the > same pmu events table, which may cause conflict. This conflict would be > in the instance that a vendor's custom implemented events do have the > same meaning on different platforms, so events in the pmu table would > conflict. In addition, per list command may show events which are not > even supported for a given platform. > > This patch adds support for a arch/vendor/platform directory hierarchy, > while maintaining backwards-compatibility for existing arch/platform > structure. In this, each platform would always have its own pmu events > table. > > In generated file pmu_events.c, each platform table name is in the > format pme{_vendor}_platform, like this: > > struct pmu_events_map pmu_events_map[] = { > { > .cpuid = "0x00000000420f5160", > .version = "v1", > .type = "core", > .table = pme_cavium_thunderx2 > }, > { > .cpuid = 0, > .version = 0, > .type = 0, > .table = 0, > }, > }; > > Signed-off-by: John Garry > Acked-by: Jiri Olsa > Tested-by: Sukadev Bhattiprolu > Cc: Alexander Shishkin > Cc: Andi Kleen > Cc: Ganapatrao Kulkarni > Cc: Namhyung Kim > Cc: Peter Zijlstra > Cc: Shaokun Zhang > Cc: Sukadev Bhattiprolu > Cc: Will Deacon > Cc: William Cohen > Cc: linux-arm-kernel@lists.infradead.org > Cc: linuxarm@huawei.com > Link: http://lkml.kernel.org/r/1520506716-197429-5-git-send-email-john.garry@huawei.com > Link: http://lkml.kernel.org/r/1521047452-28565-1-git-send-email-john.garry@huawei.com > [ Add missing limits.h include, fixing the build on at least all Alpine Linux versions tested (3.4 to 3.7 + edge), ] > [ Applied a patch to fix reading ./.. directories in XFS, see second Link tag ] > Signed-off-by: Arnaldo Carvalho de Melo > > diff --git a/tools/perf/pmu-events/README b/tools/perf/pmu-events/README > index 2407abc1d441..655286ff8767 100644 > --- a/tools/perf/pmu-events/README > +++ b/tools/perf/pmu-events/README > @@ -28,6 +28,10 @@ sub directory. Thus for the Silvermont X86 CPU: > Cache.json Memory.json Virtual-Memory.json > Frontend.json Pipeline.json > > +The JSONs folder for a CPU model/family may be placed in the root arch > +folder, or may be placed in a vendor sub-folder under the arch folder > +for instances where the arch and vendor are not the same. > + > Using the JSON files and the mapfile, 'jevents' generates the C source file, > 'pmu-events.c', which encodes the two sets of tables: > > diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c > index 1d02fafdc34d..0981d313064f 100644 > --- a/tools/perf/pmu-events/jevents.c > +++ b/tools/perf/pmu-events/jevents.c > @@ -39,6 +39,7 @@ > #include > #include > #include > +#include > #include > #include /* getrlimit */ > #include /* getrlimit */ > @@ -572,7 +573,7 @@ static char *file_name_to_table_name(char *fname) > * Derive rest of table name from basename of the JSON file, > * replacing hyphens and stripping out .json suffix. > */ > - n = asprintf(&tblname, "pme_%s", basename(fname)); > + n = asprintf(&tblname, "pme_%s", fname); > if (n < 0) { > pr_info("%s: asprintf() error %s for file %s\n", prog, > strerror(errno), fname); > @@ -582,7 +583,7 @@ static char *file_name_to_table_name(char *fname) > for (i = 0; i < strlen(tblname); i++) { > c = tblname[i]; > > - if (c == '-') > + if (c == '-' || c == '/') > tblname[i] = '_'; > else if (c == '.') { > tblname[i] = '\0'; > @@ -739,25 +740,80 @@ static int get_maxfds(void) > static FILE *eventsfp; > static char *mapfile; > > +static int is_leaf_dir(const char *fpath) > +{ > + DIR *d; > + struct dirent *dir; > + int res = 1; > + > + d = opendir(fpath); > + if (!d) > + return 0; > + > + while ((dir = readdir(d)) != NULL) { > + if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) > + continue; > + > + if (dir->d_type == DT_DIR) { > + res = 0; > + break; > + } else if (dir->d_type == DT_UNKNOWN) { > + char path[PATH_MAX]; > + struct stat st; > + > + sprintf(path, "%s/%s", fpath, dir->d_name); > + if (stat(path, &st)) > + break; > + > + if (S_ISDIR(st.st_mode)) { > + res = 0; > + break; > + } > + } > + } > + > + closedir(d); > + > + return res; > +} > + > static int process_one_file(const char *fpath, const struct stat *sb, > int typeflag, struct FTW *ftwbuf) > { > - char *tblname, *bname = (char *) fpath + ftwbuf->base; > + char *tblname, *bname; > int is_dir = typeflag == FTW_D; > int is_file = typeflag == FTW_F; > int level = ftwbuf->level; > int err = 0; > > + if (level == 2 && is_dir) { > + /* > + * For level 2 directory, bname will include parent name, > + * like vendor/platform. So search back from platform dir > + * to find this. > + */ > + bname = (char *) fpath + ftwbuf->base - 2; > + for (;;) { > + if (*bname == '/') > + break; > + bname--; > + } > + bname++; > + } else > + bname = (char *) fpath + ftwbuf->base; > + > pr_debug("%s %d %7jd %-20s %s\n", > is_file ? "f" : is_dir ? "d" : "x", > level, sb->st_size, bname, fpath); > > - /* base dir */ > - if (level == 0) > + /* base dir or too deep */ > + if (level == 0 || level > 3) > return 0; > > + > /* model directory, reset topic */ > - if (level == 1 && is_dir) { > + if ((level == 1 && is_dir && is_leaf_dir(fpath)) || > + (level == 2 && is_dir)) { > if (close_table) > print_events_table_suffix(eventsfp); > > > . >