On Tue, Aug 06, 2024 at 04:03:19PM -0700, Andrii Nakryiko wrote: SNIP > ssize_t get_uprobe_offset(const void *addr) > { > - size_t start, end, base; > - char buf[256]; > - bool found = false; > + size_t start, base, end; > FILE *f; > + char buf[256]; > + int err, flags; > > f = fopen("/proc/self/maps", "r"); > if (!f) > return -errno; > > - while (fscanf(f, "%zx-%zx %s %zx %*[^\n]\n", &start, &end, buf, &base) == 4) { > - if (buf[2] == 'x' && (uintptr_t)addr >= start && (uintptr_t)addr < end) { > - found = true; > - break; > + /* requested executable VMA only */ > + err = procmap_query(fileno(f), addr, PROCMAP_QUERY_VMA_EXECUTABLE, &start, &base, &flags); > + if (err == -EOPNOTSUPP) { > + bool found = false; > + > + while (fscanf(f, "%zx-%zx %s %zx %*[^\n]\n", &start, &end, buf, &base) == 4) { > + if (buf[2] == 'x' && (uintptr_t)addr >= start && (uintptr_t)addr < end) { > + found = true; > + break; > + } > + } > + if (!found) { > + fclose(f); > + return -ESRCH; > } > + } else if (err) { > + fclose(f); > + return err; I feel like I commented on this before, so feel free to ignore me, but this seems similar to the code below, could be in one function anyway it's good for follow up there was another selftest in the original patchset adding benchmark for the procfs query interface, is it coming in as well? Acked-by: Jiri Olsa <jolsa@xxxxxxxxxx> jirka > } > - > fclose(f); > > - if (!found) > - return -ESRCH; > - > #if defined(__powerpc64__) && defined(_CALL_ELF) && _CALL_ELF == 2 > > #define OP_RT_RA_MASK 0xffff0000UL > @@ -307,15 +371,25 @@ ssize_t get_rel_offset(uintptr_t addr) > size_t start, end, offset; > char buf[256]; > FILE *f; > + int err, flags; > > f = fopen("/proc/self/maps", "r"); > if (!f) > return -errno; > > - while (fscanf(f, "%zx-%zx %s %zx %*[^\n]\n", &start, &end, buf, &offset) == 4) { > - if (addr >= start && addr < end) { > - fclose(f); > - return (size_t)addr - start + offset; > + err = procmap_query(fileno(f), (const void *)addr, 0, &start, &offset, &flags); > + if (err == 0) { > + fclose(f); > + return (size_t)addr - start + offset; > + } else if (err != -EOPNOTSUPP) { > + fclose(f); > + return err; > + } else if (err) { > + while (fscanf(f, "%zx-%zx %s %zx %*[^\n]\n", &start, &end, buf, &offset) == 4) { > + if (addr >= start && addr < end) { > + fclose(f); > + return (size_t)addr - start + offset; > + } > } > } > > -- > 2.43.5 > >