Received: by 2002:ab2:687:0:b0:1f4:6588:b3a7 with SMTP id s7csp238919lqe; Tue, 9 Apr 2024 23:50:17 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWh6iicRXQTcnauETsJUkb+5bzTN2WdgTYwJ2b/wkfNH5BuHgxp0k65gtzsOtN4AGI8dPmgvM5XkjI27cAKL89yVAJ07bNaEC62yN/RZA== X-Google-Smtp-Source: AGHT+IEOUd9XUmmPgtC4PmTqrVFACl11U/CCMhX0mrz5Cu+EGSDYGBArHCdz66MO4DSOJJdYnI2B X-Received: by 2002:a17:90a:bd95:b0:2a5:c4b7:8c32 with SMTP id z21-20020a17090abd9500b002a5c4b78c32mr1305936pjr.0.1712731817005; Tue, 09 Apr 2024 23:50:17 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712731816; cv=pass; d=google.com; s=arc-20160816; b=TLMfa/rwKIo+Ex9HMSHGpubFgZ57xQTbu6kNsQOI83Wku1QO1lEsOtKFE3na+fkb0u heuxg85VKt6CgXAUcKHlw4zaDUxZVayYtpxp72kAE0Q4tNjp10Be/1iES5PVJGj3/iN6 d7staDTXEIFRrRshc42Z/B3X/Vu1dRnHOasvI++WbjS1UxLmLxKx8cjkl96MuJxB9yqQ UIXrzkWPJ+tb5jzn7gXDguCeY1r0dXF1/BhYS27VYJCEkz9p4NHGiM4lE5PRGTc3MCP/ Rbb7PfZ8EZ5hGOMfEaY5clS7f7nVWMuvm05Q2ZifZrCvCmBiSHco2NBWHqHDAft4TbzD 9Jjg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=to:from:subject:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:message-id:date:dkim-signature; bh=Q86w5uI23jus8/CWfQjASonlaMPM3a4X8veinZQZY5Y=; fh=PIEjj1GFKXMQcJDQKjqDCNms3Bla5Vgvuv8dwdOI0sU=; b=KILnz0RtCUyOHB6z3CRm8Xk6ufXWSWAR1hFY6KOnQfEHDPgAl0X/BZ0pQFFXJnUVxJ DuWZiFcQV+NJSVsyclC/zptcJuKfreYTJtkYsyBGHdXzmiyCPIG1q9YJP1ihTS69ALRR q/gj2CHNDPYRbZpNV1beeMF1FxPZeGFYlia0taVnfQCzBejPJULdbs4c79DmWZ6LVZLj +KAdg0hWpr/Jhx1M62oryRxGPh1GOP/aJ0tyWRcSah4KNwo8hLRq8NdA/UOkcUb8Hjs+ v7xzdVd6mKY46+ytnHQafWCQhtBuMfUJY9Cx6C1R7xpH3srrAOwpZz8Dk9DXKImzXIzr mhQg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Wv6MdDm3; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-138012-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-138012-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id e12-20020a17090a77cc00b002a2a9d5430asi947115pjs.29.2024.04.09.23.50.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 23:50:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-138012-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=Wv6MdDm3; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-138012-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-138012-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 9813B288302 for ; Wed, 10 Apr 2024 06:42:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 47BF33613C; Wed, 10 Apr 2024 06:42:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Wv6MdDm3" Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8753282F0 for ; Wed, 10 Apr 2024 06:42:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712731345; cv=none; b=ARkL5LO0SIqjMPuqPM5YliedkS9lLDzhy8sqXafuupHi3OCAi9uOrTONB0OoMlUK5ydLQIhAaGa/f0V6JrDh3R6l/Ks4zdyin0PxBRD4axEYpvgDNDBnUIMFSU5Gn1WAMLLwUP+My9v17UAtQWTyDJ8S2X3KP+JNkl14x/osdYk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712731345; c=relaxed/simple; bh=WR4U2+IgQKOHVW76MTANWwHhOHoeGdsnUej/bUOxOGQ=; h=Date:Message-Id:Mime-Version:Subject:From:To:Content-Type; b=mPB7vD3YfDvaZIlPcZy60g227Mpr7Pgty2fTD0pHU3v7cfUam/hi0RFwbe/rlzY01meKi4nfERhX5t9AfZwORiSJeFnGHTRqT7Pnpy9lhyGGQoMBQWO/3W/+Vqe5tdrJDTd6b8YgRnR+r0dE2p9g7h8Z3N7sAgyDo32NYw/8PSk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Wv6MdDm3; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-615073c8dfbso124014567b3.1 for ; Tue, 09 Apr 2024 23:42:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712731341; x=1713336141; darn=vger.kernel.org; h=to:from:subject:mime-version:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=Q86w5uI23jus8/CWfQjASonlaMPM3a4X8veinZQZY5Y=; b=Wv6MdDm3SIEAAbhKx0f8bCwiYFmzfn6cdVDZkVJcfu9G3XPrXODmiW4xbGOiESgyC9 +U3V6743juDFTNUHEd380TekbxE5chAvxJp8/qSvBl0vAmZGwfvEB0y/BKOg2GEYA/0h ykSDDyLgFL6+lb3MlGKEa/F4+b+/AHhW6Sm4aiOtVub5n6QTUrrH202cb5lXV2hE9mD2 ltMvrF5ykIyy/ad09FAZB8d5xUVLWlkkxzU7fWyS8hLFkvnE+YDfCTzaiAJaiGrW1q57 xA+J+9b0QuOdWggV+N0Vs4vLm2TeNBzpcFUGCtPTIlnzxfvxh/6dBSAphjG+ivLu28bT 1jRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712731341; x=1713336141; h=to:from:subject:mime-version:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Q86w5uI23jus8/CWfQjASonlaMPM3a4X8veinZQZY5Y=; b=hYz8fxdr8cuNp+p/lBifPkR2KOV7w3SffhJZltn2oBrfnR7DWV12ZHX5cADUS7ZDVT XfraLYuhzVhfGnYw7V0ydmhbxXoLjtzoirobiAtw+c/+kXCKcsXaU6emkMJwi/PyAynd xVOahcW+jR8lmHllssBlk8AfKXDVUvwSJkM2wUApzse9gP0ik24k4N6DyVW8zaozu1Rz B300TrtIMkZrZxh/d51nv/a4iG399/XdbVwFT9OyYr1JinMYTbjlP7lHHGMWTn4TTBt+ irmhwOCaJSMMAYXMmfPfzq52Nn0BXbFFjWpTj257VwZNdTohjVKEv3C8HpEKUqSrS6a4 R9gA== X-Forwarded-Encrypted: i=1; AJvYcCWN2+bCoiYpbIIFSvw0ayd5eSa5o/lqO/yv4nsb9hmL6eLHydeAWqQZ67YKu7E+IvMxb5zMpmURW4G3nNATW5lMlSvP6I6vcgWBEUVR X-Gm-Message-State: AOJu0YwMOWNGTsrXDOUW/s6Fd6H9OHq73IWIHIYKMCVbwkI6ViEiQpx0 NSnBoKEujVcOg/nKuFnx+Al4aGJ0K9zWJt+SEKpc2tFoLeAxvPHFoL1h1Xipddg7JHFzBvlGQDp 5QfXYPw== X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:18c5:d9c6:d1d6:a3ec]) (user=irogers job=sendgmr) by 2002:a25:15c7:0:b0:dc6:e823:9edb with SMTP id 190-20020a2515c7000000b00dc6e8239edbmr135855ybv.12.1712731340866; Tue, 09 Apr 2024 23:42:20 -0700 (PDT) Date: Tue, 9 Apr 2024 23:42:02 -0700 Message-Id: <20240410064214.2755936-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 X-Mailer: git-send-email 2.44.0.478.gd926399ef9-goog Subject: [PATCH v3 00/12] dso/dsos memory savings and clean up From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Athira Rajeev , Colin Ian King , Leo Yan , Song Liu , Ilkka Koskinen , Ben Gainey , K Prateek Nayak , Yanteng Si , Yicong Yang , Sun Haiyong , Ravi Bangoria , Anne Macedo , Changbin Du , Andi Kleen , Thomas Richter , Masami Hiramatsu , zhaimingbing , Li Dong , Paran Lee , elfring@users.sourceforge.net, Markus Elfring , Yang Jihong , Chengen Du , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Content-Type: text/plain; charset="UTF-8" 12 more patches from: https://lore.kernel.org/lkml/20240202061532.1939474-1-irogers@google.com/ a near half year old adventure in trying to lower perf's dynamic memory use. Bits like the memory overhead of opendir are on the sidelines for now, too much fighting over how distributions/C-libraries present getdents. These changes are more good old fashioned replace an rb-tree with a sorted array and add reference count tracking. The changes migrate dsos code, the collection of dso structs, more into the dsos.c/dsos.h files. As with maps and threads, this is done so the internals can be changed - replacing a linked list (for fast iteration) and an rb-tree (for fast finds) with a lazily sorted array. The complexity of operations remain roughly the same, although iterating an array is likely faster than iterating a linked list, the memory usage is at least reduce by half. As fixing the memory usage necessitates changing operations like find, modify these operations so that they increment the reference count to avoid races like a find in dsos and a remove. Similarly tighten up lock usage so that operations working on dsos state hold the appropriate lock. Here are some questions (with answers) that I am expecting from reviewers: - Why not refactor dso with accessors first and then do the other things? My ambition with this change was to lower memory overhead not to particularly clean up and fix dso. Fixing the memory overhead, by refactoring and changing the internals, showed that locking discipline and reference counting discipline was lacking. The later changes try to fix these as a service to the community while I am changing the code and to also ensure that code is correct (more correct than it was wrt locking and reference counting than before the patches). Reordering the patches to do the refactoring first will be a giant pain. It will merge conflict with every other patch in the series and is basically a request to reimplement everything from square 1. The only thing I'd have in my favor would be how the code should look at the end of the series, and reordering patches doesn't change the eventual outcome of applying the patches. Note also, were I to send the memory saving patches and then a week later send the API clean up and reference counting fix patches the patches would be merged in the order they are here. I've done my best, I know you may consider that I'm adding to your reviewing overhead but I've also got to think about the overhead to me. - Please break apart this change... The first changes are moving things, but when a broken API is spotted like the missing get on dsos__find I put it in a change to move the function and to add the missed get. Could this be two changes? Yes, it could. Does moving code materially change the behavior of the tool? No. I've done it in one patch to minimize churn and to some extent for my sanity. Such changes are less than 100 lines of code and all independently tested. - The logic in dso around short, long name and id with sorting is weird Yes, I've tried to make it less weird while retaining the existing behavior. It would be easy to make a series of patches just cleaning it up but I came here to save memory not change the dso API. - Move the fixes in the 12th patch earlier. This is possible but then impossible to test with reference count checking. This does mean there are broken reference counts before the patch is applied, but this is generally already the case. Yes, some hypothetical person may decide to fork midway through this patch series and my order would mean they wouldn't have a fix. I've done my best while working within the bounds of my time and trying to avoid churn. v3. Rebases and drops merged "perf dso: Reorder variables to save space in struct dso" v2. Rebases on top of tmp.perf-tools-next resolving merge conflicts. Ian Rogers (12): perf dsos: Attempt to better abstract dsos internals perf dsos: Tidy reference counting and locking perf dsos: Add dsos__for_each_dso perf dso: Move dso functions out of dsos perf dsos: Switch more loops to dsos__for_each_dso perf dsos: Switch backing storage to array from rbtree/list perf dsos: Remove __dsos__addnew perf dsos: Remove __dsos__findnew_link_by_longname_id perf dsos: Switch hand code to bsearch perf dso: Add reference count checking and accessor functions perf dso: Reference counting related fixes perf dso: Use container_of to avoid a pointer in dso_data tools/perf/builtin-annotate.c | 8 +- tools/perf/builtin-buildid-cache.c | 2 +- tools/perf/builtin-buildid-list.c | 18 +- tools/perf/builtin-inject.c | 96 ++-- tools/perf/builtin-kallsyms.c | 2 +- tools/perf/builtin-mem.c | 4 +- tools/perf/builtin-record.c | 2 +- tools/perf/builtin-report.c | 6 +- tools/perf/builtin-script.c | 8 +- tools/perf/builtin-top.c | 4 +- tools/perf/builtin-trace.c | 2 +- tools/perf/tests/code-reading.c | 8 +- tools/perf/tests/dso-data.c | 67 ++- tools/perf/tests/hists_common.c | 6 +- tools/perf/tests/hists_cumulate.c | 4 +- tools/perf/tests/hists_output.c | 2 +- tools/perf/tests/maps.c | 4 +- tools/perf/tests/symbols.c | 8 +- tools/perf/tests/vmlinux-kallsyms.c | 6 +- tools/perf/ui/browsers/annotate.c | 6 +- tools/perf/ui/browsers/hists.c | 8 +- tools/perf/ui/browsers/map.c | 4 +- tools/perf/util/annotate-data.c | 14 +- tools/perf/util/annotate.c | 17 +- tools/perf/util/auxtrace.c | 2 +- tools/perf/util/block-info.c | 2 +- tools/perf/util/bpf-event.c | 8 +- tools/perf/util/build-id.c | 136 ++--- tools/perf/util/build-id.h | 2 - tools/perf/util/callchain.c | 2 +- tools/perf/util/data-convert-json.c | 2 +- tools/perf/util/db-export.c | 6 +- tools/perf/util/disasm.c | 34 +- tools/perf/util/dlfilter.c | 12 +- tools/perf/util/dso.c | 472 ++++++++++------ tools/perf/util/dso.h | 502 +++++++++++++++-- tools/perf/util/dsos.c | 529 +++++++++++------- tools/perf/util/dsos.h | 40 +- tools/perf/util/event.c | 8 +- tools/perf/util/header.c | 8 +- tools/perf/util/hist.c | 4 +- tools/perf/util/intel-pt.c | 22 +- tools/perf/util/machine.c | 192 ++----- tools/perf/util/machine.h | 2 + tools/perf/util/map.c | 82 ++- tools/perf/util/maps.c | 14 +- tools/perf/util/print_insn.c | 2 +- tools/perf/util/probe-event.c | 25 +- .../util/scripting-engines/trace-event-perl.c | 6 +- .../scripting-engines/trace-event-python.c | 21 +- tools/perf/util/session.c | 21 + tools/perf/util/session.h | 2 + tools/perf/util/sort.c | 19 +- tools/perf/util/srcline.c | 65 ++- tools/perf/util/symbol-elf.c | 145 +++-- tools/perf/util/symbol-minimal.c | 4 +- tools/perf/util/symbol.c | 186 +++--- tools/perf/util/symbol_fprintf.c | 4 +- tools/perf/util/synthetic-events.c | 24 +- tools/perf/util/thread.c | 4 +- tools/perf/util/unwind-libunwind-local.c | 18 +- tools/perf/util/unwind-libunwind.c | 2 +- tools/perf/util/vdso.c | 56 +- 63 files changed, 1794 insertions(+), 1197 deletions(-) -- 2.44.0.478.gd926399ef9-goog