qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PULL 3/5] tcg: add perfmap and jitdump


From: Ilya Leoshkevich
Subject: Re: [PULL 3/5] tcg: add perfmap and jitdump
Date: Sat, 03 Jun 2023 22:35:10 +0200
User-agent: Evolution 3.46.4 (3.46.4-1.fc37)

On Fri, 2023-06-02 at 18:21 +0100, Peter Maydell wrote:
> On Mon, 16 Jan 2023 at 22:36, Richard Henderson
> <richard.henderson@linaro.org> wrote:
> > 
> > From: Ilya Leoshkevich <iii@linux.ibm.com>
> > 
> > Add ability to dump /tmp/perf-<pid>.map and jit-<pid>.dump.
> > The first one allows the perf tool to map samples to each
> > individual
> > translation block. The second one adds the ability to resolve
> > symbol
> > names, line numbers and inspect JITed code.
> > 
> > Example of use:
> > 
> >     perf record qemu-x86_64 -perfmap ./a.out
> >     perf report
> > 
> > or
> > 
> >     perf record -k 1 qemu-x86_64 -jitdump ./a.out
> >     DEBUGINFOD_URLS= perf inject -j -i perf.data -o
> > perf.data.jitted
> >     perf report -i perf.data.jitted
> > 
> > Co-developed-by: Vanderson M. do Rosario <vandersonmr2@gmail.com>
> > Co-developed-by: Alex Bennée <alex.bennee@linaro.org>
> > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> > Message-Id: <20230112152013.125680-4-iii@linux.ibm.com>
> > Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> 
> Hi; Coverity thinks (CID 1507521) that there's a memory leak
> in this code:
> 
> > +void perf_enable_jitdump(void)
> > +{
> > +    struct jitheader header;
> > +    char jitdump_file[32];
> > +    void *perf_marker;
> > +
> > +    if (!use_rt_clock) {
> > +        warn_report("CLOCK_MONOTONIC is not available, proceeding
> > without jitdump");
> > +        return;
> > +    }
> > +
> > +    snprintf(jitdump_file, sizeof(jitdump_file), "jit-%d.dump",
> > getpid());
> > +    jitdump = safe_fopen_w(jitdump_file);
> > +    if (jitdump == NULL) {
> > +        warn_report("Could not open %s: %s, proceeding without
> > jitdump",
> > +                    jitdump_file, strerror(errno));
> > +        return;
> > +    }
> > +
> > +    /*
> > +     * `perf inject` will see that the mapped file name in the
> > corresponding
> > +     * PERF_RECORD_MMAP or PERF_RECORD_MMAP2 event is of the form
> > jit-%d.dump
> > +     * and will process it as a jitdump file.
> > +     */
> > +    perf_marker = mmap(NULL, qemu_real_host_page_size(), PROT_READ
> > | PROT_EXEC,
> > +                       MAP_PRIVATE, fileno(jitdump), 0);
> 
> Here we mmap() something...
> 
> > +    if (perf_marker == MAP_FAILED) {
> > +        warn_report("Could not map %s: %s, proceeding without
> > jitdump",
> > +                    jitdump_file, strerror(errno));
> > +        fclose(jitdump);
> > +        jitdump = NULL;
> > +        return;
> > +    }
> > +
> > +    header.magic = JITHEADER_MAGIC;
> > +    header.version = JITHEADER_VERSION;
> > +    header.total_size = sizeof(header);
> > +    header.elf_mach = get_e_machine();
> > +    header.pad1 = 0;
> > +    header.pid = getpid();
> > +    header.timestamp = get_clock();
> > +    header.flags = 0;
> > +    fwrite(&header, sizeof(header), 1, jitdump);
> 
> ...but we never do anything with that pointer, so the memory
> we just mmap()ed is never going to be freed.
> 
> Is this doing something particularly magical, or should that
> pointer be kept track of somewhere ?
> 
> thanks
> -- PMM

It's magic that points perf to the location of the jitdump file,
but it won't hurt munmap()ping it in perf_exit(). I'll send a patch.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]