lkml.org 
[lkml]   [2017]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 10/14] perf evsel: Do not put a variable sized type not at the end of a struct
    Date
    From: Arnaldo Carvalho de Melo <acme@redhat.com>

    As this is a GNU extension and while harmless in this case, we can do
    the same thing in a more clearer way by using a existing thread_map and
    cpu_map constructors:

    With this we avoid this while compiling with clang:

    util/evsel.c:1659:17: error: field 'map' with variable sized type 'struct cpu_map' not at the end of a struct or class is a GNU extension
    [-Werror,-Wgnu-variable-sized-type-not-at-end]
    struct cpu_map map;
    ^
    util/evsel.c:1667:20: error: field 'map' with variable sized type 'struct thread_map' not at the end of a struct or class is a GNU extension
    [-Werror,-Wgnu-variable-sized-type-not-at-end]
    struct thread_map map;
    ^
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Wang Nan <wangnan0@huawei.com>
    Link: http://lkml.kernel.org/n/tip-207juvrqjiar7uvas2s83v5i@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/evsel.c | 62 ++++++++++++++++++++++---------------------------
    1 file changed, 28 insertions(+), 34 deletions(-)

    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index cd2fb42e5dd4..ac59710b79e0 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -1448,8 +1448,8 @@ static bool ignore_missing_thread(struct perf_evsel *evsel,
    return true;
    }

    -static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
    - struct thread_map *threads)
    +int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
    + struct thread_map *threads)
    {
    int cpu, thread, nthreads;
    unsigned long flags = PERF_FLAG_FD_CLOEXEC;
    @@ -1459,6 +1459,30 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
    if (perf_missing_features.write_backward && evsel->attr.write_backward)
    return -EINVAL;

    + if (cpus == NULL) {
    + static struct cpu_map *empty_cpu_map;
    +
    + if (empty_cpu_map == NULL) {
    + empty_cpu_map = cpu_map__dummy_new();
    + if (empty_cpu_map == NULL)
    + return -ENOMEM;
    + }
    +
    + cpus = empty_cpu_map;
    + }
    +
    + if (threads == NULL) {
    + static struct thread_map *empty_thread_map;
    +
    + if (empty_thread_map == NULL) {
    + empty_thread_map = thread_map__new_by_tid(-1);
    + if (empty_thread_map == NULL)
    + return -ENOMEM;
    + }
    +
    + threads = empty_thread_map;
    + }
    +
    if (evsel->system_wide)
    nthreads = 1;
    else
    @@ -1655,46 +1679,16 @@ void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads)
    perf_evsel__free_fd(evsel);
    }

    -static struct {
    - struct cpu_map map;
    - int cpus[1];
    -} empty_cpu_map = {
    - .map.nr = 1,
    - .cpus = { -1, },
    -};
    -
    -static struct {
    - struct thread_map map;
    - int threads[1];
    -} empty_thread_map = {
    - .map.nr = 1,
    - .threads = { -1, },
    -};
    -
    -int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
    - struct thread_map *threads)
    -{
    - if (cpus == NULL) {
    - /* Work around old compiler warnings about strict aliasing */
    - cpus = &empty_cpu_map.map;
    - }
    -
    - if (threads == NULL)
    - threads = &empty_thread_map.map;
    -
    - return __perf_evsel__open(evsel, cpus, threads);
    -}
    -
    int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
    struct cpu_map *cpus)
    {
    - return __perf_evsel__open(evsel, cpus, &empty_thread_map.map);
    + return perf_evsel__open(evsel, cpus, NULL);
    }

    int perf_evsel__open_per_thread(struct perf_evsel *evsel,
    struct thread_map *threads)
    {
    - return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
    + return perf_evsel__open(evsel, NULL, threads);
    }

    static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
    --
    2.9.3
    \
     
     \ /
      Last update: 2017-02-15 20:06    [W:3.009 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site