From nobody Mon Sep 15 21:10:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22B64C6379F for ; Tue, 10 Jan 2023 06:03:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237556AbjAJGDE (ORCPT ); Tue, 10 Jan 2023 01:03:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59982 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230388AbjAJGCg (ORCPT ); Tue, 10 Jan 2023 01:02:36 -0500 Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2060.outbound.protection.outlook.com [40.107.223.60]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 081EA43D81; Mon, 9 Jan 2023 21:59:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Cd8u+qdQ6lOztUP9zTvLlPd5CdtJ44aFtl12cwlwicHhF4px0BMgeYwaZ3JDmYg3bHXGCisT/XIusD3N7PZKEmKcFr02OceCKjWgavMjBWCkggdwQ/ok6Y+FSS2SGxvLU6xzuwxfi1sncZjYxhC6ogHUb2wrIXKcqjrm2DXgW6I3LLlWBopof78FG2XyGBBSEl8UvPqVZsNuSpg/rpXli6SHDMyiFSTavSshCEi9wBhlgPqWQCyuUMddI1j/fFlUQsWAKi4YjOKxOFAcnW2IJzsgmz09SRqskZAZrgP6yvKs6m9/Mz7fiMTFqlrM1NjwobGaPaRE8N+zO07wRhapgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Q7XFZPF+OcYH3bkWrQyJgfGrfnOyP+E2XnDKaPAbPj4=; b=U0ijF+sOfnxX8oZyRgU6IFk/K2mWNShnxa6sRz4wLUgNqjYRDWhbMRVR8IQwfcjvsN2t+viWqPSvi6O/wRNAHBCKipXFEm8Y3QnYlDdYCyJ7Y7DtrYJwOHzOAOhD/DxoYydkbOlfbUrnvSWteDR94hDS9iwC/6IIwgH55lbhD9AmKrJCQYdfaORflRBwqj1/XPGR7WcOcklSCBdXq+e7eRZqri9OXgOALGMVV//+lik/2zvuqTFYQmq137zMMlXngwnA5/3SeXISCrDjF7qj+glsc7Tkp5BgPThuRRRJmWkMPgZxJPgJnxDthIxY8FtTYn9xSLQwDQMfo9yqhkkYig== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Q7XFZPF+OcYH3bkWrQyJgfGrfnOyP+E2XnDKaPAbPj4=; b=kh8OUIGUeB8U5ulMGarlFXQV7nVdhmwSuz2/Mly5dWIAAxDPhqQYql5ZhwCt7eAvyZj7/9HxJs18QA1m0JG69TyHXye3O8pJRrBP8U3zLq4mcWXMmOwpkpgf0+EyO7g3mQxaiWUutdotCmDFCY2oQyY5Kg4DRKvZl/BGxlNcN7o= Received: from MW4P222CA0009.NAMP222.PROD.OUTLOOK.COM (2603:10b6:303:114::14) by BN9PR12MB5114.namprd12.prod.outlook.com (2603:10b6:408:137::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18; Tue, 10 Jan 2023 05:59:34 +0000 Received: from CO1NAM11FT076.eop-nam11.prod.protection.outlook.com (2603:10b6:303:114:cafe::40) by MW4P222CA0009.outlook.office365.com (2603:10b6:303:114::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 05:59:33 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT076.mail.protection.outlook.com (10.13.174.152) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.5944.16 via Frontend Transport; Tue, 10 Jan 2023 05:59:33 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Mon, 9 Jan 2023 23:59:26 -0600 From: Ravi Bangoria To: CC: , , , , , , , , , , , , , , , , , , Subject: [RFC 1/4] perf tool: Simplify machine__create_modules() a bit Date: Tue, 10 Jan 2023 11:28:56 +0530 Message-ID: <20230110055859.685-2-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230110055859.685-1-ravi.bangoria@amd.com> References: <20230110055859.685-1-ravi.bangoria@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT076:EE_|BN9PR12MB5114:EE_ X-MS-Office365-Filtering-Correlation-Id: 179f1bdb-c033-4f1b-2865-08daf2cfd8a9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N0H0fZDhpuqyqe2Kx51Z50EF6MrG+ErgDmeraGEVZJDRNCsASrtHEjq4GkKY+MqGBGvGX8u0vI1SH8/4voY91WeCOyMHxHgoRg1cZA+E0QKK7t69M342JFFLcoITlt4zesubsS5UUmch627kDbz4RPb7vv2y9Astcf1SaC8cUJIhLp8eJq6YaZpx2FXFypyGFVbzFRxyBLpov93yoiwIfkWkVluDGzomuckpv8nSZ0uSsQzAaJgpKpTQ636PBjf4vpq6WcRxB/x2B45gvb5534Xp26Yy1SAHbENml5HetqA9GwxvPrbHjJJUnd0X04n4HrxEd/kTVBBcpcEITkzGYMQ4+B8Su6zr+zbGSpImGPkIV3vwhsNkEiHn8H/TQ2MWOY6yyqq9US/MuFVASCsHIawu7Ty5WFOFuwvbLosrjC3Q0BeuSNQq+hTQt4ZGOm5ciuR6az9P+bxNrp1onf/D2irfa78XULNKK4/MQCwGBaEvqUgQ+nIRs9eQfOEFNzdoP6VPni/PL8aTnMagn2n7F1tjh8Kpspbv1FgUCXuvaqCprDpG14ocxs08OLzSLl9k5WBj3QQt32OHI1+AmFCaqCqfdm/DrhTTumjRipsU2BeUZVjV86IZYym9Y4n6PT0cL/FMNNelovh1wyIT1dNqGTeJdIfAA++NdTd2w+/+5NVgvB9u85jVlPACYEi9xgeSGGt4+Fi79moI6h9+37e87r8nkM7K925JrwsFpCAyJnonMGJM9NwDe8x81HODSuO+Tf6QnWgcnhcAgkCn8CjPAg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230022)(4636009)(396003)(346002)(136003)(376002)(39860400002)(451199015)(46966006)(36840700001)(40470700004)(36860700001)(82740400003)(6666004)(81166007)(356005)(2906002)(478600001)(186003)(2616005)(7416002)(4744005)(1076003)(8676002)(44832011)(40480700001)(26005)(7696005)(16526019)(5660300002)(316002)(83380400001)(8936002)(36756003)(82310400005)(86362001)(426003)(47076005)(41300700001)(40460700003)(70206006)(4326008)(70586007)(336012)(54906003)(6916009)(101420200003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2023 05:59:33.2056 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 179f1bdb-c033-4f1b-2865-08daf2cfd8a9 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT076.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN9PR12MB5114 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Tweak this function a bit. No need to return twice. Signed-off-by: Ravi Bangoria --- tools/perf/util/machine.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 803c9d1803dd..ab2919bc0a0d 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -1613,10 +1613,8 @@ static int machine__create_modules(struct machine *m= achine) if (modules__parse(modules, machine, machine__create_module)) return -1; =20 - if (!machine__set_modules_path(machine)) - return 0; - - pr_debug("Problems setting modules path maps, continuing anyway...\n"); + if (machine__set_modules_path(machine)) + pr_debug("Problems setting modules path maps, continuing anyway...\n"); =20 return 0; } --=20 2.39.0 From nobody Mon Sep 15 21:10:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 35A12C61DB3 for ; Tue, 10 Jan 2023 06:03:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229924AbjAJGD3 (ORCPT ); Tue, 10 Jan 2023 01:03:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34370 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231500AbjAJGCg (ORCPT ); Tue, 10 Jan 2023 01:02:36 -0500 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2063.outbound.protection.outlook.com [40.107.244.63]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0FC1948CE1; Mon, 9 Jan 2023 21:59:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ehPpLxZ/ZS2WST2ruonfkY+kNksPJF1pu4CRpPyyR9L8abrboGjApfCg4spmqMf+o0MeckrpJ4lUgnHyw4hTk6RHlrquFirIbfsLd3gOdJbefxciRv6HcTRqdaRvmunh96hubClknHbumMrPjP3rZFOQojgJNLp6HfXEcLTTXq3sSCNH/b7jZbrALBBqkCD/rl10N5DKgDLww//WecMw6lfwrTMVVQkpE9yxN5aBzhXgwmscx2akYLwTGCzDH1UrznGx4WFT7GVyKbMyWPdC1+IQEQJJ34yz3jq5bc5EhW9L2yHd5w6VfkOag45VL+Uy8kpQBdHf0y1XfuG9KYb4Hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JsZOsxzlaz0o+ApsGirtAAXdkZUpM6cXKyEOUMEUsRI=; b=Bla25pmq9bBG2Lv/yO8MCM0wANr4dWli+6NKjXy+pAfdBzZ42PEpWpR2MexjPf40h/bzvzxW471MnzHqxppFPAg6FFb8qyPMdHlSBSCixQbxouYfJtsRKgEMrqC080ezVrvCcktN6luQs+HvNh+PiMSZBW4sgS0keU66KzZZYPofD+/2JCca2xaKMQiCjNYGw4jpxPDgRzUDHF4KaSItAKaDKmQtVqFVE/lvlg3y3Ydg8M8R9JngwdHpCwIiiWWqAqSkeMLmCTB6ggpUgKopa3MEz1iEtkXRkFbBZYQW/7Yg4Gz6qg/3a6qzyLAsEhIYq9ViuzFxCoEoy7k6WTynLg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JsZOsxzlaz0o+ApsGirtAAXdkZUpM6cXKyEOUMEUsRI=; b=lCLN4qE3aCnlEhsoJteaXSI1ghahErCnbSq7o1gRGt+fGJFqeFn6YFp8EaqiXAueLYecj1+V90uUnk8vSc0MMVDddKhfqjUrVpUIsymn2jGl395yaYgC+vEkToAkfnaofB5XcTfHxB2mvjsZpuYFFLDN+YGIhiGbh1BtgeqtgEg= Received: from MW4PR04CA0318.namprd04.prod.outlook.com (2603:10b6:303:82::23) by CY8PR12MB8268.namprd12.prod.outlook.com (2603:10b6:930:6c::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18; Tue, 10 Jan 2023 05:59:40 +0000 Received: from CO1NAM11FT051.eop-nam11.prod.protection.outlook.com (2603:10b6:303:82:cafe::66) by MW4PR04CA0318.outlook.office365.com (2603:10b6:303:82::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 05:59:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT051.mail.protection.outlook.com (10.13.174.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.6002.12 via Frontend Transport; Tue, 10 Jan 2023 05:59:40 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Mon, 9 Jan 2023 23:59:32 -0600 From: Ravi Bangoria To: CC: , , , , , , , , , , , , , , , , , , Subject: [RFC 2/4] perf tool: Refactor perf_event__synthesize_modules() Date: Tue, 10 Jan 2023 11:28:57 +0530 Message-ID: <20230110055859.685-3-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230110055859.685-1-ravi.bangoria@amd.com> References: <20230110055859.685-1-ravi.bangoria@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT051:EE_|CY8PR12MB8268:EE_ X-MS-Office365-Filtering-Correlation-Id: f3a45fe0-2340-4a66-b279-08daf2cfdcb7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8pR2K2o7M1su4zFcaYPsWGQGcILkm8HkB8aWeWrDbGoPtdL91QaWFZEBCTe9ZwEBm7Gd2E4DzF+rFipJ5nPs0vhHdAvReYu2wDXP6e9nuosPeWNCUncirBzxjsE4z6KWKo0tHJh1nM+42bUafdgzjugb9vdMF1mDRODxLybLv8DJZ0+3fVy4vpJRYQ/h5oxNDrAsl82GvXxYDfdDTbBvvD0iiJqnaPuHZWq/Q8use2Mtv2Ejf5fhhRoDapNNrQL92vEN/ZQxqQ5tQLhb8sC4AaxEnS0dlsQ1qqjQ7byq7es7H0DoMddTEtZXi7QANuvt0Dq1eyuPyhXQETC9CZ/tHlwd6Rz2Wh8K8vbSR/PVBGi4UBUh1a+E74UrHBzp8/qwrFCNOQo/6Gyh0XbqVkPTrOA+lLfgS1aHxUypQgxShrf77jsih8O44wTk4hpVoMPeJTrK5armxZpQrCEQqbWss92RP8Nh4ymGpe7U8JcSjdMCtS4BxUGs/20+PBheeymLHbVvdZ/edfzL81vWtBpVoRpXuArUFmzJePSMgpgHttj4HeIhz+xsN9E0ajWTKn27CRq+l3rgx6CV+WB04RZ/iH5c64l+S5AJe/Dnwjkwk520GS43ujR6jQndPGXIr0EcpK3RYAcmTHkq9QhXUv8nPErEFmM2EGB/j6kIyntgt5GHOMU1zLgkCPQpAN7iO4VOMyt4weh5yzl6F1VQAA7z164W+1I+KIScx6FKFVClCjO++rzVMciysDCQKjvByIngkqqKn+BHfgYijdRLRhQ7cQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230022)(4636009)(376002)(396003)(39860400002)(136003)(346002)(451199015)(40470700004)(36840700001)(46966006)(47076005)(478600001)(6666004)(40480700001)(2616005)(1076003)(336012)(4326008)(26005)(186003)(70206006)(70586007)(8676002)(6916009)(16526019)(54906003)(316002)(7696005)(36860700001)(86362001)(40460700003)(81166007)(82740400003)(356005)(426003)(83380400001)(82310400005)(41300700001)(7416002)(36756003)(5660300002)(44832011)(2906002)(8936002)(101420200003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2023 05:59:40.0118 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f3a45fe0-2340-4a66-b279-08daf2cfdcb7 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT051.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB8268 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" perf_event__synthesize_modules() synthesizes MMAP2 and MMAP events. Split them into separate functions. Signed-off-by: Ravi Bangoria --- tools/perf/util/synthetic-events.c | 77 +++++++++++++++++++----------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 3ab6a92b1a6d..2e145517f192 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -665,6 +665,50 @@ int perf_event__synthesize_cgroups(struct perf_tool *t= ool __maybe_unused, } #endif =20 +static void __perf_event__synthesize_modules_mmap2(struct machine *machine, + struct map *map, + union perf_event *event) +{ + size_t size =3D PERF_ALIGN(map->dso->long_name_len + 1, sizeof(u64)); + + event->mmap2.header.type =3D PERF_RECORD_MMAP2; + event->mmap2.header.size =3D sizeof(event->mmap2) + - sizeof(event->mmap2.filename) + + size + + machine->id_hdr_size; + + memset(event->mmap2.filename + size, 0, machine->id_hdr_size); + event->mmap2.start =3D map->start; + event->mmap2.len =3D map->end - map->start; + event->mmap2.pid =3D machine->pid; + + memcpy(event->mmap2.filename, map->dso->long_name, + map->dso->long_name_len + 1); + + perf_record_mmap2__read_build_id(&event->mmap2, machine, false); +} + +static void __perf_event__synthesize_modules_mmap(struct machine *machine, + struct map *map, + union perf_event *event) +{ + size_t size =3D PERF_ALIGN(map->dso->long_name_len + 1, sizeof(u64)); + + event->mmap.header.type =3D PERF_RECORD_MMAP; + event->mmap.header.size =3D sizeof(event->mmap) + - sizeof(event->mmap.filename) + + size + + machine->id_hdr_size; + + memset(event->mmap.filename + size, 0, machine->id_hdr_size); + event->mmap.start =3D map->start; + event->mmap.len =3D map->end - map->start; + event->mmap.pid =3D machine->pid; + + memcpy(event->mmap.filename, map->dso->long_name, + map->dso->long_name_len + 1); +} + int perf_event__synthesize_modules(struct perf_tool *tool, perf_event__han= dler_t process, struct machine *machine) { @@ -695,35 +739,10 @@ int perf_event__synthesize_modules(struct perf_tool *= tool, perf_event__handler_t if (!__map__is_kmodule(pos)) continue; =20 - if (symbol_conf.buildid_mmap2) { - size =3D PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); - event->mmap2.header.type =3D PERF_RECORD_MMAP2; - event->mmap2.header.size =3D (sizeof(event->mmap2) - - (sizeof(event->mmap2.filename) - size)); - memset(event->mmap2.filename + size, 0, machine->id_hdr_size); - event->mmap2.header.size +=3D machine->id_hdr_size; - event->mmap2.start =3D pos->start; - event->mmap2.len =3D pos->end - pos->start; - event->mmap2.pid =3D machine->pid; - - memcpy(event->mmap2.filename, pos->dso->long_name, - pos->dso->long_name_len + 1); - - perf_record_mmap2__read_build_id(&event->mmap2, machine, false); - } else { - size =3D PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); - event->mmap.header.type =3D PERF_RECORD_MMAP; - event->mmap.header.size =3D (sizeof(event->mmap) - - (sizeof(event->mmap.filename) - size)); - memset(event->mmap.filename + size, 0, machine->id_hdr_size); - event->mmap.header.size +=3D machine->id_hdr_size; - event->mmap.start =3D pos->start; - event->mmap.len =3D pos->end - pos->start; - event->mmap.pid =3D machine->pid; - - memcpy(event->mmap.filename, pos->dso->long_name, - pos->dso->long_name_len + 1); - } + if (symbol_conf.buildid_mmap2) + __perf_event__synthesize_modules_mmap2(machine, pos, event); + else + __perf_event__synthesize_modules_mmap(machine, pos, event); =20 if (perf_tool__process_synth_event(tool, event, machine, process) !=3D 0= ) { rc =3D -1; --=20 2.39.0 From nobody Mon Sep 15 21:10:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6A08AC678D7 for ; Tue, 10 Jan 2023 06:03:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235855AbjAJGDr (ORCPT ); Tue, 10 Jan 2023 01:03:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235056AbjAJGCo (ORCPT ); Tue, 10 Jan 2023 01:02:44 -0500 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2088.outbound.protection.outlook.com [40.107.94.88]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2080544371; Mon, 9 Jan 2023 21:59:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BoPHXjyuz/Oe7pkaVt4c1zga9AC/eW9951JhaehuPlGbJ50KIDlA5ww95yR9tpp8iKAWioYoT4d9MLtb9Nk/oeZN+6ocyOV6/GooRgsGmpHm0/Zuy17Hx3fMN2o6Dp26Rgy1EOEskIGy2lvAJ5EvNDzBot5tbRaIblf/b7t6WD5me6oqyo/e0DFErcMZmsNu/BXzUB8VD64GoTF9vIf88C0jdiMbE4XM1HPj79IbmDXTKFfEJMzlvYsQP708fS3blzb09oozWJeeB39w19mr/vOgL8h0RuxwIrXjKgQG8hIY8Gadx1iwYsYmVoJWzq0z7LBvAintbqcqhIaAptnXNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lplkz+lAazHD+3sif5dUaHrCRNmix/vE8XcjyeC5p1I=; b=HtKz5t+PkzUklAnhDK0eX0vKGfOhcAo2zgdxiTQeucdV9wjKu17/jwAqnWpfM14+wl28caFezRxN1csGjQ241OOUQXuuhvt6nHdlQR7V3sRoCpcBsoXT/TfzVJGXnfJhJXlfHoRYJM1fOSnIwAws2K0Nelk0w0/xCwkOGO2vE1vSiKXFeMpu7fdhGTDCMThFH9SxKjUJaOE6BdgRoyGN4jJhOA+eZjKI659SyD8WNIYhF0E89yjS97ZtJl/djbVXNRORGu8xDRM4KCjabUqCWWFRgCVGtVDer+4Je1hKtQHvKRDcR2QP4WfhQin7Pv+rhwJJF7nPQCAYmMNsmTM6TA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lplkz+lAazHD+3sif5dUaHrCRNmix/vE8XcjyeC5p1I=; b=Dm6Fc98FdZeWA9A4fHGH3NGMBag2xp2A3/vvROK4GbzCAoMrFCsMjMl7m26bQYVQJ3O47FRZBmnSjd6hM8VJnFYKxb/RAqkK5CTbb+HjsP75DNxW4b8H/eq5+XQ+uk3nsDvD/UXxhJwBbH7thnetmh3nFimOY9F1nVUJhcrYIk8= Received: from MW4PR03CA0293.namprd03.prod.outlook.com (2603:10b6:303:b5::28) by CO6PR12MB5427.namprd12.prod.outlook.com (2603:10b6:5:358::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18; Tue, 10 Jan 2023 05:59:46 +0000 Received: from CO1NAM11FT096.eop-nam11.prod.protection.outlook.com (2603:10b6:303:b5:cafe::9b) by MW4PR03CA0293.outlook.office365.com (2603:10b6:303:b5::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 05:59:46 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT096.mail.protection.outlook.com (10.13.175.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 05:59:45 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Mon, 9 Jan 2023 23:59:38 -0600 From: Ravi Bangoria To: CC: , , , , , , , , , , , , , , , , , , Subject: [RFC 3/4] perf tool: Introduce PERF_RECORD_KMOD_SEC_MAP Date: Tue, 10 Jan 2023 11:28:58 +0530 Message-ID: <20230110055859.685-4-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230110055859.685-1-ravi.bangoria@amd.com> References: <20230110055859.685-1-ravi.bangoria@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT096:EE_|CO6PR12MB5427:EE_ X-MS-Office365-Filtering-Correlation-Id: 6ca15c03-a4b2-4e60-e073-08daf2cfe014 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YXGSnpwzGj9HsYf7hDWryyFVrpTskmoeI87Gu1Pu0Sg2XqgYg9DoAAee8+kjLNPbZQ0agP2/9670qLJwRBvRoE3IlC8TDlGXPYt3ja73wKgFN4QaHF/jrCtEQwaWFrsz+NjnpzQnNY6c1ITl43ZvTd4ZYUHBlDWRGgQPdAR8mMzASK0KQ3bbczBbn/mAUqQlZCyZ3zpptNnHhifY89plPFNKF7d8BsVOYCPofTgdzkAtnqq3zETmHpna1JMlkoLQt+hZdnRHIy+DXR7vGq0rfaMH6j69RvhfpQeZtTJai/xvf7MxdKK2VPTpCONrkSlbseuOEwi+9lJWvkfkbtbmzoJT6qaNmVoufgrT0KZcmCGctMkuBeO9cb9+VcssIHWf8TweMVHyow8oillJy4E8SSZO24N/SfdYFrXm3DbAjIn9WNnv3oKG3EMft1WRtIJlSoGPu+8LEZ98LQ7AjzQLVvvRcPolXnd0bZdz2tUR9e+HqwIfLaXqLa+q3rc57b8/HwakVkDzpktFUsiaY0xBo/LSUol2nSA/8BPjihIiOWpjcrfcoA/Toih0TTukFiEvOTCvwB88n+cPmNaQK9Qf3t8GzU/MbVE+7OO6MXIjnqOMkZXSLfG+BBD7ispFxrdr5JotYkV4bNvO0nJGFq0w3eEuCgeULi/c+X3g6DZyzFcPCi8fqEbR2g3RDkP6FWm8xswiZOO+YcdUHvHJfxmLa8SKvViKl0l+FvxaDNiGK2Y= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230022)(4636009)(396003)(136003)(346002)(39860400002)(376002)(451199015)(36840700001)(40470700004)(46966006)(8676002)(70586007)(6916009)(316002)(4326008)(7696005)(70206006)(54906003)(356005)(44832011)(2906002)(5660300002)(40460700003)(8936002)(47076005)(81166007)(7416002)(426003)(41300700001)(36756003)(83380400001)(36860700001)(6666004)(478600001)(1076003)(40480700001)(336012)(2616005)(16526019)(82740400003)(26005)(86362001)(186003)(82310400005)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2023 05:59:45.5932 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6ca15c03-a4b2-4e60-e073-08daf2cfe014 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT096.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR12MB5427 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Introduce, perf tool only, synthetic event type PERF_RECORD_KMOD_SEC_MAP. Also add stub code for it. This event will be used to save/restore kernel module section maps to/from perf.data file. This is needed because kernel module elfs does not contain program header table and thus there is no easy way to find out how kernel would have loaded module sections in the memory. Signed-off-by: Ravi Bangoria --- tools/lib/perf/Documentation/libperf.txt | 1 + tools/lib/perf/include/perf/event.h | 25 ++++++++++++++++++++++++ tools/perf/util/event.c | 1 + tools/perf/util/session.c | 12 ++++++++++++ tools/perf/util/tool.h | 3 ++- 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index a8f1a237931b..b62730b84cc5 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -211,6 +211,7 @@ SYNOPSIS struct perf_record_time_conv; struct perf_record_header_feature; struct perf_record_compressed; + struct perf_record_kmod_sec_maps; -- =20 DESCRIPTION diff --git a/tools/lib/perf/include/perf/event.h b/tools/lib/perf/include/p= erf/event.h index ad47d7b31046..404b23b6902b 100644 --- a/tools/lib/perf/include/perf/event.h +++ b/tools/lib/perf/include/perf/event.h @@ -438,6 +438,29 @@ struct perf_record_compressed { char data[]; }; =20 +/* Kernel module elf section maps */ +struct perf_record_kmod_sec_map { + struct perf_event_header header; + /* Machine id. Same as synthesized PERF_RECORD_MMAP */ + __u32 pid; + /* Section start ip address */ + __u64 start; + /* Section length */ + __u64 len; + /* Section page offset in kernel module elf file */ + __u64 pgoff; + /* Section name length, including '\0' */ + __u16 sec_name_len; + /* Kernel module filename(path) length, including '\0' */ + __u16 filename_len; + /* + * Section name and filename stored as: "sec_name\0filename\0". i.e: + * data[0]: Section name + * data[sec_name_len + 1]: File name + */ + char data[]; +}; + enum perf_user_event_type { /* above any possible kernel type */ PERF_RECORD_USER_TYPE_START =3D 64, PERF_RECORD_HEADER_ATTR =3D 64, @@ -459,6 +482,7 @@ enum perf_user_event_type { /* above any possible kerne= l type */ PERF_RECORD_HEADER_FEATURE =3D 80, PERF_RECORD_COMPRESSED =3D 81, PERF_RECORD_FINISHED_INIT =3D 82, + PERF_RECORD_KMOD_SEC_MAP =3D 83, PERF_RECORD_HEADER_MAX }; =20 @@ -499,6 +523,7 @@ union perf_event { struct perf_record_time_conv time_conv; struct perf_record_header_feature feat; struct perf_record_compressed pack; + struct perf_record_kmod_sec_map kmod_sec_map; }; =20 #endif /* __LIBPERF_EVENT_H */ diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1fa14598b916..1b03061440bc 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -77,6 +77,7 @@ static const char *perf_event__names[] =3D { [PERF_RECORD_HEADER_FEATURE] =3D "FEATURE", [PERF_RECORD_COMPRESSED] =3D "COMPRESSED", [PERF_RECORD_FINISHED_INIT] =3D "FINISHED_INIT", + [PERF_RECORD_KMOD_SEC_MAP] =3D "KMOD_SEC_MAP", }; =20 const char *perf_event__name(unsigned int id) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 7c021c6cedb9..4f5165cd58de 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -563,6 +563,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool) tool->compressed =3D perf_session__process_compressed_event; if (tool->finished_init =3D=3D NULL) tool->finished_init =3D process_event_op2_stub; + if (tool->kmod_sec_map =3D=3D NULL) + tool->kmod_sec_map =3D process_event_stub; } =20 static void swap_sample_id_all(union perf_event *event, void *data) @@ -997,6 +999,12 @@ static void perf_event__time_conv_swap(union perf_even= t *event, } } =20 +static void perf_event_kmod_sec_map_swap(union perf_event *event __maybe_u= nused, + bool sample_id_all __maybe_unused) +{ + /* FIXME */ +} + typedef void (*perf_event__swap_op)(union perf_event *event, bool sample_id_all); =20 @@ -1035,6 +1043,7 @@ static perf_event__swap_op perf_event__swap_ops[] =3D= { [PERF_RECORD_STAT_ROUND] =3D perf_event__stat_round_swap, [PERF_RECORD_EVENT_UPDATE] =3D perf_event__event_update_swap, [PERF_RECORD_TIME_CONV] =3D perf_event__time_conv_swap, + [PERF_RECORD_KMOD_SEC_MAP] =3D perf_event_kmod_sec_map_swap, [PERF_RECORD_HEADER_MAX] =3D NULL, }; =20 @@ -1727,6 +1736,9 @@ static s64 perf_session__process_user_event(struct pe= rf_session *session, return err; case PERF_RECORD_FINISHED_INIT: return tool->finished_init(session, event); + case PERF_RECORD_KMOD_SEC_MAP: + /* Currently PERF_RECORD_KMOD_SEC_MAP is supported only for host */ + return tool->kmod_sec_map(tool, event, &sample, &session->machines.host); default: return -EINVAL; } diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h index c957fb849ac6..8ea7fb85c196 100644 --- a/tools/perf/util/tool.h +++ b/tools/perf/util/tool.h @@ -60,7 +60,8 @@ struct perf_tool { unthrottle, ksymbol, bpf, - text_poke; + text_poke, + kmod_sec_map; =20 event_attr_op attr; event_attr_op event_update; --=20 2.39.0 From nobody Mon Sep 15 21:10:56 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 469F0C46467 for ; Tue, 10 Jan 2023 06:04:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237588AbjAJGDx (ORCPT ); Tue, 10 Jan 2023 01:03:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60008 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237820AbjAJGCt (ORCPT ); Tue, 10 Jan 2023 01:02:49 -0500 Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2052.outbound.protection.outlook.com [40.107.94.52]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 140234434F; Mon, 9 Jan 2023 22:00:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BXYdq6Bqsf0usy5iJ7+myBuH2l4WKCccx/Zw8xt19LBLQsyLuTAmv8hiUUdotjPTet6zymjS5Twez1M091PDeXFWhMacYi1S18nOJQd5zRRWisx/D1GH48CuuG24bpenngh2uGlCHrTX+VCvBkq652YHyP7I4+FhT1YtCy9oW+0i/YV90YbF7kYjgKxzUcatiLddmtXuYN6iT9GAW64s5WPhE8y8VoNogD7VkBfd0h8We6SKGHx2M4qR0UeSjSr9nVKUTrwtN4VPW9ewrRyt5iuZYDWtl+nZqwnFU8URAgGYwijP31750vJHeEgQJBVhr8vegLYEuewU14VWuEp7TQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=opDXUbPGOyQRl9ljUbpBM+LGGs5hzMtyGQkKWHuGCEw=; b=Dt/ux23bPgVmHpbqC4p4FmePZDtdx2n5pvJ5Ed51qM72IItONlpWZCABOA0YFFWrA+VphhnxCzYlLU8OKa93PLnSdzn/JIlVBUcYQkb9dribjrQsAL9WS4aLELdd74944AGrZGiNIpgYd9mCDmousKBwXRr6Kmh+YgqHD3J03hWG/Jh6rIBPw3apWR0ltFmK9B+c3JxDato9wHDUOrCXrvenDcPjTbQp7YNvE1Zmr+lOr0+9hLX6q6WnCKWrTYaa9A4V4Tbyq3vjXztAPVc0AS3K6FcCsRlO/79eNDR5FgObh1NZATo3I2YFj0HytOaEc2YmHDMVOdCwKH8rMwtjfA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=opDXUbPGOyQRl9ljUbpBM+LGGs5hzMtyGQkKWHuGCEw=; b=Id47QdmjEgW+7K95QjtGTT8Da4IXpIEHN4fSug+ohNzeifgP2LrwkDnlVsuy85epdpOfG2Ms9ptjj59Hlvdl6WmncaDumdNFTR6JRjL+wB+kc7wUzQhhDvAe+I61BcsMxkkBNNZXNEhTw44icF3VhOo+P1xxFmOKbumYAA3DJDw= Received: from MW4PR03CA0083.namprd03.prod.outlook.com (2603:10b6:303:b6::28) by DM4PR12MB6112.namprd12.prod.outlook.com (2603:10b6:8:aa::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18; Tue, 10 Jan 2023 06:00:25 +0000 Received: from CO1NAM11FT081.eop-nam11.prod.protection.outlook.com (2603:10b6:303:b6:cafe::36) by MW4PR03CA0083.outlook.office365.com (2603:10b6:303:b6::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 06:00:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C Received: from SATLEXMB04.amd.com (165.204.84.17) by CO1NAM11FT081.mail.protection.outlook.com (10.13.174.80) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.20.5986.18 via Frontend Transport; Tue, 10 Jan 2023 06:00:24 +0000 Received: from BLR-5CG113396H.amd.com (10.180.168.240) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Mon, 9 Jan 2023 23:59:44 -0600 From: Ravi Bangoria To: CC: , , , , , , , , , , , , , , , , , , Subject: [RFC 4/4] perf tool: Fix non-".text" symbol resolution for kernel modules Date: Tue, 10 Jan 2023 11:28:59 +0530 Message-ID: <20230110055859.685-5-ravi.bangoria@amd.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230110055859.685-1-ravi.bangoria@amd.com> References: <20230110055859.685-1-ravi.bangoria@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.180.168.240] X-ClientProxiedBy: SATLEXMB03.amd.com (10.181.40.144) To SATLEXMB04.amd.com (10.181.40.145) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT081:EE_|DM4PR12MB6112:EE_ X-MS-Office365-Filtering-Correlation-Id: 3e43e5e7-e2ac-4e7b-0619-08daf2cff76c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4dmajC0j1tbdd/Kb1o6JDKVT3OQb1W94qs3mqsJDcRu+d5QqX8u8nlDM4hzEWFtY9/pd0+a/WTzguZiSQHN4yGbPVfrx+FvD+WeswmwTx6zwbao5zbug7vc28YSI23bm1nGRyiE7t1cbqJJqdac/dPXHFflgMxNNrbl+oaDBCxeaBzrd2klPpTiCkAh7NxFHBStaXcNnu60q3+Ws4E0Fhiid2centTkBoqbOOqr/mdo71tUdLkU5FBDJXv0+rYpS3a1aP2DJoDDcHtN8ydFgqh4gEc7pRYwbkA7FSGD9acEUatswNjLADRkugvrXpg1FFZcomw7sMCmz+pGXZY91ASRjf4WxF6AwD8ejFQUzCndBHVghJMxc9j0JsQhhP6JxYwOPnusrFu+vM/9/S/iuVmiorkmstSs633KYthVgOqkryotO1zfQAybGbGgYvll+YIZPcpe+nWlOdeKxqcHhwCGNd4aqFqTUWFrXunLOopgnRtcn/j05fDtgb7vvSc6VVAtVhNw5AEu7keeMeKA/qtjJ0NzHC04Sr/1Sd5NXyn80d+iQ1FR3ASRTj7Ts1nEIDvkFQflMzXi3aRNoWW1aRZD2sv2DtGg1uFMPlCTTGjvdjuh+LYskLjOtxxmRGtr7oQjkTVz3GA492AxpRgJOIDLOS2QoHY8PSGfjxwlvp2E/+2NiMKPrv7BIyuylVRgVgGu2WVk4B23cdaXfLtOPD1buP0hK+iP1C4w7F7MbHUkxhVYhH6BwhbkKp1sNDq6j6xXwnrlCRS/yOR0GfXxtwQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:SATLEXMB04.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230022)(4636009)(39860400002)(376002)(346002)(136003)(396003)(451199015)(40470700004)(46966006)(36840700001)(26005)(40480700001)(478600001)(16526019)(1076003)(336012)(186003)(6916009)(2616005)(8676002)(70586007)(6666004)(41300700001)(70206006)(4326008)(54906003)(7696005)(316002)(47076005)(83380400001)(36860700001)(86362001)(81166007)(82740400003)(40460700003)(356005)(426003)(30864003)(82310400005)(2906002)(7416002)(5660300002)(36756003)(8936002)(44832011)(21314003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2023 06:00:24.8144 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3e43e5e7-e2ac-4e7b-0619-08daf2cff76c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[SATLEXMB04.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT081.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6112 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Kernel module elf contains executable code in non-".text" sections as well, for ex: ".noinstr.text". Plus, kernel module's memory layout differs from it's binary layout because .ko elf does not contain program header table. Perf tries to solve it by creating special maps for allocated (SHF_ALLOC) elf sections, but perf uses elf addresses for map address range and thus these special maps remains unused because no real ip falls into their address range. Solve this by preparing section specific special maps using addresses provided by sysfs /sys/module/.../sections/. Also save these details via PERF_RECORD_KMOD_SEC_MAPs in perf.data which can be consumed at perf- report time. Without patch: # perf record -a -c 5000000 # perf report Overhead Command Shared Object Symbol 13.20% qemu-system-x86 [unknown] [.] 0x00005557527b1973 6.58% qemu-system-x86 [kvm_amd] [k] 0x00000000000151e6 6.36% qemu-system-x86 [kernel.vmlinux] [k] native_load_gdt 6.21% qemu-system-x86 [kernel.vmlinux] [k] native_load_tr_desc 4.71% qemu-system-x86 [kvm] [k] vcpu_run 4.52% qemu-system-x86 [kvm_amd] [k] svm_vcpu_run 3.50% qemu-system-x86 [kvm] [k] kvm_cpuid 2.09% qemu-system-x86 [kvm] [k] kvm_pmu_trigger_ev= ent 1.98% qemu-system-x86 [kvm_amd] [k] 0x0000000000015171 1.05% qemu-system-x86 [kvm_amd] [k] svm_handle_exit 1.04% qemu-system-x86 [kvm_amd] [k] 0x00000000000151e2 0.94% qemu-system-x86 [kvm_amd] [k] 0x0000000000015174 Same perf.data with kallsyms: # perf report --kallsyms=3D/proc/kallsyms Overhead Command Shared Object Symbol 14.22% qemu-system-x86 [kvm_amd] [k] __svm_vcpu_run 13.20% qemu-system-x86 [unknown] [.] 0x00005557527b1973 6.36% qemu-system-x86 [kernel.vmlinux] [k] native_load_gdt 6.21% qemu-system-x86 [kernel.vmlinux] [k] native_load_tr_desc 4.71% qemu-system-x86 [kvm] [k] vcpu_run 4.52% qemu-system-x86 [kvm_amd] [k] svm_vcpu_run 3.50% qemu-system-x86 [kvm] [k] kvm_cpuid 2.09% qemu-system-x86 [kvm] [k] kvm_pmu_trigger_ev= ent 1.05% qemu-system-x86 [kvm_amd] [k] svm_handle_exit With patch: # perf record -a -c 5000000 # perf report Overhead Command Shared Object Symbol 13.44% qemu-system-x86 [kvm-amd].noinstr.text [k] __svm_vcpu_run 13.25% qemu-system-x86 [unknown] [.] 0x000055f4c6563973 7.13% qemu-system-x86 [kernel.vmlinux] [k] native_load_gdt 6.00% qemu-system-x86 [kernel.vmlinux] [k] native_load_tr_desc 5.13% qemu-system-x86 [kvm_amd] [k] svm_vcpu_run 4.83% qemu-system-x86 [kvm] [k] vcpu_run 3.65% qemu-system-x86 [kvm] [k] kvm_cpuid Same perf.data with kallsyms: # perf report --kallsyms=3D/proc/kallsyms Overhead Command Shared Object Symbol 13.44% qemu-system-x86 [kernel.vmlinux] [k] __svm_vcpu_run 13.25% qemu-system-x86 [unknown] [.] 0x000055f4c6563973 7.13% qemu-system-x86 [kernel.vmlinux] [k] native_load_gdt 6.00% qemu-system-x86 [kernel.vmlinux] [k] native_load_tr_desc 5.13% qemu-system-x86 [kernel.vmlinux] [k] svm_vcpu_run 4.83% qemu-system-x86 [kernel.vmlinux] [k] vcpu_run 3.65% qemu-system-x86 [kernel.vmlinux] [k] kvm_cpuid Signed-off-by: Ravi Bangoria --- tools/perf/builtin-annotate.c | 1 + tools/perf/builtin-c2c.c | 1 + tools/perf/builtin-diff.c | 1 + tools/perf/builtin-inject.c | 1 + tools/perf/builtin-kmem.c | 1 + tools/perf/builtin-mem.c | 1 + tools/perf/builtin-record.c | 14 ++ tools/perf/builtin-report.c | 1 + tools/perf/builtin-script.c | 13 ++ tools/perf/builtin-trace.c | 1 + tools/perf/util/build-id.c | 1 + tools/perf/util/data-convert-bt.c | 1 + tools/perf/util/data-convert-json.c | 1 + tools/perf/util/event.c | 21 +++ tools/perf/util/event.h | 5 + tools/perf/util/machine.c | 264 ++++++++++++++++++++++++++++ tools/perf/util/machine.h | 2 + tools/perf/util/map.c | 1 + tools/perf/util/map.h | 4 + tools/perf/util/session.c | 11 +- tools/perf/util/symbol-elf.c | 9 +- tools/perf/util/symbol.c | 2 +- tools/perf/util/synthetic-events.c | 61 ++++++- 23 files changed, 408 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 90458ca6933f..7d315e5f69f6 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -506,6 +506,7 @@ int cmd_annotate(int argc, const char **argv) .auxtrace_info =3D perf_event__process_auxtrace_info, .auxtrace =3D perf_event__process_auxtrace, .feature =3D process_feature_event, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 52d94c7dd836..65e97da8f1cf 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -392,6 +392,7 @@ static struct perf_c2c c2c =3D { .auxtrace_info =3D perf_event__process_auxtrace_info, .auxtrace =3D perf_event__process_auxtrace, .auxtrace_error =3D perf_event__process_auxtrace_error, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index ed07cc6cca56..c4a60d9074b0 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c @@ -476,6 +476,7 @@ static struct perf_diff pdiff =3D { .lost =3D perf_event__process_lost, .namespaces =3D perf_event__process_namespaces, .cgroup =3D perf_event__process_cgroup, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 3f4e4dd5abf3..5665bf4b9613 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -2180,6 +2180,7 @@ int cmd_inject(int argc, const char **argv) .finished_init =3D perf_event__repipe_op2_synth, .compressed =3D perf_event__repipe_op4_synth, .auxtrace =3D perf_event__repipe_auxtrace, + .kmod_sec_map =3D perf_event__repipe, }, .input_name =3D "-", .samples =3D LIST_HEAD_INIT(inject.samples), diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index e20656c431a4..5e472f9fb39c 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -971,6 +971,7 @@ static struct perf_tool perf_kmem =3D { .mmap =3D perf_event__process_mmap, .mmap2 =3D perf_event__process_mmap2, .namespaces =3D perf_event__process_namespaces, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, }; =20 diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index dedd612eae5e..a5443fb5baf1 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -459,6 +459,7 @@ int cmd_mem(int argc, const char **argv) .auxtrace_info =3D perf_event__process_auxtrace_info, .auxtrace =3D perf_event__process_auxtrace, .auxtrace_error =3D perf_event__process_auxtrace_error, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, }, .input_name =3D "perf.data", diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 29dcd454b8e2..1e0285682813 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -3252,6 +3252,19 @@ static int build_id__process_mmap2(struct perf_tool = *tool, union perf_event *eve return perf_event__process_mmap2(tool, event, sample, machine); } =20 +static int build_id__process_kmod_sec_map(struct perf_tool *tool, union pe= rf_event *event, + struct perf_sample *sample, struct machine *machine) +{ + /* + * We already have the kernel maps, put in place via perf_session__create= _kernel_maps() + * no need to add them twice. + */ + if (!(event->header.misc & PERF_RECORD_MISC_USER)) + return 0; + + return perf_event__process_kmod_sec_map(tool, event, sample, machine); +} + static int process_timestamp_boundary(struct perf_tool *tool, union perf_event *event __maybe_unused, struct perf_sample *sample, @@ -3320,6 +3333,7 @@ static struct record record =3D { .mmap2 =3D build_id__process_mmap2, .itrace_start =3D process_timestamp_boundary, .aux =3D process_timestamp_boundary, + .kmod_sec_map =3D build_id__process_kmod_sec_map, .ordered_events =3D true, }, }; diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 2ee2ecca208e..b7a9a8f72d63 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1212,6 +1212,7 @@ int cmd_report(int argc, const char **argv) .auxtrace =3D perf_event__process_auxtrace, .event_update =3D perf_event__process_event_update, .feature =3D process_feature_event, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 69394ac0a20d..711f77edee60 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -2591,6 +2591,17 @@ static int process_mmap2_event(struct perf_tool *too= l, event->mmap2.tid); } =20 +static int process_kmod_sec_map_event(struct perf_tool *tool, + union perf_event *event, + struct perf_sample *sample, + struct machine *machine) +{ + if (perf_event__process_kmod_sec_map(tool, event, sample, machine) < 0) + return -1; + + return print_event(tool, event, sample, machine, event->kmod_sec_map.pid,= -1); +} + static int process_switch_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample, @@ -2775,6 +2786,7 @@ static int __cmd_script(struct perf_script *script) if (script->show_mmap_events) { script->tool.mmap =3D process_mmap_event; script->tool.mmap2 =3D process_mmap2_event; + script->tool.kmod_sec_map =3D process_kmod_sec_map_event; } if (script->show_switch_events || (scripting_ops && scripting_ops->proces= s_switch)) script->tool.context_switch =3D process_switch_event; @@ -3805,6 +3817,7 @@ int cmd_script(int argc, const char **argv) .cpu_map =3D process_cpu_map_event, .throttle =3D process_throttle_event, .unthrottle =3D process_throttle_event, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 86e06f136f40..f046a0b8862f 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4157,6 +4157,7 @@ static int trace__replay(struct trace *trace) trace->tool.tracing_data =3D perf_event__process_tracing_data; trace->tool.build_id =3D perf_event__process_build_id; trace->tool.namespaces =3D perf_event__process_namespaces; + trace->tool.kmod_sec_map =3D perf_event__process_kmod_sec_map; =20 trace->tool.ordered_events =3D true; trace->tool.ordering_requires_timestamps =3D true; diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index a839b30c981b..3d26781eb418 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -94,6 +94,7 @@ struct perf_tool build_id__mark_dso_hit_ops =3D { .exit =3D perf_event__exit_del_thread, .attr =3D perf_event__process_attr, .build_id =3D perf_event__process_build_id, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, }; =20 diff --git a/tools/perf/util/data-convert-bt.c b/tools/perf/util/data-conve= rt-bt.c index b842273458b8..200703c15cdc 100644 --- a/tools/perf/util/data-convert-bt.c +++ b/tools/perf/util/data-convert-bt.c @@ -1621,6 +1621,7 @@ int bt_convert__perf2ctf(const char *input, const cha= r *path, .tracing_data =3D perf_event__process_tracing_data, .build_id =3D perf_event__process_build_id, .namespaces =3D perf_event__process_namespaces, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-con= vert-json.c index ba9d93ce9463..b0e5dbcaccc7 100644 --- a/tools/perf/util/data-convert-json.c +++ b/tools/perf/util/data-convert-json.c @@ -326,6 +326,7 @@ int bt_convert__perf2json(const char *input_name, const= char *output_name, .auxtrace_info =3D perf_event__process_auxtrace_info, .auxtrace =3D perf_event__process_auxtrace, .event_update =3D perf_event__process_event_update, + .kmod_sec_map =3D perf_event__process_kmod_sec_map, .ordered_events =3D true, .ordering_requires_timestamps =3D true, }, diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1b03061440bc..b13418a773a7 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c @@ -297,6 +297,16 @@ size_t perf_event__fprintf_mmap(union perf_event *even= t, FILE *fp) event->mmap.filename); } =20 +size_t perf_event__fprintf_kmod_sec_map(union perf_event *event, FILE *fp) +{ + struct perf_record_kmod_sec_map *ksm =3D &event->kmod_sec_map; + + return fprintf(fp, " %d: [%#" PRI_lx64 "(%#" PRI_lx64 ") @ %#" PRI_lx64 "= ]: %c %s %s\n", + ksm->pid, ksm->start, ksm->len, ksm->pgoff, + (event->header.misc & PERF_RECORD_MISC_MMAP_DATA) ? 'r' : 'x', + ksm->data, ksm->data + ksm->sec_name_len + 2); +} + size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp) { if (event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID) { @@ -379,6 +389,14 @@ int perf_event__process_mmap2(struct perf_tool *tool _= _maybe_unused, return machine__process_mmap2_event(machine, event, sample); } =20 +int perf_event__process_kmod_sec_map(struct perf_tool *tool __maybe_unused, + union perf_event *event, + struct perf_sample *sample __maybe_unused, + struct machine *machine) +{ + return machine__process_kmod_sec_map_event(machine, event); +} + size_t perf_event__fprintf_task(union perf_event *event, FILE *fp) { return fprintf(fp, "(%d:%d):(%d:%d)\n", @@ -554,6 +572,9 @@ size_t perf_event__fprintf(union perf_event *event, str= uct machine *machine, FIL case PERF_RECORD_AUX_OUTPUT_HW_ID: ret +=3D perf_event__fprintf_aux_output_hw_id(event, fp); break; + case PERF_RECORD_KMOD_SEC_MAP: + ret +=3D perf_event__fprintf_kmod_sec_map(event, fp); + break; default: ret +=3D fprintf(fp, "\n"); } diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index 6663a676eadc..90f2eff24f8d 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h @@ -310,6 +310,10 @@ int perf_event__process_mmap2(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample, struct machine *machine); +int perf_event__process_kmod_sec_map(struct perf_tool *tool, + union perf_event *event, + struct perf_sample *sample, + struct machine *machine); int perf_event__process_fork(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample, @@ -343,6 +347,7 @@ const char *perf_event__name(unsigned int id); size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); +size_t perf_event__fprintf_kmod_sec_map(union perf_event *event, FILE *fp); size_t perf_event__fprintf_task(union perf_event *event, FILE *fp); size_t perf_event__fprintf_aux(union perf_event *event, FILE *fp); size_t perf_event__fprintf_itrace_start(union perf_event *event, FILE *fp); diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index ab2919bc0a0d..a98cf3b4599b 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -36,6 +36,7 @@ #include // page_size #include "cgroup.h" #include "arm64-frame-pointer-unwind-support.h" +#include "api/fs/fs.h" =20 #include #include @@ -1595,6 +1596,188 @@ static int machine__create_module(void *arg, const = char *name, u64 start, return 0; } =20 +/* Works only for host modules. */ +static int __machine_create_modules_sections(struct maps *kmaps, struct ma= p *map, + struct list_head *tmp_map_list) +{ + const char *sysfs =3D sysfs__mountpoint(); + char path[PATH_MAX]; + struct dirent *dent; + Elf_Scn *sec =3D NULL; + struct dso *sec_dso; + struct map *sec_map; + size_t shstrndx; + GElf_Shdr shdr; + char *mod_name; + char *sname; + int ret =3D 0; + u64 start; + int found; + DIR *dir; + Elf *elf; + int fd; + + if (!sysfs) + return -1; + + fd =3D open(map->dso->long_name, O_RDONLY); /* XXX: What if file is compr= essed? */ + if (fd < 0) + return -errno; + + /* [modulename] =3D> modulename */ + mod_name =3D strdup(&map->dso->short_name[1]); + if (!mod_name) + return -1; + mod_name[map->dso->short_name_len - 2] =3D '\0'; + + elf =3D elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); + if (elf =3D=3D NULL) { + ret =3D -1; + goto out_free_mod_name; + } + + if (elf_getshdrstrndx(elf, &shstrndx) !=3D 0) { + ret =3D -errno; + goto out_elf_end; + } + + snprintf(path, PATH_MAX, "%s/module/%s/sections/", sysfs, mod_name); + dir =3D opendir(path); + if (!dir) { + ret =3D -errno; + goto out_elf_end; + } + + while ((dent =3D readdir(dir))) { + if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) + continue; + + found =3D 0; + sec =3D NULL; + while ((sec =3D elf_nextscn(elf, sec)) !=3D NULL) { + gelf_getshdr(sec, &shdr); + sname =3D elf_strptr(elf, shstrndx, shdr.sh_name); + if (!sname) + continue; + + if (strncmp(dent->d_name, sname, PATH_MAX)) + continue; + found =3D 1; + break; + } + + if (!found) + continue; + + if (!(shdr.sh_flags & SHF_ALLOC)) + continue; + + /* + * .init sections are removed once module init is done. But + * their stale addresses remain in sysfs sections list. Later, + * kernel can allocate the same address range to other module, + * and in such cases, addresses provided by sysfs will overlap + * across different modules. Ignore init sections. + */ + if (strstarts(dent->d_name, ".init")) + continue; + + if (!strcmp(dent->d_name, ".text")) { + map->end =3D map->start + shdr.sh_size; + map->pgoff =3D shdr.sh_offset; + continue; + } + + snprintf(path, PATH_MAX, "module/%s/sections/%s", mod_name, dent->d_name= ); + + if (sysfs__read_ull(path, (unsigned long long *)&start) < 0) + continue; + + sec_dso =3D dso__new(map->dso->long_name); + if (!sec_dso) { + ret =3D -1; + goto out; + } + + sec_dso->kernel =3D map->dso->kernel; + sec_dso->symtab_type =3D map->dso->symtab_type; + sec_dso->long_name_len =3D map->dso->long_name_len; + sec_dso->short_name =3D NULL; + ret =3D asprintf((char **)&sec_dso->short_name, "%s%s", + map->dso->short_name, sname); + if (ret < 0 || !sec_dso->short_name) { + ret =3D -1; + goto out; + } + sec_dso->short_name_allocated =3D true; + + sec_map =3D map__new2(start, sec_dso); + dso__put(sec_dso); + if (!sec_map) { + ret =3D -1; + goto out; + } + + sec_map->end =3D start + shdr.sh_size; + sec_map->pgoff =3D shdr.sh_offset; + sec_map->sec_map =3D true; + + map__kmap(sec_map)->kmaps =3D kmaps; + + /* + * We are adding this new map in a temporary list. We need + * to keep map->refcnt non-zero until we insert this map in + * machine->kmaps. So don't call map__put() here. It should + * be done by the caller. + */ + list_add(&sec_map->node, tmp_map_list); + } + +out: + closedir(dir); +out_elf_end: + elf_end(elf); +out_free_mod_name: + free(mod_name); + close(fd); + return ret; +} + +static int machine_create_modules_sections(struct machine *machine) +{ + struct maps *kmaps =3D machine__kernel_maps(machine); + LIST_HEAD(tmp_map_list); + struct map *map, *tmp; + + maps__for_each_entry(kmaps, map) { + if (!__map__is_kmodule(map) || map->sec_map) + continue; + /* + * Although we haven't added any section specific maps to + * machine->kmaps yet, we would have changed .text section + * map's address range of prev modules. And we don't have + * a way to revert those back if this function fails. So + * just continue with debug message. + */ + if (__machine_create_modules_sections(kmaps, map, &tmp_map_list) < 0) + pr_debug("Couldn't prepare section maps of %s\n", map->dso->short_name); + } + + list_for_each_entry_safe(map, tmp, &tmp_map_list, node) { + list_del(&map->node); + maps__insert(kmaps, map); + /* + * Add it before we drop the reference to map, i.e. while we + * still are sure to have a reference to this DSO via *map->dso. + */ + dsos__add(&machine->dsos, map->dso); + /* kmaps already got it */ + map__put(map); + } + + return 0; +} + static int machine__create_modules(struct machine *machine) { const char *modules; @@ -1616,6 +1799,13 @@ static int machine__create_modules(struct machine *m= achine) if (machine__set_modules_path(machine)) pr_debug("Problems setting modules path maps, continuing anyway...\n"); =20 + /* + * We don't have access to guest sysfs. So section specific maps + * are created only for host modules. + */ + if (!machine__is_default_guest(machine)) + return machine_create_modules_sections(machine); + return 0; } =20 @@ -1982,6 +2172,80 @@ int machine__process_mmap_event(struct machine *mach= ine, union perf_event *event return 0; } =20 +/* sec maps are saved only for host modules. */ +int machine__process_kmod_sec_map_event(struct machine *machine, union per= f_event *event) +{ + struct perf_record_kmod_sec_map *ksm; + char *mod_name, *ptr; + struct maps *kmaps; + struct map *map; + struct dso *dso; + int ret; + + if (dump_trace) + perf_event__fprintf_kmod_sec_map(event, stdout); + + ksm =3D &event->kmod_sec_map; + + mod_name =3D strrchr(ksm->data + ksm->sec_name_len + 1, '/') + 1; + ptr =3D strstr(mod_name, ".ko"); + if (mod_name =3D=3D (char *)1 || !ptr || ptr =3D=3D mod_name) + goto err; + + dso =3D dso__new(ksm->data + ksm->sec_name_len + 1); + if (!dso) + goto err; + + dso->kernel =3D DSO_SPACE__KERNEL; + /* XXX: What about DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP? */ + dso->symtab_type =3D DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; + + ret =3D asprintf((char **)&dso->short_name, "[%.*s]%.*s", (int)(ptr - mod= _name), + mod_name, ksm->sec_name_len - 1, ksm->data); + if (ret < 0 || !dso->short_name) { + dso__put(dso); + goto err; + } + dso->short_name_allocated =3D true; + dso->short_name_len =3D strlen(dso->short_name); + + dso->long_name =3D strdup(ksm->data + ksm->sec_name_len + 1); + if (!dso->long_name) { + dso__put(dso); + goto err; + } + dso->long_name_allocated =3D true; + dso->long_name_len =3D ksm->filename_len - 1; + + map =3D map__new2(ksm->start, dso); + dso__put(dso); + if (!map) + goto err; + + map->end =3D map->start + ksm->len; + map->pgoff =3D ksm->pgoff; + map->sec_map =3D 1; + + kmaps =3D machine__kernel_maps(machine); + map__kmap(map)->kmaps =3D kmaps; + maps__insert(kmaps, map); + + /* + * Add it before we drop the reference to sec_map, i.e. + * while we still are sure to have a reference to this + * DSO via *sec_map->dso. + */ + dsos__add(&machine->dsos, dso); + /* kmaps already got it */ + map__put(map); + + return 0; + +err: + dump_printf("problem processing PERF_RECORD_KMOD_SEC_MAP, skipping event.= \n"); + return -1; +} + static void __machine__remove_thread(struct machine *machine, struct threa= d *th, bool lock) { struct threads *threads =3D machine__threads(machine, th->tid); diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h index d034ecaf89c1..3524587f7c06 100644 --- a/tools/perf/util/machine.h +++ b/tools/perf/util/machine.h @@ -146,6 +146,8 @@ int machine__process_mmap_event(struct machine *machine= , union perf_event *event struct perf_sample *sample); int machine__process_mmap2_event(struct machine *machine, union perf_event= *event, struct perf_sample *sample); +int machine__process_kmod_sec_map_event(struct machine *machine, + union perf_event *event); int machine__process_ksymbol(struct machine *machine, union perf_event *event, struct perf_sample *sample); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index f3a3d9b3a40d..8325800581c5 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -114,6 +114,7 @@ void map__init(struct map *map, u64 start, u64 end, u64= pgoff, struct dso *dso) RB_CLEAR_NODE(&map->rb_node); map->erange_warned =3D false; refcount_set(&map->refcnt, 1); + map->sec_map =3D false; } =20 struct map *map__new(struct machine *machine, u64 start, u64 len, diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index 3dcfe06db6b3..4b3fa454ea24 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h @@ -20,6 +20,7 @@ struct map { struct rb_node rb_node; struct list_head node; }; + /* Range of a map [start, end). */ u64 start; u64 end; bool erange_warned:1; @@ -36,6 +37,9 @@ struct map { struct dso *dso; refcount_t refcnt; u32 flags; + + /* Indicates whether a map is of kernel module's elf section. */ + bool sec_map:1; }; =20 struct kmap; diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 4f5165cd58de..e1a568a1dcd2 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -999,10 +999,15 @@ static void perf_event__time_conv_swap(union perf_eve= nt *event, } } =20 -static void perf_event_kmod_sec_map_swap(union perf_event *event __maybe_u= nused, - bool sample_id_all __maybe_unused) +static void perf_event_kmod_sec_map_swap(union perf_event *event, + bool sample_id_all __maybe_unused) { - /* FIXME */ + event->kmod_sec_map.pid =3D bswap_32(event->kmod_sec_map.pid); + event->kmod_sec_map.start =3D bswap_64(event->kmod_sec_map.start); + event->kmod_sec_map.len =3D bswap_64(event->kmod_sec_map.len); + event->kmod_sec_map.pgoff =3D bswap_64(event->kmod_sec_map.pgoff); + event->kmod_sec_map.sec_name_len =3D bswap_16(event->kmod_sec_map.sec_nam= e_len); + event->kmod_sec_map.filename_len =3D bswap_16(event->kmod_sec_map.filenam= e_len); } =20 typedef void (*perf_event__swap_op)(union perf_event *event, diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c index 96767d1b3f1c..8d14faeebb8f 100644 --- a/tools/perf/util/symbol-elf.c +++ b/tools/perf/util/symbol-elf.c @@ -1137,6 +1137,7 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, struct maps *kmaps =3D kmap ? map__kmaps(map) : NULL; struct map *curr_map =3D map; struct dso *curr_dso =3D dso; + char *sec_map_name =3D NULL; Elf_Data *symstrs, *secstrs, *secstrs_run, *secstrs_sym; uint32_t nr_syms; int err =3D -1; @@ -1236,6 +1237,10 @@ dso__load_sym_internal(struct dso *dso, struct map *= map, struct symsrc *syms_ss, remap_kernel =3D true; adjust_kernel_syms =3D dso->adjust_symbols; } + + if (map->sec_map) + sec_map_name =3D strchr(dso->short_name, ']') + 1; + elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) { struct symbol *f; const char *elf_name =3D elf_sym__name(&sym, symstrs); @@ -1315,6 +1320,8 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, continue; =20 section_name =3D elf_sec__name(&shdr, secstrs); + if (sec_map_name && strcmp(sec_map_name, section_name)) + continue; =20 /* On ARM, symbols for thumb functions have 1 added to * the symbol address as a flag - remove it */ @@ -1323,7 +1330,7 @@ dso__load_sym_internal(struct dso *dso, struct map *m= ap, struct symsrc *syms_ss, (sym.st_value & 1)) --sym.st_value; =20 - if (dso->kernel) { + if (dso->kernel && !map->sec_map) { if (dso__process_kernel_symbol(dso, map, &sym, &shdr, kmaps, kmap, &cur= r_dso, &curr_map, section_name, adjust_kernel_syms, kmodule, &remap_kernel)) goto out_elf_end; diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index a3a165ae933a..2407c047974c 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1121,7 +1121,7 @@ static int do_validate_kcore_modules(const char *file= name, struct maps *kmaps) maps__for_each_entry(kmaps, old_map) { struct module_info *mi; =20 - if (!__map__is_kmodule(old_map)) { + if (!__map__is_kmodule(old_map) || old_map->sec_map) { continue; } =20 diff --git a/tools/perf/util/synthetic-events.c b/tools/perf/util/synthetic= -events.c index 2e145517f192..f8a91113e93b 100644 --- a/tools/perf/util/synthetic-events.c +++ b/tools/perf/util/synthetic-events.c @@ -665,6 +665,40 @@ int perf_event__synthesize_cgroups(struct perf_tool *t= ool __maybe_unused, } #endif =20 +static void __perf_event__synthesize_modules_sec_map(struct machine *machi= ne, + struct map *map, + union perf_event *event) +{ + size_t sec_name_len; + size_t size; + char *ptr; + + ptr =3D strchr(map->dso->short_name, ']') + 1; + if (!*ptr) + return; + + sec_name_len =3D strlen(ptr); + size =3D PERF_ALIGN(sec_name_len + map->dso->long_name_len + 2, sizeof(u6= 4)); + + event->kmod_sec_map.header.type =3D PERF_RECORD_KMOD_SEC_MAP; + event->kmod_sec_map.header.size =3D sizeof(event->kmod_sec_map) + + size + + machine->id_hdr_size; + + memset(event->kmod_sec_map.data + size, 0, machine->id_hdr_size); + + event->kmod_sec_map.pid =3D machine->pid; + event->kmod_sec_map.start =3D map->start; + event->kmod_sec_map.len =3D map->end - map->start; + event->kmod_sec_map.pgoff =3D map->pgoff; + event->kmod_sec_map.sec_name_len =3D sec_name_len + 1; + event->kmod_sec_map.filename_len =3D map->dso->long_name_len + 1; + + memcpy(event->kmod_sec_map.data, ptr, sec_name_len + 1); + memcpy(event->kmod_sec_map.data + sec_name_len + 2, map->dso->long_name, + map->dso->long_name_len + 1); +} + static void __perf_event__synthesize_modules_mmap2(struct machine *machine, struct map *map, union perf_event *event) @@ -715,7 +749,7 @@ int perf_event__synthesize_modules(struct perf_tool *to= ol, perf_event__handler_t int rc =3D 0; struct map *pos; struct maps *maps =3D machine__kernel_maps(machine); - union perf_event *event; + union perf_event *event, *sec_event; size_t size =3D symbol_conf.buildid_mmap2 ? sizeof(event->mmap2) : sizeof(event->mmap); =20 @@ -726,30 +760,47 @@ int perf_event__synthesize_modules(struct perf_tool *= tool, perf_event__handler_t return -1; } =20 + /* Length of section name and filenames are capped at PATH_MAX */ + sec_event =3D zalloc(sizeof(event->kmod_sec_map) + (2 * PATH_MAX) + machi= ne->id_hdr_size); + if (sec_event =3D=3D NULL) { + free(event); + pr_debug("Not enough memory synthesizing mmap event " + "for kernel modules\n"); + return -1; + } + /* * kernel uses 0 for user space maps, see kernel/perf_event.c * __perf_event_mmap */ - if (machine__is_host(machine)) + if (machine__is_host(machine)) { event->header.misc =3D PERF_RECORD_MISC_KERNEL; - else + /* PERF_RECORD_KMOD_SEC_MAP is supported only on Host */ + sec_event->header.misc =3D PERF_RECORD_MISC_KERNEL; + } else { event->header.misc =3D PERF_RECORD_MISC_GUEST_KERNEL; + } =20 maps__for_each_entry(maps, pos) { if (!__map__is_kmodule(pos)) continue; =20 - if (symbol_conf.buildid_mmap2) + if (pos->sec_map) + __perf_event__synthesize_modules_sec_map(machine, pos, sec_event); + else if (symbol_conf.buildid_mmap2) __perf_event__synthesize_modules_mmap2(machine, pos, event); else __perf_event__synthesize_modules_mmap(machine, pos, event); =20 - if (perf_tool__process_synth_event(tool, event, machine, process) !=3D 0= ) { + rc =3D perf_tool__process_synth_event(tool, pos->sec_map ? sec_event : e= vent, + machine, process); + if (rc) { rc =3D -1; break; } } =20 + free(sec_event); free(event); return rc; } --=20 2.39.0