From patchwork Thu Feb 8 08:53:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrian Hunter X-Patchwork-Id: 198230 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:50ea:b0:106:860b:bbdd with SMTP id r10csp32357dyd; Thu, 8 Feb 2024 00:57:13 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCVHGneaHebcD6HXt5ZMo3TAPwlovvpMQWnt2Y8UW43vwPFeH5M0oQIEySriL1LRb3KPSZ4qxb8EfN78Y+HHXx3bIZQvBA== X-Google-Smtp-Source: AGHT+IHFkuxzHb2fTecwfj9rjU/LnXzAvDPfk3DW+V7KW9DOBcgSvEYjLrKcauEFLUM4aFvMNv0S X-Received: by 2002:a17:906:dfd6:b0:a3b:b345:4e9a with SMTP id jt22-20020a170906dfd600b00a3bb3454e9amr387226ejc.50.1707382633583; Thu, 08 Feb 2024 00:57:13 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707382633; cv=pass; d=google.com; s=arc-20160816; b=bJDyH8nF1BeoHaldBPtHKPqgROuxH402XOtk0fveOeP8cD5vJtUpGFga9TGLdi0/kB l4ApZ1GC+A1aS7kLjDTY0BfzB2cJO13O2VXso3T0cEeEeEQjLGoRqeeDQ3BypoNd0/2J 2OJGu0IfXxntEoDyh0T652nLgH2Gv8fY3ZAjBnw/T1EIqQOfy2j6ZY9suuccfnA6NUuX prtSYam7ck1nlQpFzDhOMCxwcwV0EWZ8YpzBKOAgXSJFqj8viS5pEyMw1SSWnjwBakPt TRBqSQ5U8+rbBQ3R6kCMygnB23Bmi0+Ab/l6orbQD/wHlYO01d8jjvQHb/bdQdkD6Mcd uhzA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:organization:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=oN3zT+BnBuX7TghH7clhIRLnhdYcRkNV130e9hhuk2Y=; fh=I1tido7iCr88HGhRaCP0DEvWPYKfERJ6I9veVquE/ZM=; b=mwqoUWNGcclBIPI8YPQuQ6tmLjQ+BUgORh2UNcsM6KS97ZUSI57XHhnrrUt7vPSXxi TkKdPE+tP2t89DKNp77dFHmXPhbGu9KqEnZukMUKdK1W/9K8aRtHPRnmKiO/fDYjVIdn twofnc3oslJEJROX10Wni3Sf33O1eD6YjYbn4P2WkOEL82kym+4K15UFbvtDxEADN3Nn 2f96cbbZvp3Xlaz3WCgjyCSqorkthTH8bos4XWbtOGB2gha0Y5d4enwYGhhUUBfv4/e+ KaDb1UvxD7fZ4kXDGBpGCuyuhW/SqaGNyXPez8t9lUWVlfyj1zsJMryRwk1vb3TsCCsj 4mDw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WMLR9sKF; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-57677-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57677-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Forwarded-Encrypted: i=2; AJvYcCUD472YWZAjhh3gzLUxRJVetDDIRrXYRAaZf8J++1JKuiQDQQ345WsYmhLO2+5ixuLX2Nk2lv5e4olxwgMvEyNhn2zWKA== Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id p23-20020a17090635d700b00a385bc701f8si1938081ejb.960.2024.02.08.00.57.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 00:57:13 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-57677-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WMLR9sKF; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-57677-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57677-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.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 am.mirrors.kernel.org (Postfix) with ESMTPS id 0BF261F21A84 for ; Thu, 8 Feb 2024 08:57:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 401FB6EB70; Thu, 8 Feb 2024 08:53:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="WMLR9sKF" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A77F56D1DA; Thu, 8 Feb 2024 08:53:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.16 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707382427; cv=none; b=hYskdplYnV6cS04n2m78L7GcbN0tZ6l7QRITXWtqsygr0B9HNZntBZQw8mTGK6dNE0eLyWSE8rmQEjFzg5rVD8vHE0ui4Vg7vnrvWVT23QH8W0e65n7LMTtXx7rjp+NzmMVoh4JWA3Wx4HaOKaw2jT327SIAJN/Vqp7GHl6f8Ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707382427; c=relaxed/simple; bh=liuCnYvj43a4tXuQpW3mnRUkdN4KcCl1EfuqJpVLEwo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=LntnfmXP+av6Nxq/0jA5FlJpr8t7CA9+YGjCEalo9auAvMLRx3nAbsAtm55I9rwtqMQUXc4lXzq5CgRXL5xxlAeqlytWssUJcOA5jmPvGzfN3fnfWDHgU4uKJsl6MNY4BQx7MP/l5UitcYXIxuBMD2VBSYVNCqjJbAAefg/KYLs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=WMLR9sKF; arc=none smtp.client-ip=198.175.65.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1707382425; x=1738918425; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=liuCnYvj43a4tXuQpW3mnRUkdN4KcCl1EfuqJpVLEwo=; b=WMLR9sKF0sFT/KEY/V6MJnG+SS1Tks+O41UrBvzZBRd/pqk8Nm92C613 Owiwl2wcMPkyYNk7YVqMGswETfW6qYzCa+mZ0rDkW8TPPgG9gD0rXCw5y gL1ACtmQPl4kKZFYMmf6RPSEjny6+TMA6TAoQy1SnC8o/I8QUPbbqC3yD /WLrZOFlg1Wp7vV+aq/qWPCYTlPgKKDw+R9UU9sxhZ5Yv7UxmBFUqG/jG m2W13HiZuvZfsq/7aDD7nwWEWlr1ZSKZ3BFUsYopypwJoXGfLFWC4zhWp +6a+Ws12uyHETlRA5D+Pm8t5zWvfDvqmWL2Fcl9pXUeWz2k+Q6WPYWm37 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10977"; a="1329202" X-IronPort-AV: E=Sophos;i="6.05,253,1701158400"; d="scan'208";a="1329202" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa108.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2024 00:53:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.05,253,1701158400"; d="scan'208";a="1589486" Received: from lnielsex-mobl.ger.corp.intel.com (HELO ahunter-VirtualBox.home\044ger.corp.intel.com) ([10.251.219.88]) by orviesa009-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2024 00:53:40 -0800 From: Adrian Hunter To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Like Xu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH V3 1/2] perf tools: Make it possible to see perf's kernel and module memory mappings Date: Thu, 8 Feb 2024 10:53:25 +0200 Message-Id: <20240208085326.13432-2-adrian.hunter@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240208085326.13432-1-adrian.hunter@intel.com> References: <20240208085326.13432-1-adrian.hunter@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790320452540671291 X-GMAIL-MSGID: 1790320452540671291 Dump kmaps if using 'perf --debug kmaps' or verbose > 2 (e.g. -vvv) for tools 'perf script' and 'perf report' if there is no browser. Example: $ perf --debug kmaps script 2>&1 >/dev/null | grep kvm.intel build id event received for /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko: 0691d75e10e72ebbbd45a44c59f6d00a5604badf [20] Map: 0-3a3 4f5d8 [kvm_intel].modinfo Map: 0-5240 5f280 [kvm_intel]__versions Map: 0-30 64 [kvm_intel].note.Linux Map: 0-14 644c0 [kvm_intel].orc_header Map: 0-5297 43680 [kvm_intel].rodata Map: 0-5bee 3b837 [kvm_intel].text.unlikely Map: 0-7e0 41430 [kvm_intel].noinstr.text Map: 0-2080 713c0 [kvm_intel].bss Map: 0-26 705c8 [kvm_intel].data..read_mostly Map: 0-5888 6a4c0 [kvm_intel].data Map: 0-22 70220 [kvm_intel].data.once Map: 0-40 705f0 [kvm_intel].data..percpu Map: 0-1685 41d20 [kvm_intel].init.text Map: 0-4b8 6fd60 [kvm_intel].init.data Map: 0-380 70248 [kvm_intel]__dyndbg Map: 0-8 70218 [kvm_intel].exit.data Map: 0-438 4f980 [kvm_intel]__param Map: 0-5f5 4ca0f [kvm_intel].rodata.str1.1 Map: 0-3657 493b8 [kvm_intel].rodata.str1.8 Map: 0-e0 70640 [kvm_intel].data..ro_after_init Map: 0-500 70ec0 [kvm_intel].gnu.linkonce.this_module Map: ffffffffc13a7000-ffffffffc1421000 a0 /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko The example above shows how the module section mappings are all wrong except for the main .text mapping at 0xffffffffc13a7000. Signed-off-by: Adrian Hunter --- Changes in V3: - re-base Changes in V2: - add dump to perf report (if no browser) as well as perf script - add 'perf --debug kmaps' option also to dump kmaps tools/perf/Documentation/perf.txt | 2 ++ tools/perf/builtin-report.c | 2 ++ tools/perf/builtin-script.c | 3 +++ tools/perf/util/debug.c | 3 +++ tools/perf/util/debug.h | 1 + tools/perf/util/python.c | 1 + tools/perf/util/session.c | 11 +++++++++++ tools/perf/util/session.h | 2 ++ 8 files changed, 25 insertions(+) diff --git a/tools/perf/Documentation/perf.txt b/tools/perf/Documentation/perf.txt index a7cf7bc2f968..09f516f3fdfb 100644 --- a/tools/perf/Documentation/perf.txt +++ b/tools/perf/Documentation/perf.txt @@ -63,6 +63,8 @@ OPTIONS in browser mode perf-event-open - Print perf_event_open() arguments and return value + kmaps - Print kernel and module maps (perf script + and perf report without browser) --debug-file:: Write debug output to a specified file. diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index ccb91fe6b876..8e16fa261e6f 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1766,6 +1766,8 @@ int cmd_report(int argc, const char **argv) } else ret = 0; + if (!use_browser && (verbose > 2 || debug_kmaps)) + perf_session__dump_kmaps(session); error: if (report.ptime_range) { itrace_synth_opts__clear_time_range(&itrace_synth_opts); diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index af63b7c37c8a..24baa8284add 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -4378,6 +4378,9 @@ int cmd_script(int argc, const char **argv) flush_scripting(); + if (verbose > 2 || debug_kmaps) + perf_session__dump_kmaps(session); + out_delete: if (script.ptime_range) { itrace_synth_opts__clear_time_range(&itrace_synth_opts); diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c index e282b4ceb4d2..c39ee0fcb8cf 100644 --- a/tools/perf/util/debug.c +++ b/tools/perf/util/debug.c @@ -33,6 +33,7 @@ #endif int verbose; +int debug_kmaps; int debug_peo_args; bool dump_trace = false, quiet = false; int debug_ordered_events; @@ -229,6 +230,7 @@ static struct sublevel_option debug_opts[] = { { .name = "stderr", .value_ptr = &redirect_to_stderr}, { .name = "data-convert", .value_ptr = &debug_data_convert }, { .name = "perf-event-open", .value_ptr = &debug_peo_args }, + { .name = "kmaps", .value_ptr = &debug_kmaps }, { .name = NULL, } }; @@ -267,6 +269,7 @@ int perf_quiet_option(void) /* For debug variables that are used as bool types, set to 0. */ redirect_to_stderr = 0; debug_peo_args = 0; + debug_kmaps = 0; return 0; } diff --git a/tools/perf/util/debug.h b/tools/perf/util/debug.h index de8870980d44..35a7a5ae762e 100644 --- a/tools/perf/util/debug.h +++ b/tools/perf/util/debug.h @@ -9,6 +9,7 @@ #include extern int verbose; +extern int debug_kmaps; extern int debug_peo_args; extern bool quiet, dump_trace; extern int debug_ordered_events; diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 8761f51b5c7c..075c0f79b1b9 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c @@ -181,6 +181,7 @@ int perf_bpf_filter__destroy(struct evsel *evsel __maybe_unused) * implementing 'verbose' and 'eprintf'. */ int verbose; +int debug_kmaps; int debug_peo_args; int eprintf(int level, int var, const char *fmt, ...); diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 199d3e8df315..06d0bd7fb459 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -2720,6 +2720,17 @@ size_t perf_session__fprintf(struct perf_session *session, FILE *fp) return machine__fprintf(&session->machines.host, fp); } +void perf_session__dump_kmaps(struct perf_session *session) +{ + int save_verbose = verbose; + + fflush(stdout); + fprintf(stderr, "Kernel and module maps:\n"); + verbose = 0; /* Suppress verbose to print a summary only */ + maps__fprintf(machine__kernel_maps(&session->machines.host), stderr); + verbose = save_verbose; +} + struct evsel *perf_session__find_first_evtype(struct perf_session *session, unsigned int type) { diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index ee3715e8563b..5064c6ec11e7 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h @@ -133,6 +133,8 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp, bool skip_empty); +void perf_session__dump_kmaps(struct perf_session *session); + struct evsel *perf_session__find_first_evtype(struct perf_session *session, unsigned int type); From patchwork Thu Feb 8 08:53:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrian Hunter X-Patchwork-Id: 198232 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:50ea:b0:106:860b:bbdd with SMTP id r10csp37866dyd; Thu, 8 Feb 2024 01:08:46 -0800 (PST) X-Google-Smtp-Source: AGHT+IEF5U81CFmaomfs+HIfs/vVLGx+BNvQFy8oUZr4o0S46GIso6SHb92tR/fBQWEN3v7YFL4a X-Received: by 2002:a05:6830:56:b0:6dd:ca7d:b4eb with SMTP id d22-20020a056830005600b006ddca7db4ebmr8233613otp.0.1707383326429; Thu, 08 Feb 2024 01:08:46 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707383326; cv=pass; d=google.com; s=arc-20160816; b=ljlPoTTVcw6hsiLr5sFcsmFv1PE3KNksKRcg5zRBuMwjvkN8B3U7PAKggTv3fzqKSV yGk5lSdMvtkongtO4dgJ0ueIXTiOFOQdf087eSjNUcuUnJ7052wZi+7kBInCpcP+3Y7F zJ9bi3/6PrOSdcZEq9JRCecVs6EDElI1wPyK+wXZLnP7G4gNb0FyrTx83sJHt5IiNDUH BlTvEBAij4kkbP7rTha8UaM4lV4im1s7QSJcmW2+IV4IzIqVJKXMaa/YUDNdVGYN+FvJ VAEVuY1i8MJAGGu7kvEOBGVNeR0ZKzmWiUgmeEvInWolmvYNK8bhfXwm+dGRpcZduFxI kIWA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:organization:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature; bh=qIitE6tv67rvx6aCKtcv5i8iiVPZknrJ3T7G8txfP+E=; fh=qein0LMgMjvEGZFnR0IVJUSxbd/AlQZv9tBzu7B/3kU=; b=Dz2Dm8lNXgTZTs1RMBvfeWfOZDo/LqZDlkuqrshh/3QXo6hG6+Zdyujjv5f52yi6sg l1vsdQTA5ZDRNFhaynqPtABbm+B/r0RvU/HdB52pFmv11B+PI/3jdIodkteIEuqxpPAm p/+/jj72yKhyG3NcyblLfT3rcR1yMOOwqGc05Vq9ip7G9e2N33nehtkoMFxq62RD1xI3 AOZoFtWDTR9Texj5UfK7InkJD0k9OJ2nkelbR4k5qQ1jH/IHN7k+lNje+CvISaPoGQO/ JhHIGbwqjQfV1LF4h9wkK04hqJkCIk9CKetzPkFuwyCGvtuwj5oVO99temUo0BGfwIcF AA5A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cQWyBQi5; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-57678-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57678-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Forwarded-Encrypted: i=2; AJvYcCVInQQ7VFjyCYe0BJ2Yhg0gteXA43xrXH4ycqsU4XHGoY/JC0YrL61k8ibZ6jpWWM6H4T2Yums4lAzN2wgl6u7UFy38gg== Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id s2-20020a656902000000b005cee9117ef6si3571363pgq.810.2024.02.08.01.08.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Feb 2024 01:08:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-57678-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cQWyBQi5; arc=pass (i=1 spf=pass spfdomain=intel.com dkim=pass dkdomain=intel.com dmarc=pass fromdomain=intel.com); spf=pass (google.com: domain of linux-kernel+bounces-57678-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-57678-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.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 sy.mirrors.kernel.org (Postfix) with ESMTPS id C770DB2707F for ; Thu, 8 Feb 2024 08:57:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 477636D1DA; Thu, 8 Feb 2024 08:53:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="cQWyBQi5" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7C106DCE7; Thu, 8 Feb 2024 08:53:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.16 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707382428; cv=none; b=FwXfTW6r+kv9iqLSYgXKo/WzyuwYl0c5MvkYShr0Yvk86SOOBAzrwdnokNqYavvm8EabAJjuvuag40s3+Wxlu6GTUeQC1KV3rvza84fJSo7I5SsKN8tux8idnK7l2MdBXskz/O5Z7eV2bmEs8xslIea/cba39XET448z8LSIokc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707382428; c=relaxed/simple; bh=2bjtfbzdJTQ7+Qlt6V6ZtgveJ+Fx8SxEWOXXM8bfX8Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=K/X3boPhoh2Cl3mbE8gK3yLXHwSzPa6r3KnoT2S07Nmx7+Y2lsS0N6zoGnDGS7VOl2DUPOGzTJgylfTrdDlcoBF0SWwUo5vv820FWqbQYANrks760UMhr4PMe9BZ0QNvA5zPikTsta+4Dg+oFJM7PwFo3SENjH4sYQbtfdX6vDE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=cQWyBQi5; arc=none smtp.client-ip=198.175.65.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1707382426; x=1738918426; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2bjtfbzdJTQ7+Qlt6V6ZtgveJ+Fx8SxEWOXXM8bfX8Q=; b=cQWyBQi5kCLEt0WoQqU6pEkrfHCm75oY+qMesNe0uWHfaCUCJb6RMo0G MK42how321IwvVdEIQIqXq59/BNPiXIwDOxosrf06zXMJrW6QKABXHr4V aqxbUSrty9cG1cK6jLwGyJIvoCGlNvn4G2qwNiqoTTwvJ0W3aAGrWkJdX SWOhsymwkzUjo0C5Bt6oEM2J22QBcTydDuHPvIOlCp9TC22be/11DN9+9 yp+neikhj6g0CCj1sucEyIlJt7FSaeXES+5sid5FVX9aKwhS8sagu/9TI HlOFcSNQsT/8uo79O4UGS/MPaA3BaotKCHY3DpuDjm9fxIfCHy8xT7ONf g==; X-IronPort-AV: E=McAfee;i="6600,9927,10977"; a="1329216" X-IronPort-AV: E=Sophos;i="6.05,253,1701158400"; d="scan'208";a="1329216" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by orvoesa108.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2024 00:53:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.05,253,1701158400"; d="scan'208";a="1589498" Received: from lnielsex-mobl.ger.corp.intel.com (HELO ahunter-VirtualBox.home\044ger.corp.intel.com) ([10.251.219.88]) by orviesa009-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2024 00:53:42 -0800 From: Adrian Hunter To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Ian Rogers , Like Xu , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Subject: [PATCH V3 2/2] perf symbols: Slightly improve module file executable section mappings Date: Thu, 8 Feb 2024 10:53:26 +0200 Message-Id: <20240208085326.13432-3-adrian.hunter@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240208085326.13432-1-adrian.hunter@intel.com> References: <20240208085326.13432-1-adrian.hunter@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1790320475429709443 X-GMAIL-MSGID: 1790321179072185972 Currently perf does not record module section addresses except for the .text section. In general that means perf cannot get module section mappings correct (except for .text) when loading symbols from a kernel module file. (Note using --kcore does not have this issue) Improve that situation slightly by identifying executable sections that use the same mapping as the .text section. That happens when an executable section comes directly after the .text section, both in memory and on file, something that can be determined by following the same layout rules used by the kernel, refer kernel layout_sections(). Note whether that happens is somewhat arbitrary, so this is not a final solution. Example from tracing a virtual machine process: Before: $ perf script | grep unknown CPU 0/KVM 1718 203.511270: 318341 cpu-cycles:P: ffffffffc13e8a70 [unknown] (/lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko) $ perf script -vvv 2>&1 >/dev/null | grep kvm.intel | grep 'noinstr.text\|ffff' Map: 0-7e0 41430 [kvm_intel].noinstr.text Map: ffffffffc13a7000-ffffffffc1421000 a0 /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko After: $ perf script | grep 203.511270 CPU 0/KVM 1718 203.511270: 318341 cpu-cycles:P: ffffffffc13e8a70 vmx_vmexit+0x0 (/lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko) $ perf script -vvv 2>&1 >/dev/null | grep kvm.intel | grep 'noinstr.text\|ffff' Map: ffffffffc13a7000-ffffffffc1421000 a0 /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko Reported-by: Like Xu Signed-off-by: Adrian Hunter --- tools/perf/util/symbol-elf.c | 75 +++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 4b934ed3bfd1..95773c32796d 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -1329,6 +1330,58 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, return -1; } +static bool is_exe_text(int flags) +{ + return (flags & (SHF_ALLOC | SHF_EXECINSTR)) == (SHF_ALLOC | SHF_EXECINSTR); +} + +/* + * Some executable module sections like .noinstr.text might be laid out with + * .text so they can use the same mapping (memory address to file offset). + * Check if that is the case. Refer to kernel layout_sections(). Return the + * maximum offset. + */ +static u64 max_text_section(Elf *elf, GElf_Ehdr *ehdr) +{ + Elf_Scn *sec = NULL; + GElf_Shdr shdr; + u64 offs = 0; + + /* Doesn't work for some arch */ + if (ehdr->e_machine == EM_PARISC || + ehdr->e_machine == EM_ALPHA) + return 0; + + /* ELF is corrupted/truncated, avoid calling elf_strptr. */ + if (!elf_rawdata(elf_getscn(elf, ehdr->e_shstrndx), NULL)) + return 0; + + while ((sec = elf_nextscn(elf, sec)) != NULL) { + char *sec_name; + + if (!gelf_getshdr(sec, &shdr)) + break; + + if (!is_exe_text(shdr.sh_flags)) + continue; + + /* .init and .exit sections are not placed with .text */ + sec_name = elf_strptr(elf, ehdr->e_shstrndx, shdr.sh_name); + if (!sec_name || + strstarts(sec_name, ".init") || + strstarts(sec_name, ".exit")) + break; + + /* Must be next to previous, assumes .text is first */ + if (offs && PERF_ALIGN(offs, shdr.sh_addralign ?: 1) != shdr.sh_offset) + break; + + offs = shdr.sh_offset + shdr.sh_size; + } + + return offs; +} + /** * ref_reloc_sym_not_found - has kernel relocation symbol been found. * @kmap: kernel maps and relocation reference symbol @@ -1368,7 +1421,8 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map, struct maps *kmaps, struct kmap *kmap, struct dso **curr_dsop, struct map **curr_mapp, const char *section_name, - bool adjust_kernel_syms, bool kmodule, bool *remap_kernel) + bool adjust_kernel_syms, bool kmodule, bool *remap_kernel, + u64 max_text_sh_offset) { struct dso *curr_dso = *curr_dsop; struct map *curr_map; @@ -1424,6 +1478,17 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map, if (!kmap) return 0; + /* + * perf does not record module section addresses except for .text, but + * some sections can use the same mapping as .text. + */ + if (kmodule && adjust_kernel_syms && is_exe_text(shdr->sh_flags) && + shdr->sh_offset <= max_text_sh_offset) { + *curr_mapp = map; + *curr_dsop = dso; + return 0; + } + snprintf(dso_name, sizeof(dso_name), "%s%s", dso->short_name, section_name); curr_map = maps__find_by_name(kmaps, dso_name); @@ -1497,6 +1562,7 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss, Elf *elf; int nr = 0; bool remap_kernel = false, adjust_kernel_syms = false; + u64 max_text_sh_offset = 0; if (kmap && !kmaps) return -1; @@ -1584,6 +1650,10 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss, remap_kernel = true; adjust_kernel_syms = dso->adjust_symbols; } + + if (kmodule && adjust_kernel_syms) + max_text_sh_offset = max_text_section(runtime_ss->elf, &runtime_ss->ehdr); + elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) { struct symbol *f; const char *elf_name = elf_sym__name(&sym, symstrs); @@ -1673,7 +1743,8 @@ dso__load_sym_internal(struct dso *dso, struct map *map, struct symsrc *syms_ss, if (dso->kernel) { if (dso__process_kernel_symbol(dso, map, &sym, &shdr, kmaps, kmap, &curr_dso, &curr_map, - section_name, adjust_kernel_syms, kmodule, &remap_kernel)) + section_name, adjust_kernel_syms, kmodule, + &remap_kernel, max_text_sh_offset)) goto out_elf_end; } else if ((used_opd && runtime_ss->adjust_symbols) || (!used_opd && syms_ss->adjust_symbols)) {