From patchwork Thu Jun 8 23:27:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 13273007 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 55407C7EE23 for ; Thu, 8 Jun 2023 23:30:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:From:Subject:Mime-Version:Message-Id :Date:Reply-To:Cc:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=Dk8J4rnNSr3BWMQW3Srg261O5IiqXJxjLvg3KGmHdVo=; b=BOe+03LN8MvaE1 HhQkg5P+3dJgBeQVmnVw/ff7Jk60j8AVFT7irU+J9MDiaD8Gdb2IakdKygWxd/gKfAaEo2VH7h1ts IwLM/Fxg8w8Jd3NgVf49n1R3WygPUP9uxdJg5eYXiDLf02ZTC3ypg8YtxaSq6SB0CRao1xYHRYzXP ooR8GCXWlhHMN2v2L+AZ7bI9wc2gTKPELSXdsn0+zQCmBqGsESz9wjYOor0cUML138pLu8m8BQy2T 9ZhOWZ1WmNcMG12s7EZAMAHlZH4oQerHDntIbgMKhS+E6vdds8pKuTjlLZBICnarHtHlayZOIpy8A NHPr9kxtJX44P/fZCFRg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q7P4A-00Aus3-2T; Thu, 08 Jun 2023 23:29:18 +0000 Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1q7P46-00Auqf-2J for linux-arm-kernel@lists.infradead.org; Thu, 08 Jun 2023 23:29:17 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-56942442eb0so13763837b3.1 for ; Thu, 08 Jun 2023 16:29:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1686266951; x=1688858951; h=to:from:subject:mime-version:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=PUR1BaDg5UCDJ5L3mZfey+gmQnRwkETeHewM4NWReSw=; b=I41YQStEQO3vr784nVk2AuN2KmcI6CYImyY6oj9xMSOL/Yo/n5AgLeGczhU8NFwLQe ttny74OBfkuK6f8/wAMn399t38lrgo1DziPG3fqg2E8EOzKtpOmCLUIlu9VJl+oy96a6 HTs8mk3Q5WH2kmszROgWDPIekrDqjw5P+L9RKWeN+cf/s7N46twWudk+coNyz4KuYyQr ZbHH0YlckfKFgDJvgw6uV2fJIEg454LWFtRqaHxPfRNDcZsyr7rFBGWMgz5hpVhqY1KR W05OV+dPXayUdvhMkc4RX1/SbZlFDM6BolOt44PIQkCnZ9wnUmpKbi+Ww0jFE5uiRpgF l3oQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686266951; x=1688858951; h=to:from:subject:mime-version:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PUR1BaDg5UCDJ5L3mZfey+gmQnRwkETeHewM4NWReSw=; b=UODaByPjiHSpqHa33Rc4PfqA5Wkipn6kVRzk75riaJewTk81zl/9kLdf+gAofC3UoG xD/i/RlNZInO4RKizhgd5/UCiN1qATxnO64a84kmtFpO/Yb8QERZBoQR9ClNYRnXlVqR tqJyVSRXzQRcepE/4pUTxH4o3kayfo0BWQwlMQGPeEM6LzgdgGuEfcTM3p8u9SNvYiXk 3OFj6b65p0m5DlDRz9HPWAzLNP3CpXbwArXeeBqobwMHXd2r+BcZOoiw5NgpfBpgaWms 3d4ex9S4AiKvSeCmOka3LJ5QyO4EtRu4ZZSotVe9TH02plphmdPUqkxXFgltn/orHSpS i1bg== X-Gm-Message-State: AC+VfDwfrTJY9s+G6xJzoLO/VSL+48CC7kC1DtpeXY4Fv02vN8jd159Z F0eBy5a+TyKBsuSBos3noHFsQMuTjG0Y X-Google-Smtp-Source: ACHHUZ7nvCcbtXwbQ8tPrBNQ7joytk73IzC7nG/F+wmEeTixEorelfj8HzfbCMpJUhp83IeyIqzk8iZHWWnX X-Received: from irogers.svl.corp.google.com ([2620:15c:2d4:203:c3e5:ebc6:61e5:c73f]) (user=irogers job=sendgmr) by 2002:a81:b64e:0:b0:561:856f:69d3 with SMTP id h14-20020a81b64e000000b00561856f69d3mr607499ywk.7.1686266951355; Thu, 08 Jun 2023 16:29:11 -0700 (PDT) Date: Thu, 8 Jun 2023 16:27:57 -0700 Message-Id: <20230608232823.4027869-1-irogers@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.41.0.162.gfafddb0af9-goog Subject: [PATCH v2 00/26] Fix memory leaks (was reference count checking for thread) From: Ian Rogers To: John Garry , Will Deacon , James Clark , Mike Leach , Leo Yan , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , Suzuki K Poulose , "Naveen N. Rao" , Kan Liang , German Gomez , Ali Saidi , Jing Zhang , Athira Rajeev , Miguel Ojeda , ye xingchen , Liam Howlett , Dmitrii Dolgov <9erthalion6@gmail.com>, Yang Jihong , K Prateek Nayak , Changbin Du , Ravi Bangoria , Sean Christopherson , Andi Kleen , "Steinar H. Gunderson" , Yuan Can , Brian Robbins , liuwenyu , Ivan Babrou , Fangrui Song , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, coresight@lists.linaro.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230608_162915_626695_7E21F49D X-CRM114-Status: GOOD ( 20.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Use leak sanitizer and reference count checking to fix outstanding memory leaks in "perf top" or those discovered in "perf test". Also fix address sanitizer issues discovered. Add reference count checking to thread after first refactoring bits of the code, such as making the thread red-black tree non-invasive (so the thread it references is easier to reference count, rather than having 3 potential references). Part of this refactoring also removes the dead thread list because if we held a reference here the threads would never die and anything else has questionable correctness. addr_location is made into its own C/header file to capture the init, exit and copy code. Refactor and change callchain_cursor to come from a pthread key so that a destructor can run on pthreads exiting. Fix additional outstanding memory leak and reference count issues to the point that "perf test" compiled with address sanitizer but without libtraceevent passes all but one test - libtraceevent reports leaks within its own code, most likely as it isn't compiled with sanitizers. The remaining failing test is "68: Test dwarf unwind" and that has address sanitizer issues as it uses memcpy to access the stack within the process - we likely want to skip parts of the test with sanitizers enabled. v2. Include extra fixes for callchain cursor, addr2line and related "perf top" fixes, as well as the 2 patches in: https://lore.kernel.org/lkml/20230607050148.3248353-1-irogers@google.com/ Ian Rogers (26): perf thread: Remove notion of dead threads perf thread: Make threads rbtree non-invasive perf thread: Add accessor functions for thread perf maps: Make delete static, always use put perf addr_location: Move to its own header perf addr_location: Add init/exit/copy functions perf thread: Add reference count checking perf machine: Make delete_threads part of machine__exit perf report: Avoid thread leak perf header: Ensure bitmaps are freed perf stat: Avoid evlist leak perf intel-pt: Fix missed put and leak perf evlist: Free stats in all evlist destruction perf python: Avoid 2 leak sanitizer issues perf jit: Fix two thread leaks perf symbol-elf: Correct holding a reference perf maps: Fix overlapping memory leak perf machine: Fix leak of kernel dso perf machine: Don't leak module maps perf map/maps/thread: Changes to reference counting perf annotate: Fix parse_objdump_line memory leak perf top: Add exit routine for main thread perf header: Avoid out-of-bounds read perf callchain: Use pthread keys for tls callchain_cursor perf srcline: Change free_srcline to zfree_srcline perf hist: Fix srcline memory leak tools/perf/arch/arm/tests/dwarf-unwind.c | 2 +- tools/perf/arch/arm64/tests/dwarf-unwind.c | 2 +- tools/perf/arch/powerpc/tests/dwarf-unwind.c | 2 +- tools/perf/arch/x86/tests/dwarf-unwind.c | 2 +- tools/perf/builtin-annotate.c | 28 +- tools/perf/builtin-c2c.c | 22 +- tools/perf/builtin-diff.c | 20 +- tools/perf/builtin-inject.c | 4 +- tools/perf/builtin-kmem.c | 13 +- tools/perf/builtin-kwork.c | 15 +- tools/perf/builtin-mem.c | 4 +- tools/perf/builtin-report.c | 21 +- tools/perf/builtin-sched.c | 80 ++--- tools/perf/builtin-script.c | 123 ++++---- tools/perf/builtin-stat.c | 1 + tools/perf/builtin-timechart.c | 11 +- tools/perf/builtin-top.c | 19 +- tools/perf/builtin-trace.c | 38 ++- .../scripts/python/Perf-Trace-Util/Context.c | 4 +- tools/perf/tests/code-reading.c | 6 +- tools/perf/tests/dwarf-unwind.c | 1 - tools/perf/tests/hists_common.c | 2 +- tools/perf/tests/hists_cumulate.c | 18 +- tools/perf/tests/hists_filter.c | 11 +- tools/perf/tests/hists_link.c | 20 +- tools/perf/tests/hists_output.c | 12 +- tools/perf/tests/maps.c | 2 +- tools/perf/tests/mmap-thread-lookup.c | 5 +- tools/perf/tests/perf-targz-src-pkg | 5 +- tools/perf/tests/symbols.c | 1 - tools/perf/tests/thread-maps-share.c | 13 +- tools/perf/trace/beauty/pid.c | 4 +- tools/perf/ui/browsers/hists.c | 19 +- tools/perf/ui/hist.c | 5 +- tools/perf/ui/stdio/hist.c | 2 +- tools/perf/util/Build | 1 + tools/perf/util/addr_location.c | 44 +++ tools/perf/util/addr_location.h | 31 ++ tools/perf/util/annotate.c | 5 +- tools/perf/util/arm-spe.c | 4 +- tools/perf/util/block-info.c | 4 +- tools/perf/util/build-id.c | 2 + tools/perf/util/callchain.c | 68 +++- tools/perf/util/callchain.h | 4 +- tools/perf/util/cs-etm.c | 28 +- tools/perf/util/data-convert-json.c | 16 +- tools/perf/util/db-export.c | 30 +- tools/perf/util/dlfilter.c | 17 +- tools/perf/util/event.c | 37 +-- tools/perf/util/evlist.c | 2 + tools/perf/util/evsel_fprintf.c | 8 +- tools/perf/util/header.c | 14 +- tools/perf/util/hist.c | 59 ++-- tools/perf/util/intel-bts.c | 2 +- tools/perf/util/intel-pt.c | 88 +++--- tools/perf/util/jitdump.c | 12 +- tools/perf/util/machine.c | 292 +++++++++--------- tools/perf/util/map.c | 4 +- tools/perf/util/maps.c | 5 +- tools/perf/util/maps.h | 9 +- tools/perf/util/python.c | 4 + .../scripting-engines/trace-event-python.c | 40 ++- tools/perf/util/session.c | 8 +- tools/perf/util/sort.c | 12 +- tools/perf/util/srcline.c | 15 +- tools/perf/util/srcline.h | 2 +- tools/perf/util/symbol-elf.c | 4 +- tools/perf/util/symbol.h | 17 +- tools/perf/util/thread-stack.c | 25 +- tools/perf/util/thread.c | 222 +++++++------ tools/perf/util/thread.h | 210 ++++++++++++- tools/perf/util/unwind-libdw.c | 27 +- tools/perf/util/unwind-libunwind-local.c | 19 +- tools/perf/util/unwind-libunwind.c | 2 +- tools/perf/util/vdso.c | 2 +- 75 files changed, 1210 insertions(+), 722 deletions(-) create mode 100644 tools/perf/util/addr_location.c create mode 100644 tools/perf/util/addr_location.h