]> git.itanic.dy.fi Git - linux-stable/commitdiff
perf dlfilter: Fix use of addr_location__exit() in dlfilter__object_code()
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 28 Sep 2023 07:16:05 +0000 (10:16 +0300)
committerNamhyung Kim <namhyung@kernel.org>
Sat, 30 Sep 2023 06:55:05 +0000 (23:55 -0700)
Stop calling addr_location__exit() when addr_location__init() was not
called.

Fixes: 0dd5041c9a0e ("perf addr_location: Add init/exit/copy functions")
Cc: stable@vger.kernel.org
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20230928071605.17624-1-adrian.hunter@intel.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/util/dlfilter.c

index 1dbf27822ee28f385d4ba93a116eb3117e26cd43..4a1dc21b0450bcc8812cd662c629de9b664ec9cf 100644 (file)
@@ -282,13 +282,21 @@ static struct perf_event_attr *dlfilter__attr(void *ctx)
        return &d->evsel->core.attr;
 }
 
+static __s32 code_read(__u64 ip, struct map *map, struct machine *machine, void *buf, __u32 len)
+{
+       u64 offset = map__map_ip(map, ip);
+
+       if (ip + len >= map__end(map))
+               len = map__end(map) - ip;
+
+       return dso__data_read_offset(map__dso(map), machine, offset, buf, len);
+}
+
 static __s32 dlfilter__object_code(void *ctx, __u64 ip, void *buf, __u32 len)
 {
        struct dlfilter *d = (struct dlfilter *)ctx;
        struct addr_location *al;
        struct addr_location a;
-       struct map *map;
-       u64 offset;
        __s32 ret;
 
        if (!d->ctx_valid)
@@ -298,27 +306,17 @@ static __s32 dlfilter__object_code(void *ctx, __u64 ip, void *buf, __u32 len)
        if (!al)
                return -1;
 
-       map = al->map;
-
-       if (map && ip >= map__start(map) && ip < map__end(map) &&
+       if (al->map && ip >= map__start(al->map) && ip < map__end(al->map) &&
            machine__kernel_ip(d->machine, ip) == machine__kernel_ip(d->machine, d->sample->ip))
-               goto have_map;
+               return code_read(ip, al->map, d->machine, buf, len);
 
        addr_location__init(&a);
+
        thread__find_map_fb(al->thread, d->sample->cpumode, ip, &a);
-       if (!a.map) {
-               ret = -1;
-               goto out;
-       }
+       ret = a.map ? code_read(ip, a.map, d->machine, buf, len) : -1;
 
-       map = a.map;
-have_map:
-       offset = map__map_ip(map, ip);
-       if (ip + len >= map__end(map))
-               len = map__end(map) - ip;
-       ret = dso__data_read_offset(map__dso(map), d->machine, offset, buf, len);
-out:
        addr_location__exit(&a);
+
        return ret;
 }