From nobody Mon Sep 15 09:28:16 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 4F3FFC54EBE for ; Thu, 12 Jan 2023 21:48:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234531AbjALVs3 (ORCPT ); Thu, 12 Jan 2023 16:48:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40728 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240345AbjALVrd (ORCPT ); Thu, 12 Jan 2023 16:47:33 -0500 Received: from mail-pf1-x435.google.com (mail-pf1-x435.google.com [IPv6:2607:f8b0:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2693A95BF for ; Thu, 12 Jan 2023 13:40:21 -0800 (PST) Received: by mail-pf1-x435.google.com with SMTP id i65so11320783pfc.0 for ; Thu, 12 Jan 2023 13:40:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=6nuL0A6b/Cc0UYziUfDk8TnmjwdlAAeWvEhDoJKmGGg=; b=h4yPXUpM4r5Qaaf1l3vXl7ZzDwfTEguwSCBWDkCCeXlC7UoH/Hn6Dvbb/QNdZULD3P QpmWnNV89arn29Y8fZns3qK1XzdXdf5OS/BjNz/nv3aZU9fggTD01LCl0IP1OAuzLFvR iqpyQfB9mrPqy6RgLAw7RCE7xn1tLzfAdlMaBjIK6Fgy0RW9pIdgQF+LccZpOuRoBjFn 6ymS+Y9Vz42FBpgu24knYF+rAWaXMfIn/Ew8ixRgIHUWavQDR11RejJqUkZ+gP+MVs6Y QI7jNerOp3oGBGZSoM5jI68pDWHat25n0KVwuTSSUmLfKjH59KZxPS8NBMNOv27dZzsJ JlgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=6nuL0A6b/Cc0UYziUfDk8TnmjwdlAAeWvEhDoJKmGGg=; b=UAstYBxOeR4OCWnRjWXPkOALlEk/EJ5Di5B9VjkDixCCe96Z9ccqn4NVYwayOCXNH7 rAYwd4XE1YNlxxlrj4QLWpJQLM3HG7PI5Wy96hYu/qOygl2f0TSeASC6iLlg9OTN9VrX kXJddvp2wZe/7jLMg1JTGOGDCq/fHrUgkDw1DvH8FTo61QdtSe9gb6vELqi/aoeaLti+ HO0JYsEleBGhbLCGZX5f2e5MaCCQ6HJk1zBYqCISDuDM3sDXOolha0ggh3SDYpoCMGBI Wp7qKYRpG/EP5p7Q+r/U9Hsu3gpyOAA5RCYoF/aiRsmOmDTZrOGHOdsMmPyDwYACmLTZ JaOg== X-Gm-Message-State: AFqh2krmBqL6IOJ7juG5zTdCk7nheKWpFkcLX6QVGlEDG/IwkoR11hTo HSj5aPjNwVi9UYRvhozUX6s= X-Google-Smtp-Source: AMrXdXvx4WDioRI5o5hNOn4FDnQL4K9ysgh6nuiXfKhf2xRQQAe6PjHrcFtj5LSaywE3krabmIfaFw== X-Received: by 2002:a05:6a00:1d03:b0:580:149a:5650 with SMTP id a3-20020a056a001d0300b00580149a5650mr79037670pfx.22.1673559620511; Thu, 12 Jan 2023 13:40:20 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:20 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu Subject: [PATCH 1/8] perf/core: Save the dynamic parts of sample data size Date: Thu, 12 Jan 2023 13:40:08 -0800 Message-Id: <20230112214015.1014857-2-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf sample data can be divided into parts. The event->header_size and event->id_header_size keep the static part of the sample data which is determined by the sample_type flags. But other parts like CALLCHAIN and BRANCH_STACK are changing dynamically so it needs to see the actual data. In preparation of handling repeated calls for perf_prepare_sample(), it can save the dynamic size to the perf sample data to avoid the duplicate work. Signed-off-by: Namhyung Kim Acked-by: Song Liu --- include/linux/perf_event.h | 2 ++ kernel/events/core.c | 17 ++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 03949d017ac9..16b980014449 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1103,6 +1103,7 @@ struct perf_sample_data { */ u64 sample_flags; u64 period; + u64 dyn_size; =20 /* * Fields commonly set by __perf_event_header__init_id(), @@ -1158,6 +1159,7 @@ static inline void perf_sample_data_init(struct perf_= sample_data *data, /* remaining struct members initialized in perf_prepare_sample() */ data->sample_flags =3D PERF_SAMPLE_PERIOD; data->period =3D period; + data->dyn_size =3D 0; =20 if (addr) { data->addr =3D addr; diff --git a/kernel/events/core.c b/kernel/events/core.c index eacc3702654d..8c8de26f04ab 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7593,7 +7593,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, =20 size +=3D data->callchain->nr; =20 - header->size +=3D size * sizeof(u64); + data->dyn_size +=3D size * sizeof(u64); } =20 if (sample_type & PERF_SAMPLE_RAW) { @@ -7619,7 +7619,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, data->raw =3D NULL; } =20 - header->size +=3D size; + data->dyn_size +=3D size; } =20 if (sample_type & PERF_SAMPLE_BRANCH_STACK) { @@ -7631,7 +7631,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, size +=3D data->br_stack->nr * sizeof(struct perf_branch_entry); } - header->size +=3D size; + data->dyn_size +=3D size; } =20 if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER)) @@ -7646,7 +7646,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, size +=3D hweight64(mask) * sizeof(u64); } =20 - header->size +=3D size; + data->dyn_size +=3D size; } =20 if (sample_type & PERF_SAMPLE_STACK_USER) { @@ -7671,7 +7671,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, size +=3D sizeof(u64) + stack_size; =20 data->stack_user_size =3D stack_size; - header->size +=3D size; + data->dyn_size +=3D size; } =20 if (filtered_sample_type & PERF_SAMPLE_WEIGHT_TYPE) @@ -7700,7 +7700,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, size +=3D hweight64(mask) * sizeof(u64); } =20 - header->size +=3D size; + data->dyn_size +=3D size; } =20 if (sample_type & PERF_SAMPLE_PHYS_ADDR && @@ -7745,8 +7745,11 @@ void perf_prepare_sample(struct perf_event_header *h= eader, size =3D perf_prepare_sample_aux(event, data, size); =20 WARN_ON_ONCE(size + header->size > U16_MAX); - header->size +=3D size; + data->dyn_size +=3D size + sizeof(u64); /* size above */ } + + header->size +=3D data->dyn_size; + /* * If you're adding more sample types here, you likely need to do * something about the overflowing header::size, like repurpose the --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 27C35C54EBE for ; Thu, 12 Jan 2023 21:48:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240671AbjALVsd (ORCPT ); Thu, 12 Jan 2023 16:48:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40730 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240727AbjALVre (ORCPT ); Thu, 12 Jan 2023 16:47:34 -0500 Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 915DA6DBB8 for ; Thu, 12 Jan 2023 13:40:22 -0800 (PST) Received: by mail-pf1-x431.google.com with SMTP id c26so10354478pfp.10 for ; Thu, 12 Jan 2023 13:40:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=4JJiMcoWlhZgKB78U5VEVvQdWOzu1ox9DCMJw9an4s8=; b=kUvO4oovmAHHSaIoJ2m3MMu7qTo+mucZEpq2qcSyu3sEdW2HrH2rrQ6oAmVESctwp5 i1Vx3qMpoWOWGqLS5b2DooVkqmswps4vNl+zOWnSXVpiD6sC6fWILS6iWG5+SGPHEy0K WP1a/qe6NEewQOfIgjqtHxScWwYQ9XOBAwL8CcTAK1XIDDCsq9UlCLnaw7j7www4RjQ9 w0Qx/xy1Xqm6pN8vB6jrhrWW0AUTWH590XaDQce6pwQIvPw7W7OkOUEEEz3w09mzaP/2 MsWlfXtGvcFfO+Al2MrB0WxxosBw7P5OKP8TNBO6YkYPFsxy22nZZKQOVD2JXiREknNl wIXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4JJiMcoWlhZgKB78U5VEVvQdWOzu1ox9DCMJw9an4s8=; b=rpnkH8yLIYcnLieHfGx1DprTpBVHdKZTeZalSGLFXk5o5wamw5pw/8tDuztFelP1PC m1ZYPLo0MKDaSWQ1SnxUwBnMOYXvAlJKFrKfAFPo2Vy441zgJUr2EfpLDeW+gnij3ZPj haN6HN4vFuE4AsNmgRsbG1iPZE6FPtx8P2zMevU3dWXDle3U21NrL8Ux9AIVi+bGERyn YWmGoX22zeersZTB7qRcgLYSJsOXX55wjH5PCYrRXIH8NW7BWvwBg906DwuVPCHOmTCt KB2XUyaCqgfprKUTWj6WH2F4owq5OvE4EadD7ejAaapV8GH86Y58Dfoz2bkQ0ahL7P5J /ihA== X-Gm-Message-State: AFqh2kovPSDG03YOiGHJKpjH6UGuEj/IwiyknAYlnQUInKQ18pHPNsRA Gzo54z81vP7Hhc0/Uza4aNL4IidDkdA= X-Google-Smtp-Source: AMrXdXtHDg7+JezyohMyRdwrtxboE7LbL/8+5LdVP47CiHY2iBqXL3dvGwfDDUNyqjtaAea8iTYtaA== X-Received: by 2002:a05:6a00:896:b0:586:35dd:91c3 with SMTP id q22-20020a056a00089600b0058635dd91c3mr25796905pfj.29.1673559621684; Thu, 12 Jan 2023 13:40:21 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:21 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu , x86@kernel.org Subject: [PATCH 2/8] perf/core: Add perf_sample_save_callchain() helper Date: Thu, 12 Jan 2023 13:40:09 -0800 Message-Id: <20230112214015.1014857-3-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When it saves the callchain to the perf sample data, it needs to update the sample flags and the dynamic size. To make sure this, add the perf_sample_save_callchain() helper and convert all call sites. Cc: x86@kernel.org Suggested-by: Peter Zijlstra Signed-off-by: Namhyung Kim Acked-by: Song Liu --- arch/x86/events/amd/ibs.c | 6 ++---- arch/x86/events/intel/ds.c | 12 ++++-------- include/linux/perf_event.h | 16 +++++++++++++++- kernel/events/core.c | 12 ++---------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c index da3f5ebac4e1..417c80bd3274 100644 --- a/arch/x86/events/amd/ibs.c +++ b/arch/x86/events/amd/ibs.c @@ -1122,10 +1122,8 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf= _ibs, struct pt_regs *iregs) * recorded as part of interrupt regs. Thus we need to use rip from * interrupt regs while unwinding call stack. */ - if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) { - data.callchain =3D perf_callchain(event, iregs); - data.sample_flags |=3D PERF_SAMPLE_CALLCHAIN; - } + if (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) + perf_sample_save_callchain(&data, event, iregs); =20 throttle =3D perf_event_overflow(event, &data, ®s); out: diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index 6ec326b47e2e..158cf845fc80 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -1617,10 +1617,8 @@ static void setup_pebs_fixed_sample_data(struct perf= _event *event, * previous PMI context or an (I)RET happened between the record and * PMI. */ - if (sample_type & PERF_SAMPLE_CALLCHAIN) { - data->callchain =3D perf_callchain(event, iregs); - data->sample_flags |=3D PERF_SAMPLE_CALLCHAIN; - } + if (sample_type & PERF_SAMPLE_CALLCHAIN) + perf_sample_save_callchain(data, event, iregs); =20 /* * We use the interrupt regs as a base because the PEBS record does not @@ -1795,10 +1793,8 @@ static void setup_pebs_adaptive_sample_data(struct p= erf_event *event, * previous PMI context or an (I)RET happened between the record and * PMI. */ - if (sample_type & PERF_SAMPLE_CALLCHAIN) { - data->callchain =3D perf_callchain(event, iregs); - data->sample_flags |=3D PERF_SAMPLE_CALLCHAIN; - } + if (sample_type & PERF_SAMPLE_CALLCHAIN) + perf_sample_save_callchain(data, event, iregs); =20 *regs =3D *iregs; /* The ip in basic is EventingIP */ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 16b980014449..a9419608402b 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1095,6 +1095,8 @@ int perf_event_read_local(struct perf_event *event, u= 64 *value, extern u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running); =20 +extern struct perf_callchain_entry *perf_callchain(struct perf_event *even= t, struct pt_regs *regs); + =20 struct perf_sample_data { /* @@ -1167,6 +1169,19 @@ static inline void perf_sample_data_init(struct perf= _sample_data *data, } } =20 +static inline void perf_sample_save_callchain(struct perf_sample_data *dat= a, + struct perf_event *event, + struct pt_regs *regs) +{ + int size =3D 1; + + data->callchain =3D perf_callchain(event, regs); + size +=3D data->callchain->nr; + + data->dyn_size +=3D size * sizeof(u64); + data->sample_flags |=3D PERF_SAMPLE_CALLCHAIN; +} + /* * Clear all bitfields in the perf_branch_entry. * The to and from fields are not cleared because they are @@ -1408,7 +1423,6 @@ extern void perf_callchain_kernel(struct perf_callcha= in_entry_ctx *entry, struct extern struct perf_callchain_entry * get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool us= er, u32 max_stack, bool crosstask, bool add_mark); -extern struct perf_callchain_entry *perf_callchain(struct perf_event *even= t, struct pt_regs *regs); extern int get_callchain_buffers(int max_stack); extern void put_callchain_buffers(void); extern struct perf_callchain_entry *get_callchain_entry(int *rctx); diff --git a/kernel/events/core.c b/kernel/events/core.c index 8c8de26f04ab..0fba98b9cd65 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7585,16 +7585,8 @@ void perf_prepare_sample(struct perf_event_header *h= eader, if (sample_type & (PERF_SAMPLE_IP | PERF_SAMPLE_CODE_PAGE_SIZE)) data->ip =3D perf_instruction_pointer(regs); =20 - if (sample_type & PERF_SAMPLE_CALLCHAIN) { - int size =3D 1; - - if (filtered_sample_type & PERF_SAMPLE_CALLCHAIN) - data->callchain =3D perf_callchain(event, regs); - - size +=3D data->callchain->nr; - - data->dyn_size +=3D size * sizeof(u64); - } + if (filtered_sample_type & PERF_SAMPLE_CALLCHAIN) + perf_sample_save_callchain(data, event, regs); =20 if (sample_type & PERF_SAMPLE_RAW) { struct perf_raw_record *raw =3D data->raw; --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 C52B0C61DB3 for ; Thu, 12 Jan 2023 21:48:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240862AbjALVsg (ORCPT ); Thu, 12 Jan 2023 16:48:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240730AbjALVrg (ORCPT ); Thu, 12 Jan 2023 16:47:36 -0500 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D18686DBA4; Thu, 12 Jan 2023 13:40:23 -0800 (PST) Received: by mail-pg1-x532.google.com with SMTP id h192so13691860pgc.7; Thu, 12 Jan 2023 13:40:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=l3GEYOgHwVgvJBmBnAdUL8BdmY/9n1zanIfz8U25Xac=; b=Gb11zOzI9XeCl+/zCSz8IqtHBx1WB/Pd3fb3E2R32TTjj2OD1cwX9X8V6TSptQQv4i MaFNBKnV3reJc2C/aH3UjumX3hFZ0Y+WpC9LSBGH4NS9RDx2XCa0C0kpe98OHCg08b+/ vLC6CfHccT4mUKZHJicRNjOpCGAbGjIQ25ywc2nSHkbHLq1kWI2hN08wxujg6BURrs/9 e1H0brQCK9Enl3zWbMiwOWn9y0wJw21x/i7Obphk7dBJDd1ss8j4b0ewmTwLr0qXH2ok kdFo2Kw81t/lH4lGnlX9pNWssTvKD88pq4ExF1dQmxEjfktEhXm6pIh0VJ30507tC08b UpYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=l3GEYOgHwVgvJBmBnAdUL8BdmY/9n1zanIfz8U25Xac=; b=bArBiHr6srPrm8CNsUgDFDCyq4aOETUOkiiZC0WUT5vgFJXLsJkalil9r+CTLbYY4a e1gH79HYO1PW257VpREAa0hAL+yoh3rRRjN73DlO1DXERa8+q1KsJsRWkw9Im+w9/bTl 7UgZdWuMJgPKOuhc5M51nKclANnJiiQ9z4xvw3UvSqoIhPXG92ZV4NpPiQLqnGLIp2fl WAUMNdASvvEWvhRYygEFeVOcyCZbMferFSb9zn/hT/W502/zauLaSHxTJvjiBc3ESVN3 i9PrlA6r72C5I26p4dGhwG4tBVru0hC36t+MRYud0jiarXCia+79sncB5cM1kvvIqGVk MSPw== X-Gm-Message-State: AFqh2koxHwOpdW9oD3R6SSrOya05GDWwL/U/Y9c2AxQGTGVtRbRAofHy 3Kk/jEX1yKPNuwaJycg/TDA= X-Google-Smtp-Source: AMrXdXubGB5Pd7aXclXke3/QKfLbDxQrtVVvLizKeXonP8BECBbNKliNCfkDMiH+agQTZxzwWIIevw== X-Received: by 2002:a62:cd4e:0:b0:58a:d606:4258 with SMTP id o75-20020a62cd4e000000b0058ad6064258mr11338748pfg.10.1673559623278; Thu, 12 Jan 2023 13:40:23 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:22 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu , linux-s390@vger.kernel.org, x86@kernel.org, bpf@vger.kernel.org Subject: [PATCH 3/8] perf/core: Add perf_sample_save_raw_data() helper Date: Thu, 12 Jan 2023 13:40:10 -0800 Message-Id: <20230112214015.1014857-4-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When it saves the raw_data to the perf sample data, it needs to update the sample flags and the dynamic size. To make sure this, add the perf_sample_save_raw_data() helper and convert all call sites. Cc: linux-s390@vger.kernel.org Cc: x86@kernel.org Cc: bpf@vger.kernel.org Suggested-by: Peter Zijlstra Signed-off-by: Namhyung Kim --- arch/s390/kernel/perf_cpum_cf.c | 4 +--- arch/s390/kernel/perf_pai_crypto.c | 4 +--- arch/s390/kernel/perf_pai_ext.c | 4 +--- arch/x86/events/amd/ibs.c | 3 +-- include/linux/perf_event.h | 33 +++++++++++++++++++++++++----- kernel/events/core.c | 31 +++++----------------------- kernel/trace/bpf_trace.c | 6 ++---- 7 files changed, 39 insertions(+), 46 deletions(-) diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_c= f.c index f043a7ff220b..aa38649c7c27 100644 --- a/arch/s390/kernel/perf_cpum_cf.c +++ b/arch/s390/kernel/perf_cpum_cf.c @@ -662,9 +662,7 @@ static int cfdiag_push_sample(struct perf_event *event, if (event->attr.sample_type & PERF_SAMPLE_RAW) { raw.frag.size =3D cpuhw->usedss; raw.frag.data =3D cpuhw->stop; - raw.size =3D raw.frag.size; - data.raw =3D &raw; - data.sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(&data, &raw); } =20 overflow =3D perf_event_overflow(event, &data, ®s); diff --git a/arch/s390/kernel/perf_pai_crypto.c b/arch/s390/kernel/perf_pai= _crypto.c index 985e243a2ed8..a7b339c4fd7c 100644 --- a/arch/s390/kernel/perf_pai_crypto.c +++ b/arch/s390/kernel/perf_pai_crypto.c @@ -362,9 +362,7 @@ static int paicrypt_push_sample(void) if (event->attr.sample_type & PERF_SAMPLE_RAW) { raw.frag.size =3D rawsize; raw.frag.data =3D cpump->save; - raw.size =3D raw.frag.size; - data.raw =3D &raw; - data.sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(&data, &raw); } =20 overflow =3D perf_event_overflow(event, &data, ®s); diff --git a/arch/s390/kernel/perf_pai_ext.c b/arch/s390/kernel/perf_pai_ex= t.c index 1138f57baae3..555597222bad 100644 --- a/arch/s390/kernel/perf_pai_ext.c +++ b/arch/s390/kernel/perf_pai_ext.c @@ -451,9 +451,7 @@ static int paiext_push_sample(void) if (event->attr.sample_type & PERF_SAMPLE_RAW) { raw.frag.size =3D rawsize; raw.frag.data =3D cpump->save; - raw.size =3D raw.frag.size; - data.raw =3D &raw; - data.sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(&data, &raw); } =20 overflow =3D perf_event_overflow(event, &data, ®s); diff --git a/arch/x86/events/amd/ibs.c b/arch/x86/events/amd/ibs.c index 417c80bd3274..64582954b5f6 100644 --- a/arch/x86/events/amd/ibs.c +++ b/arch/x86/events/amd/ibs.c @@ -1110,8 +1110,7 @@ static int perf_ibs_handle_irq(struct perf_ibs *perf_= ibs, struct pt_regs *iregs) .data =3D ibs_data.data, }, }; - data.raw =3D &raw; - data.sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(&data, &raw); } =20 if (perf_ibs =3D=3D &perf_ibs_op) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index a9419608402b..569dfac5887f 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -95,6 +95,11 @@ struct perf_raw_record { u32 size; }; =20 +static __always_inline bool perf_raw_frag_last(const struct perf_raw_frag = *frag) +{ + return frag->pad < sizeof(u64); +} + /* * branch stack layout: * nr: number of taken branches stored in entries[] @@ -1182,6 +1187,29 @@ static inline void perf_sample_save_callchain(struct= perf_sample_data *data, data->sample_flags |=3D PERF_SAMPLE_CALLCHAIN; } =20 +static inline void perf_sample_save_raw_data(struct perf_sample_data *data, + struct perf_raw_record *raw) +{ + struct perf_raw_frag *frag =3D &raw->frag; + u32 sum =3D 0; + int size; + + do { + sum +=3D frag->size; + if (perf_raw_frag_last(frag)) + break; + frag =3D frag->next; + } while (1); + + size =3D round_up(sum + sizeof(u32), sizeof(u64)); + raw->size =3D size - sizeof(u32); + frag->pad =3D raw->size - sum; + + data->raw =3D raw; + data->dyn_size +=3D size; + data->sample_flags |=3D PERF_SAMPLE_RAW; +} + /* * Clear all bitfields in the perf_branch_entry. * The to and from fields are not cleared because they are @@ -1690,11 +1718,6 @@ extern void perf_restore_debug_store(void); static inline void perf_restore_debug_store(void) { } #endif =20 -static __always_inline bool perf_raw_frag_last(const struct perf_raw_frag = *frag) -{ - return frag->pad < sizeof(u64); -} - #define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof= (x)) =20 struct perf_pmu_events_attr { diff --git a/kernel/events/core.c b/kernel/events/core.c index 0fba98b9cd65..133894ae5e30 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7588,30 +7588,10 @@ void perf_prepare_sample(struct perf_event_header *= header, if (filtered_sample_type & PERF_SAMPLE_CALLCHAIN) perf_sample_save_callchain(data, event, regs); =20 - if (sample_type & PERF_SAMPLE_RAW) { - struct perf_raw_record *raw =3D data->raw; - int size; - - if (raw && (data->sample_flags & PERF_SAMPLE_RAW)) { - struct perf_raw_frag *frag =3D &raw->frag; - u32 sum =3D 0; - - do { - sum +=3D frag->size; - if (perf_raw_frag_last(frag)) - break; - frag =3D frag->next; - } while (1); - - size =3D round_up(sum + sizeof(u32), sizeof(u64)); - raw->size =3D size - sizeof(u32); - frag->pad =3D raw->size - sum; - } else { - size =3D sizeof(u64); - data->raw =3D NULL; - } - - data->dyn_size +=3D size; + if (filtered_sample_type & PERF_SAMPLE_RAW) { + data->raw =3D NULL; + data->dyn_size +=3D sizeof(u64); + data->sample_flags |=3D PERF_SAMPLE_RAW; } =20 if (sample_type & PERF_SAMPLE_BRANCH_STACK) { @@ -10127,8 +10107,7 @@ void perf_tp_event(u16 event_type, u64 count, void = *record, int entry_size, }; =20 perf_sample_data_init(&data, 0, 0); - data.raw =3D &raw; - data.sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(&data, &raw); =20 perf_trace_buf_update(record, event_type); =20 diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 3bbd3f0c810c..ad37608afc35 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -687,8 +687,7 @@ BPF_CALL_5(bpf_perf_event_output, struct pt_regs *, reg= s, struct bpf_map *, map, } =20 perf_sample_data_init(sd, 0, 0); - sd->raw =3D &raw; - sd->sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(sd, &raw); =20 err =3D __bpf_perf_event_output(regs, map, flags, sd); =20 @@ -746,8 +745,7 @@ u64 bpf_event_output(struct bpf_map *map, u64 flags, vo= id *meta, u64 meta_size, =20 perf_fetch_caller_regs(regs); perf_sample_data_init(sd, 0, 0); - sd->raw =3D &raw; - sd->sample_flags |=3D PERF_SAMPLE_RAW; + perf_sample_save_raw_data(sd, &raw); =20 ret =3D __bpf_perf_event_output(regs, map, flags, sd); out: --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 D3B3FC677F1 for ; Thu, 12 Jan 2023 21:48:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240937AbjALVsk (ORCPT ); Thu, 12 Jan 2023 16:48:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40734 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240745AbjALVrg (ORCPT ); Thu, 12 Jan 2023 16:47:36 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6338A33D69 for ; Thu, 12 Jan 2023 13:40:25 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id w4-20020a17090ac98400b002186f5d7a4cso25060050pjt.0 for ; Thu, 12 Jan 2023 13:40:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=l2i4YuMUlvMifEh3T6Lz7Q3wr3VQ+FCqQlCzw4xiZBo=; b=XVZvrxt5WGZOPzCt8LDpJrjmv8glK3D9y2YETiG2e3W2V/XenVy70B5SsLUdUe6CJ8 6UgFVCsd19ClkBttPp76iWnpqwbRld6K+1rrvX+x9usSAFx1KN7utwRemqy3mMwTmp6i 5cIWZz8dg9F0eAoq/zcIdGiS3VORcbs8cCb4JomvOU9cgHxbaciaubTAB20K8GMEwTQq MJdb8q+EzilmfWBLgqGkIx7KJB29oIvaJikSM88/5xfyS5xqym3zjVixXkS7zTg9eFl7 o7akxkNjflSS2M4HHWEl0/ZiBHnHkOsFAevM0mBz/DuNeGqPICmdmB474dv8ZGASPWIl ryjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=l2i4YuMUlvMifEh3T6Lz7Q3wr3VQ+FCqQlCzw4xiZBo=; b=603cr7NjDr8QFhr9GZGpz1eW5uOp1eXKOUvt4nDfP9UE9oe4oQxoXqvAvaagjU/1ao BDV/ndEHHfwyrc/O9AJRPJUIQ4wwxn7CqaJSDF+QalyjYP3uGR+ELhFtjINLKwgk8IQb cj92fGXLuOxEpfy1lRYD7LA8kamCepEqgVGg2WSVlQRiULgatORZAfbjnk1Xu1dxfNy2 oek9dNxAummpY8AWQVAki/v07t5O+WVEYSRi2ZgfGqzDFZ+LHo+nYQpuWahz02AoxECz KqFGWqILOk4CQQU1Bmsl1FjLZ20LPCsbs8zCX+/kc4IJdxqWm6Ki0OROYqvuk6GWAKLk Umog== X-Gm-Message-State: AFqh2kpWiViZhhl40fW/fZ3fujjueot+b1XOQ2dERgeCApoOLa7auh2A wVECiwG1WzQ0FTuzZG6MXOw= X-Google-Smtp-Source: AMrXdXtikgEbLuS8PBAUlCH+VVw6Z27M5RL43urXbD+xL9SIzYFLx8fvlzFWjsI5cE+0fsN85JeXnw== X-Received: by 2002:a05:6a20:aa9f:b0:af:7762:3c29 with SMTP id ck31-20020a056a20aa9f00b000af77623c29mr9348181pzb.10.1673559624771; Thu, 12 Jan 2023 13:40:24 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:24 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu , linuxppc-dev@lists.ozlabs.org, x86@kernel.org Subject: [PATCH 4/8] perf/core: Add perf_sample_save_brstack() helper Date: Thu, 12 Jan 2023 13:40:11 -0800 Message-Id: <20230112214015.1014857-5-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" When it saves the branch stack to the perf sample data, it needs to update the sample flags and the dynamic size. To make sure this, add the perf_sample_save_brstack() helper and convert all call sites. Cc: linuxppc-dev@lists.ozlabs.org Cc: x86@kernel.org Suggested-by: Peter Zijlstra Signed-off-by: Namhyung Kim --- arch/powerpc/perf/core-book3s.c | 3 +- arch/x86/events/amd/core.c | 6 +-- arch/x86/events/intel/core.c | 6 +-- arch/x86/events/intel/ds.c | 9 ++--- include/linux/perf_event.h | 66 ++++++++++++++++++++------------- kernel/events/core.c | 16 +++----- 6 files changed, 53 insertions(+), 53 deletions(-) diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3= s.c index bf318dd9b709..8c1f7def596e 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -2313,8 +2313,7 @@ static void record_and_restart(struct perf_event *eve= nt, unsigned long val, struct cpu_hw_events *cpuhw; cpuhw =3D this_cpu_ptr(&cpu_hw_events); power_pmu_bhrb_read(event, cpuhw); - data.br_stack =3D &cpuhw->bhrb_stack; - data.sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; + perf_sample_save_brstack(&data, event, &cpuhw->bhrb_stack); } =20 if (event->attr.sample_type & PERF_SAMPLE_DATA_SRC && diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c index d6f3703e4119..463f3eb8bbd7 100644 --- a/arch/x86/events/amd/core.c +++ b/arch/x86/events/amd/core.c @@ -928,10 +928,8 @@ static int amd_pmu_v2_handle_irq(struct pt_regs *regs) if (!x86_perf_event_set_period(event)) continue; =20 - if (has_branch_stack(event)) { - data.br_stack =3D &cpuc->lbr_stack; - data.sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; - } + if (has_branch_stack(event)) + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack); =20 if (perf_event_overflow(event, &data, regs)) x86_pmu_stop(event, 0); diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 29d2d0411caf..14f0a746257d 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -3036,10 +3036,8 @@ static int handle_pmi_common(struct pt_regs *regs, u= 64 status) =20 perf_sample_data_init(&data, 0, event->hw.last_period); =20 - if (has_branch_stack(event)) { - data.br_stack =3D &cpuc->lbr_stack; - data.sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; - } + if (has_branch_stack(event)) + perf_sample_save_brstack(&data, event, &cpuc->lbr_stack); =20 if (perf_event_overflow(event, &data, regs)) x86_pmu_stop(event, 0); diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index 158cf845fc80..07c8a2cdc3ee 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -1720,10 +1720,8 @@ static void setup_pebs_fixed_sample_data(struct perf= _event *event, data->sample_flags |=3D PERF_SAMPLE_TIME; } =20 - if (has_branch_stack(event)) { - data->br_stack =3D &cpuc->lbr_stack; - data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; - } + if (has_branch_stack(event)) + perf_sample_save_brstack(data, event, &cpuc->lbr_stack); } =20 static void adaptive_pebs_save_regs(struct pt_regs *regs, @@ -1883,8 +1881,7 @@ static void setup_pebs_adaptive_sample_data(struct pe= rf_event *event, =20 if (has_branch_stack(event)) { intel_pmu_store_pebs_lbrs(lbr); - data->br_stack =3D &cpuc->lbr_stack; - data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; + perf_sample_save_brstack(data, event, &cpuc->lbr_stack); } } =20 diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 569dfac5887f..7db0e9cc2682 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1102,6 +1102,31 @@ extern u64 perf_event_read_value(struct perf_event *= event, =20 extern struct perf_callchain_entry *perf_callchain(struct perf_event *even= t, struct pt_regs *regs); =20 +static inline bool branch_sample_no_flags(const struct perf_event *event) +{ + return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_NO_FLAGS; +} + +static inline bool branch_sample_no_cycles(const struct perf_event *event) +{ + return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_NO_CYCLES; +} + +static inline bool branch_sample_type(const struct perf_event *event) +{ + return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_TYPE_SAVE; +} + +static inline bool branch_sample_hw_index(const struct perf_event *event) +{ + return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX; +} + +static inline bool branch_sample_priv(const struct perf_event *event) +{ + return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_PRIV_SAVE; +} + =20 struct perf_sample_data { /* @@ -1210,6 +1235,21 @@ static inline void perf_sample_save_raw_data(struct = perf_sample_data *data, data->sample_flags |=3D PERF_SAMPLE_RAW; } =20 +static inline void perf_sample_save_brstack(struct perf_sample_data *data, + struct perf_event *event, + struct perf_branch_stack *brs) +{ + int size =3D sizeof(u64); /* nr */ + + if (branch_sample_hw_index(event)) + size +=3D sizeof(u64); + size +=3D brs->nr * sizeof(struct perf_branch_entry); + + data->br_stack =3D brs; + data->dyn_size +=3D size; + data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; +} + /* * Clear all bitfields in the perf_branch_entry. * The to and from fields are not cleared because they are @@ -1827,30 +1867,4 @@ static inline void perf_lopwr_cb(bool mode) } #endif =20 -#ifdef CONFIG_PERF_EVENTS -static inline bool branch_sample_no_flags(const struct perf_event *event) -{ - return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_NO_FLAGS; -} - -static inline bool branch_sample_no_cycles(const struct perf_event *event) -{ - return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_NO_CYCLES; -} - -static inline bool branch_sample_type(const struct perf_event *event) -{ - return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_TYPE_SAVE; -} - -static inline bool branch_sample_hw_index(const struct perf_event *event) -{ - return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX; -} - -static inline bool branch_sample_priv(const struct perf_event *event) -{ - return event->attr.branch_sample_type & PERF_SAMPLE_BRANCH_PRIV_SAVE; -} -#endif /* CONFIG_PERF_EVENTS */ #endif /* _LINUX_PERF_EVENT_H */ diff --git a/kernel/events/core.c b/kernel/events/core.c index 133894ae5e30..0218b6ffaf36 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7317,7 +7317,7 @@ void perf_output_sample(struct perf_output_handle *ha= ndle, } =20 if (sample_type & PERF_SAMPLE_BRANCH_STACK) { - if (data->sample_flags & PERF_SAMPLE_BRANCH_STACK) { + if (data->br_stack) { size_t size; =20 size =3D data->br_stack->nr @@ -7594,16 +7594,10 @@ void perf_prepare_sample(struct perf_event_header *= header, data->sample_flags |=3D PERF_SAMPLE_RAW; } =20 - if (sample_type & PERF_SAMPLE_BRANCH_STACK) { - int size =3D sizeof(u64); /* nr */ - if (data->sample_flags & PERF_SAMPLE_BRANCH_STACK) { - if (branch_sample_hw_index(event)) - size +=3D sizeof(u64); - - size +=3D data->br_stack->nr - * sizeof(struct perf_branch_entry); - } - data->dyn_size +=3D size; + if (filtered_sample_type & PERF_SAMPLE_BRANCH_STACK) { + data->br_stack =3D NULL; + data->dyn_size +=3D sizeof(u64); + data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; } =20 if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER)) --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 1DB9AC61DB3 for ; Thu, 12 Jan 2023 21:48:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241033AbjALVsq (ORCPT ); Thu, 12 Jan 2023 16:48:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240737AbjALVrg (ORCPT ); Thu, 12 Jan 2023 16:47:36 -0500 Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AD34834D77 for ; Thu, 12 Jan 2023 13:40:26 -0800 (PST) Received: by mail-pg1-x536.google.com with SMTP id g68so12597896pgc.11 for ; Thu, 12 Jan 2023 13:40:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=jvGUMU//A5tX7oB/uY4gCyETkJGZoTtytTEaxGlNFkw=; b=DbtSTDgDJTxKl+2n9fo09NLB/opC1JK/LEyqOK7lOQJv64J2oR1FoFfaFVtpS1s2/l wQSna2mI4B2LnQ8fuwmbeuHxnQQxpgdpQDHk3TSPSpd8LspQPFAQkHRubGw2Et/VbJGX MJJIA99ZwD4ZDb9hYQbjLlegbF54V93r0KFNykKo93ysNzjvUdjTeIs9ihmDy0yonkYv 0mnqYlRg87mYWV+N5Hgu3e2cCN4kmdosUGtjoENP0LtvK12aI1MUDYXhpR4YPK1zlSRV YFZS3MYhwbjeBIVoUvWrG8auaWZNmjYiQpvZvNb/LiVUZoQ+hmycMCeP0Haj2e75WQ6x dDpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=jvGUMU//A5tX7oB/uY4gCyETkJGZoTtytTEaxGlNFkw=; b=KfV857IvupEjxmyx9IOqdR5Eq1MpZljaeMiKv3KEXGp0o4iFd7gC6pn0EQ1OHlvNpx 9yJo6/xHHWW4lllHsibv0j4npt/cLUjXIaAuaQ1EUlZY4nS8dQGHrG9rhP9zUL1AL+un zRamAAN81lKBT1QCnWde4s1Ux5BvhXMiSudulxoZ5eF+AEg7HWkQQKZRXKOx6Fch//c+ TTd97ThglJWVmwB+LHNjpxEh394xED1Pmpv5xAjryJx4iT8tETu61RTA/I8KtkWD22P7 FktrEGDvbGRjSuWPXdRR9R4gPYJh2IYfg8UNm/ro7CAuo6zNfKgpp6GiPzSIBF83nCKV wV9w== X-Gm-Message-State: AFqh2krgBehD8mn90laFjE7WrAuT/jxRQ0GiKEkjMJIe63eL/iDIjT0B LJK70kVgEC7S7lByEoGodU2uv6TWSO4= X-Google-Smtp-Source: AMrXdXsfThK2Y6hcx1q0xA48Ay4pI+LKm8bJVZEP8KFQnDyakled3nsmI4jkyiU7SMXVMnpEcmoPOQ== X-Received: by 2002:a62:6d07:0:b0:581:b3f4:21f8 with SMTP id i7-20020a626d07000000b00581b3f421f8mr49054158pfc.31.1673559626075; Thu, 12 Jan 2023 13:40:26 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:25 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu Subject: [PATCH 5/8] perf/core: Set data->sample_flags in perf_prepare_sample() Date: Thu, 12 Jan 2023 13:40:12 -0800 Message-Id: <20230112214015.1014857-6-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The perf_prepare_sample() sets the perf_sample_data according to the attr->sample_type before copying it to the ring buffer. But BPF also wants to access the sample data so it needs to prepare the sample even before the regular path. That means the perf_prepare_sample() can be called more than once. Set the data->sample_flags consistently so that it can indicate which fields are set already and skip them if sets. Also update the filtered_sample_type to have the dependent flags to reduce the number of branches. Suggested-by: Peter Zijlstra Signed-off-by: Namhyung Kim --- kernel/events/core.c | 85 +++++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 0218b6ffaf36..7c5555051662 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7053,6 +7053,14 @@ static void perf_aux_sample_output(struct perf_event= *event, ring_buffer_put(rb); } =20 +/* + * A set of common sample data types saved even for non-sample records + * when event->attr.sample_id_all is set. + */ +#define PERF_SAMPLE_ID_ALL (PERF_SAMPLE_TID | PERF_SAMPLE_TIME | \ + PERF_SAMPLE_CPU | PERF_SAMPLE_ID | \ + PERF_SAMPLE_IDENTIFIER | PERF_SAMPLE_STREAM_ID) + static void __perf_event_header__init_id(struct perf_event_header *header, struct perf_sample_data *data, struct perf_event *event, @@ -7561,6 +7569,11 @@ perf_callchain(struct perf_event *event, struct pt_r= egs *regs) return callchain ?: &__empty_callchain; } =20 +static __always_inline u64 __cond_set(u64 flags, u64 s, u64 d) +{ + return d * !!(flags & s); +} + void perf_prepare_sample(struct perf_event_header *header, struct perf_sample_data *data, struct perf_event *event, @@ -7576,14 +7589,25 @@ void perf_prepare_sample(struct perf_event_header *= header, header->misc |=3D perf_misc_flags(regs); =20 /* - * Clear the sample flags that have already been done by the - * PMU driver. + * Add the sample flags that are dependent to others. And clear the + * sample flags that have already been done by the PMU driver. */ - filtered_sample_type =3D sample_type & ~data->sample_flags; + filtered_sample_type =3D sample_type; + filtered_sample_type |=3D __cond_set(sample_type, PERF_SAMPLE_CODE_PAGE_S= IZE, + PERF_SAMPLE_IP); + filtered_sample_type |=3D __cond_set(sample_type, PERF_SAMPLE_DATA_PAGE_S= IZE | + PERF_SAMPLE_PHYS_ADDR, PERF_SAMPLE_ADDR); + filtered_sample_type |=3D __cond_set(sample_type, PERF_SAMPLE_STACK_USER, + PERF_SAMPLE_REGS_USER); + filtered_sample_type &=3D ~data->sample_flags; + __perf_event_header__init_id(header, data, event, filtered_sample_type); + data->sample_flags |=3D sample_type & PERF_SAMPLE_ID_ALL; =20 - if (sample_type & (PERF_SAMPLE_IP | PERF_SAMPLE_CODE_PAGE_SIZE)) + if (filtered_sample_type & PERF_SAMPLE_IP) { data->ip =3D perf_instruction_pointer(regs); + data->sample_flags |=3D PERF_SAMPLE_IP; + } =20 if (filtered_sample_type & PERF_SAMPLE_CALLCHAIN) perf_sample_save_callchain(data, event, regs); @@ -7600,10 +7624,15 @@ void perf_prepare_sample(struct perf_event_header *= header, data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; } =20 - if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER)) + if (filtered_sample_type & PERF_SAMPLE_REGS_USER) perf_sample_regs_user(&data->regs_user, regs); =20 - if (sample_type & PERF_SAMPLE_REGS_USER) { + /* + * It cannot use the filtered_sample_type here as REGS_USER can be set + * by STACK_USER (using __cond_set() above) and we don't want to update + * the dyn_size if it's not requested by users. + */ + if ((sample_type & ~data->sample_flags) & PERF_SAMPLE_REGS_USER) { /* regs dump ABI info */ int size =3D sizeof(u64); =20 @@ -7613,9 +7642,10 @@ void perf_prepare_sample(struct perf_event_header *h= eader, } =20 data->dyn_size +=3D size; + data->sample_flags |=3D PERF_SAMPLE_REGS_USER; } =20 - if (sample_type & PERF_SAMPLE_STACK_USER) { + if (filtered_sample_type & PERF_SAMPLE_STACK_USER) { /* * Either we need PERF_SAMPLE_STACK_USER bit to be always * processed as the last one or have additional check added @@ -7638,23 +7668,30 @@ void perf_prepare_sample(struct perf_event_header *= header, =20 data->stack_user_size =3D stack_size; data->dyn_size +=3D size; + data->sample_flags |=3D PERF_SAMPLE_STACK_USER; } =20 - if (filtered_sample_type & PERF_SAMPLE_WEIGHT_TYPE) + if (filtered_sample_type & PERF_SAMPLE_WEIGHT_TYPE) { data->weight.full =3D 0; + data->sample_flags |=3D PERF_SAMPLE_WEIGHT_TYPE; + } =20 - if (filtered_sample_type & PERF_SAMPLE_DATA_SRC) + if (filtered_sample_type & PERF_SAMPLE_DATA_SRC) { data->data_src.val =3D PERF_MEM_NA; + data->sample_flags |=3D PERF_SAMPLE_DATA_SRC; + } =20 - if (filtered_sample_type & PERF_SAMPLE_TRANSACTION) + if (filtered_sample_type & PERF_SAMPLE_TRANSACTION) { data->txn =3D 0; + data->sample_flags |=3D PERF_SAMPLE_TRANSACTION; + } =20 - if (sample_type & (PERF_SAMPLE_ADDR | PERF_SAMPLE_PHYS_ADDR | PERF_SAMPLE= _DATA_PAGE_SIZE)) { - if (filtered_sample_type & PERF_SAMPLE_ADDR) - data->addr =3D 0; + if (filtered_sample_type & PERF_SAMPLE_ADDR) { + data->addr =3D 0; + data->sample_flags |=3D PERF_SAMPLE_ADDR; } =20 - if (sample_type & PERF_SAMPLE_REGS_INTR) { + if (filtered_sample_type & PERF_SAMPLE_REGS_INTR) { /* regs dump ABI info */ int size =3D sizeof(u64); =20 @@ -7667,19 +7704,22 @@ void perf_prepare_sample(struct perf_event_header *= header, } =20 data->dyn_size +=3D size; + data->sample_flags |=3D PERF_SAMPLE_REGS_INTR; } =20 - if (sample_type & PERF_SAMPLE_PHYS_ADDR && - filtered_sample_type & PERF_SAMPLE_PHYS_ADDR) + if (filtered_sample_type & PERF_SAMPLE_PHYS_ADDR) { data->phys_addr =3D perf_virt_to_phys(data->addr); + data->sample_flags |=3D PERF_SAMPLE_PHYS_ADDR; + } =20 #ifdef CONFIG_CGROUP_PERF - if (sample_type & PERF_SAMPLE_CGROUP) { + if (filtered_sample_type & PERF_SAMPLE_CGROUP) { struct cgroup *cgrp; =20 /* protected by RCU */ cgrp =3D task_css_check(current, perf_event_cgrp_id, 1)->cgroup; data->cgroup =3D cgroup_id(cgrp); + data->sample_flags |=3D PERF_SAMPLE_CGROUP; } #endif =20 @@ -7688,13 +7728,17 @@ void perf_prepare_sample(struct perf_event_header *= header, * require PERF_SAMPLE_ADDR, kernel implicitly retrieve the data->addr, * but the value will not dump to the userspace. */ - if (sample_type & PERF_SAMPLE_DATA_PAGE_SIZE) + if (filtered_sample_type & PERF_SAMPLE_DATA_PAGE_SIZE) { data->data_page_size =3D perf_get_page_size(data->addr); + data->sample_flags |=3D PERF_SAMPLE_DATA_PAGE_SIZE; + } =20 - if (sample_type & PERF_SAMPLE_CODE_PAGE_SIZE) + if (filtered_sample_type & PERF_SAMPLE_CODE_PAGE_SIZE) { data->code_page_size =3D perf_get_page_size(data->ip); + data->sample_flags |=3D PERF_SAMPLE_CODE_PAGE_SIZE; + } =20 - if (sample_type & PERF_SAMPLE_AUX) { + if (filtered_sample_type & PERF_SAMPLE_AUX) { u64 size; =20 header->size +=3D sizeof(u64); /* size */ @@ -7712,6 +7756,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, =20 WARN_ON_ONCE(size + header->size > U16_MAX); data->dyn_size +=3D size + sizeof(u64); /* size above */ + data->sample_flags |=3D PERF_SAMPLE_AUX; } =20 header->size +=3D data->dyn_size; --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 CFC9BC61DB3 for ; Thu, 12 Jan 2023 21:49:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233616AbjALVtC (ORCPT ); Thu, 12 Jan 2023 16:49:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40740 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240753AbjALVrg (ORCPT ); Thu, 12 Jan 2023 16:47:36 -0500 Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C14C01B9E1 for ; Thu, 12 Jan 2023 13:40:27 -0800 (PST) Received: by mail-pg1-x52c.google.com with SMTP id 78so13695745pgb.8 for ; Thu, 12 Jan 2023 13:40:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=N4u1T86SPW7EoRBLC3mtnjrxg1wEFO/gvDqxCBagRGw=; b=g2boBC2BF//Gt7s5eM0DpLOOf9GKDmw9dCXbKCVxn3Rc4ySTwhTOPDbYgzES96s/Ag Qy3QsA6+/d8B2HP2JNt5KCQK2yQAZXlbfIukJvdVSauX7qTxSWhtJSOD2dq+DmNy3ozc QVxY2k4m41lsnwWK6L3iwKL/50X1rA5WaGeDcKqWWb2gDtaMzdTaLnT7E3IGoCVQET6d i4fa6U+w93EnCxuIVWLPwfjzt0z62OJzRAyPEoghDGA90o5P6k9x4hXSmtXL37H13DZI 2+f0862alHk4m6hq0TaVdDma7By0OZr8vRac1Au8SEMUqJ6DyEPuQSo9TGATh1IbvcgN andA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=N4u1T86SPW7EoRBLC3mtnjrxg1wEFO/gvDqxCBagRGw=; b=nbOtx0/izdqL8J+U+8KknUOUOfFLcb4BZqZ/om5nOuaYZB/cwpCBic5GjvBO63u5i9 QU22P3v5vA9dZw6uyZeAuAcKeRYugFwG38/WAX86iMncaBbIyUWoZ+GRGTzEsOzkuvcH mAcBn2Q9DbgSjRBlkraJk1Jcljp8//5O+SSbYYUa6E1QZpojoWJPxiAeTB5Euq99mskA flOPze+iv/LYizMQXu6undUfcnOmiymr0TaGuloB6heVMQ/PRlpg1ai236Xwd2Sapxr6 czr6m0jV65OOpU0QIaGwS0iHZpT0OgG+sA7DFhTOQz6zX63Bgb5megXQfayT1hToAagt D3/g== X-Gm-Message-State: AFqh2kqk/0tHn1GtyiprZzN6muTnh+pupbBq0SlTueE363bQNPwEPSD4 2o5aTZj7g+uhqUOQKoajtSg= X-Google-Smtp-Source: AMrXdXsCM9xzUjJHGBhTX/7QX/FV0cUuHTocxkxl8saiLITQx82TI72ktLk5oNPSoU9fy9d5OPARdw== X-Received: by 2002:aa7:8649:0:b0:583:219a:670e with SMTP id a9-20020aa78649000000b00583219a670emr25677667pfo.30.1673559627191; Thu, 12 Jan 2023 13:40:27 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:26 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu Subject: [PATCH 6/8] perf/core: Do not pass header for sample id init Date: Thu, 12 Jan 2023 13:40:13 -0800 Message-Id: <20230112214015.1014857-7-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The only thing it does for header in __perf_event_header__init_id() is to update the header size with event->id_header_size. We can do this outside and get rid of the argument for the later change. Signed-off-by: Namhyung Kim Acked-by: Song Liu --- kernel/events/core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 7c5555051662..127dddd20f93 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7061,13 +7061,11 @@ static void perf_aux_sample_output(struct perf_even= t *event, PERF_SAMPLE_CPU | PERF_SAMPLE_ID | \ PERF_SAMPLE_IDENTIFIER | PERF_SAMPLE_STREAM_ID) =20 -static void __perf_event_header__init_id(struct perf_event_header *header, - struct perf_sample_data *data, +static void __perf_event_header__init_id(struct perf_sample_data *data, struct perf_event *event, u64 sample_type) { data->type =3D event->attr.sample_type; - header->size +=3D event->id_header_size; =20 if (sample_type & PERF_SAMPLE_TID) { /* namespace issues */ @@ -7094,8 +7092,10 @@ void perf_event_header__init_id(struct perf_event_he= ader *header, struct perf_sample_data *data, struct perf_event *event) { - if (event->attr.sample_id_all) - __perf_event_header__init_id(header, data, event, event->attr.sample_typ= e); + if (event->attr.sample_id_all) { + header->size +=3D event->id_header_size; + __perf_event_header__init_id(data, event, event->attr.sample_type); + } } =20 static void __perf_event__output_id_sample(struct perf_output_handle *hand= le, @@ -7583,7 +7583,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, u64 filtered_sample_type; =20 header->type =3D PERF_RECORD_SAMPLE; - header->size =3D sizeof(*header) + event->header_size; + header->size =3D sizeof(*header) + event->header_size + event->id_header_= size; =20 header->misc =3D 0; header->misc |=3D perf_misc_flags(regs); @@ -7601,7 +7601,7 @@ void perf_prepare_sample(struct perf_event_header *he= ader, PERF_SAMPLE_REGS_USER); filtered_sample_type &=3D ~data->sample_flags; =20 - __perf_event_header__init_id(header, data, event, filtered_sample_type); + __perf_event_header__init_id(data, event, filtered_sample_type); data->sample_flags |=3D sample_type & PERF_SAMPLE_ID_ALL; =20 if (filtered_sample_type & PERF_SAMPLE_IP) { --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 9A34DC678D4 for ; Thu, 12 Jan 2023 21:48:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233018AbjALVs5 (ORCPT ); Thu, 12 Jan 2023 16:48:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240757AbjALVrg (ORCPT ); Thu, 12 Jan 2023 16:47:36 -0500 Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 17E231B9F3; Thu, 12 Jan 2023 13:40:29 -0800 (PST) Received: by mail-pf1-x429.google.com with SMTP id 20so9371786pfu.13; Thu, 12 Jan 2023 13:40:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=cFiEc4fnXcWosSJZXgNQt+xQQqIdoE277uZe1x+iaq4=; b=bPETWCW5IbBSYQyy6jMD+fldm74bgEgo3vBdHRXKU3fnmlEGP0/eT6B0u73M/2AaA8 IyHPPe4jHkK0Mqa+tZkgNBza/2P4NC6Gs+eRQbyk/BP4gXjedz4eShGS743BR2XKU8lJ o7gjuCg2rtuHjcWL/U75YpXufj1FHXlQWL/oAQtd9HqbWs1Ta3iy7sV184SDWfXKIp/O HZvKzFb3XErNYlGNTIkXj6qNYEbh8jGJVIlb6G1Es9Ay7KvwaKzA1h46lFeFd4tuIVFj dGu1fC7IMoBpIbuqTqFrL4o6DJZJwAZCPZ4mnJ7Dw6ioHTKeQNCX4V70AMNzlsKPHMD+ 5lUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=cFiEc4fnXcWosSJZXgNQt+xQQqIdoE277uZe1x+iaq4=; b=edBeMQHaJQEbrIDYmow1C+o8Gxv77S7kcr0Z02IHyMsZOl+rxQ8Kbj1hwpMt0XX67v 6mtHCadfLkTfYHmGltT2/52duYYGQB9AAHeryI8vPNRUdw/VzuZp3Kz1YvARsTJcFidl yNvCeAGTWGi6j210zynVmuW7CqxZLilP/Q/1v+zPyl+2UeCsWTtvXfVDhohPaXAdkKCL l0h1dJEHYq2jMusrpcLcwSQ+EY9vJ9FsvCiwAeiG0Hym03DPoLT9r0MMknRy9uLpk4ue lPJ7cSGPB3Cn2CwGiI09WdLt0gV6oSi4z4aS1vUa4+1YK602ygWwVNCrPVqnl8Z0WDOd vBRA== X-Gm-Message-State: AFqh2kqGS4FSTLWzk+Zcj5fJT49UR9K7i8+ULho25kIKhzkGNBVNtzql wKv1bbuBOE+sQcyhb/FW6Zc= X-Google-Smtp-Source: AMrXdXtl1PJTJmv7dZW6vqrL/16Dcpwl/KSf0TEBH/jIL9IX3GY2dpbk9kGVN/lQNfCJ1CQS/Sh6Vw== X-Received: by 2002:aa7:9732:0:b0:580:d722:10e7 with SMTP id k18-20020aa79732000000b00580d72210e7mr71908290pfg.24.1673559628420; Thu, 12 Jan 2023 13:40:28 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:28 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu , linux-s390@vger.kernel.org, x86@kernel.org Subject: [PATCH 7/8] perf/core: Introduce perf_prepare_header() Date: Thu, 12 Jan 2023 13:40:14 -0800 Message-Id: <20230112214015.1014857-8-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Factor out perf_prepare_header() so that it can call perf_prepare_sample() without a header if not needed. Also it checks the filtered_sample_type to avoid duplicate work when perf_prepare_sample() is called twice (or more). Cc: linux-s390@vger.kernel.org Cc: x86@kernel.org Suggested-by: Peter Zijlstr Signed-off-by: Namhyung Kim Acked-by: Song Liu --- arch/s390/kernel/perf_cpum_sf.c | 3 ++- arch/x86/events/intel/ds.c | 3 ++- include/linux/perf_event.h | 16 +++++++++++++- kernel/events/core.c | 38 +++++++++++++++++++++------------ 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_s= f.c index 332a49965130..fd02f8423243 100644 --- a/arch/s390/kernel/perf_cpum_sf.c +++ b/arch/s390/kernel/perf_cpum_sf.c @@ -671,7 +671,8 @@ static void cpumsf_output_event_pid(struct perf_event *= event, /* Protect callchain buffers, tasks */ rcu_read_lock(); =20 - perf_prepare_sample(&header, data, event, regs); + perf_prepare_sample(data, event, regs); + perf_prepare_header(&header, data, event, regs); if (perf_output_begin(&handle, data, event, header.size)) goto out; =20 diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c index 07c8a2cdc3ee..183efa914b99 100644 --- a/arch/x86/events/intel/ds.c +++ b/arch/x86/events/intel/ds.c @@ -807,7 +807,8 @@ int intel_pmu_drain_bts_buffer(void) * the sample. */ rcu_read_lock(); - perf_prepare_sample(&header, &data, event, ®s); + perf_prepare_sample(&data, event, ®s); + perf_prepare_header(&header, &data, event, ®s); =20 if (perf_output_begin(&handle, &data, event, header.size * (top - base - skip))) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 7db0e9cc2682..d5628a7b5eaa 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1250,6 +1250,17 @@ static inline void perf_sample_save_brstack(struct p= erf_sample_data *data, data->sample_flags |=3D PERF_SAMPLE_BRANCH_STACK; } =20 +static inline u32 perf_sample_data_size(struct perf_sample_data *data, + struct perf_event *event) +{ + u32 size =3D sizeof(struct perf_event_header); + + size +=3D event->header_size + event->id_header_size; + size +=3D data->dyn_size; + + return size; +} + /* * Clear all bitfields in the perf_branch_entry. * The to and from fields are not cleared because they are @@ -1271,7 +1282,10 @@ extern void perf_output_sample(struct perf_output_ha= ndle *handle, struct perf_event_header *header, struct perf_sample_data *data, struct perf_event *event); -extern void perf_prepare_sample(struct perf_event_header *header, +extern void perf_prepare_sample(struct perf_sample_data *data, + struct perf_event *event, + struct pt_regs *regs); +extern void perf_prepare_header(struct perf_event_header *header, struct perf_sample_data *data, struct perf_event *event, struct pt_regs *regs); diff --git a/kernel/events/core.c b/kernel/events/core.c index 127dddd20f93..5c4f3fa3d2b7 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -7574,20 +7574,13 @@ static __always_inline u64 __cond_set(u64 flags, u6= 4 s, u64 d) return d * !!(flags & s); } =20 -void perf_prepare_sample(struct perf_event_header *header, - struct perf_sample_data *data, +void perf_prepare_sample(struct perf_sample_data *data, struct perf_event *event, struct pt_regs *regs) { u64 sample_type =3D event->attr.sample_type; u64 filtered_sample_type; =20 - header->type =3D PERF_RECORD_SAMPLE; - header->size =3D sizeof(*header) + event->header_size + event->id_header_= size; - - header->misc =3D 0; - header->misc |=3D perf_misc_flags(regs); - /* * Add the sample flags that are dependent to others. And clear the * sample flags that have already been done by the PMU driver. @@ -7601,6 +7594,12 @@ void perf_prepare_sample(struct perf_event_header *h= eader, PERF_SAMPLE_REGS_USER); filtered_sample_type &=3D ~data->sample_flags; =20 + if (filtered_sample_type =3D=3D 0) { + /* Make sure it has the correct data->type for output */ + data->type =3D event->attr.sample_type; + return; + } + __perf_event_header__init_id(data, event, filtered_sample_type); data->sample_flags |=3D sample_type & PERF_SAMPLE_ID_ALL; =20 @@ -7653,9 +7652,10 @@ void perf_prepare_sample(struct perf_event_header *h= eader, * up the rest of the sample size. */ u16 stack_size =3D event->attr.sample_stack_user; + u16 header_size =3D perf_sample_data_size(data, event); u16 size =3D sizeof(u64); =20 - stack_size =3D perf_sample_ustack_size(stack_size, header->size, + stack_size =3D perf_sample_ustack_size(stack_size, header_size, data->regs_user.regs); =20 /* @@ -7740,8 +7740,9 @@ void perf_prepare_sample(struct perf_event_header *he= ader, =20 if (filtered_sample_type & PERF_SAMPLE_AUX) { u64 size; + u16 header_size =3D perf_sample_data_size(data, event); =20 - header->size +=3D sizeof(u64); /* size */ + header_size +=3D sizeof(u64); /* size */ =20 /* * Given the 16bit nature of header::size, an AUX sample can @@ -7749,17 +7750,25 @@ void perf_prepare_sample(struct perf_event_header *= header, * Make sure this doesn't happen by using up to U16_MAX bytes * per sample in total (rounded down to 8 byte boundary). */ - size =3D min_t(size_t, U16_MAX - header->size, + size =3D min_t(size_t, U16_MAX - header_size, event->attr.aux_sample_size); size =3D rounddown(size, 8); size =3D perf_prepare_sample_aux(event, data, size); =20 - WARN_ON_ONCE(size + header->size > U16_MAX); + WARN_ON_ONCE(size + header_size > U16_MAX); data->dyn_size +=3D size + sizeof(u64); /* size above */ data->sample_flags |=3D PERF_SAMPLE_AUX; } +} =20 - header->size +=3D data->dyn_size; +void perf_prepare_header(struct perf_event_header *header, + struct perf_sample_data *data, + struct perf_event *event, + struct pt_regs *regs) +{ + header->type =3D PERF_RECORD_SAMPLE; + header->size =3D perf_sample_data_size(data, event); + header->misc =3D perf_misc_flags(regs); =20 /* * If you're adding more sample types here, you likely need to do @@ -7788,7 +7797,8 @@ __perf_event_output(struct perf_event *event, /* protect the callchain buffers */ rcu_read_lock(); =20 - perf_prepare_sample(&header, data, event, regs); + perf_prepare_sample(data, event, regs); + perf_prepare_header(&header, data, event, regs); =20 err =3D output_begin(&handle, data, event, header.size); if (err) --=20 2.39.0.314.g84b9a713c41-goog From nobody Mon Sep 15 09:28:16 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 20C48C61DB3 for ; Thu, 12 Jan 2023 21:49:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232807AbjALVtJ (ORCPT ); Thu, 12 Jan 2023 16:49:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240782AbjALVrh (ORCPT ); Thu, 12 Jan 2023 16:47:37 -0500 Received: from mail-pf1-x42f.google.com (mail-pf1-x42f.google.com [IPv6:2607:f8b0:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D223434756; Thu, 12 Jan 2023 13:40:29 -0800 (PST) Received: by mail-pf1-x42f.google.com with SMTP id a184so14781571pfa.9; Thu, 12 Jan 2023 13:40:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=hw1JZT4caRKOkdMu9I0bZSzXZiCQYqiKX0Yt62R8CcM=; b=RcFJQebsL1oo93IC8w4Oxta1bemGsbrJW5pMa303hyHmzRNvU7QBOBjeX85vkrLEMI Sk8rvxoUTPBaDeQKT680TOM72ra1sjElMwvEJgEJg0Ixa1MHLja3gUAB5dX2sqdGdS+B 2Ftg662VuXT/wTPCOj17BJlqy3JKqPcihaJF9+HMrbcRO0NM+nDcEmtBjx/IFreBBKcV hEYBr7jIEVgn3SgMffwhKIVJvoRsqwkc4pY6hlH3ftDgyMONnAebid7/JZlnztEwWDRL MZtAQtFWAI5VqoXoV9cSAyctDSmahTV6wIziVVoFz8qE/VCP3fHp+HqVMDhDeyg/RYwW YUJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hw1JZT4caRKOkdMu9I0bZSzXZiCQYqiKX0Yt62R8CcM=; b=xZZErkY3MCSEchY1+UfF4tsyDHjS/ACCM/gc7dyESV00VoHFtHow9BV1NIDHJ4hY8R wuePVcJpNEtaEt2NxTW690K6XTba6a/War6jjz83vKpu9OgSd3H10L8Xa5eIV0J/rQ1Y r8UH8uBvw8RFoOmucELfMnDyvaPqiXfvu7fyNFWE1Mne85ENP/N59LWGnLYJjPuTRof/ d/KJTbIDG+wkzs19C4LC2MypVhFldICGf9jfDr09YpcsfY5o7lXCjDg672YIBWsPvYMC ADOdl8pITXyaKTbm15IU1YsrCLbimL0sAwlSu2mO6pfal0tOb1dTCwGhH+PtHpv13X1i azfg== X-Gm-Message-State: AFqh2kpq7KwigFDN92GKJ8ZYmFn20s9PNMV8JM6IVtJNGKlmIzZyjKoH G8t7U4V+paN23YwCzzpAel8= X-Google-Smtp-Source: AMrXdXumgzPYKmHuVCA/C0WD1hyzao8lVSTgn1LDJ9sa/DSxpejlrQSYdKclEkw1PD+HtkBrLGNIAQ== X-Received: by 2002:a62:f211:0:b0:581:68ea:50 with SMTP id m17-20020a62f211000000b0058168ea0050mr56865082pfh.26.1673559629520; Thu, 12 Jan 2023 13:40:29 -0800 (PST) Received: from youngsil.svl.corp.google.com ([2620:15c:2d4:203:b71e:23d4:aa6a:47c0]) by smtp.gmail.com with ESMTPSA id q20-20020aa79834000000b0058134d2df41sm11344605pfl.146.2023.01.12.13.40.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Jan 2023 13:40:29 -0800 (PST) Sender: Namhyung Kim From: Namhyung Kim To: Peter Zijlstra Cc: Ingo Molnar , Mark Rutland , Alexander Shishkin , Arnaldo Carvalho de Melo , Jiri Olsa , LKML , Song Liu , bpf@vger.kernel.org Subject: [PATCH 8/8] perf/core: Call perf_prepare_sample() before running BPF Date: Thu, 12 Jan 2023 13:40:15 -0800 Message-Id: <20230112214015.1014857-9-namhyung@kernel.org> X-Mailer: git-send-email 2.39.0.314.g84b9a713c41-goog In-Reply-To: <20230112214015.1014857-1-namhyung@kernel.org> References: <20230112214015.1014857-1-namhyung@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" As BPF can access sample data, it needs to populate the data. Also remove the logic to get the callchain specifically as it's covered by the perf_prepare_sample() now. Cc: Song Liu Cc: bpf@vger.kernel.org Signed-off-by: Namhyung Kim Acked-by: Song Liu --- kernel/events/core.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 5c4f3fa3d2b7..af8365fb639a 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -10363,13 +10363,7 @@ static void bpf_overflow_handler(struct perf_event= *event, rcu_read_lock(); prog =3D READ_ONCE(event->prog); if (prog) { - if (prog->call_get_stack && - (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) && - !(data->sample_flags & PERF_SAMPLE_CALLCHAIN)) { - data->callchain =3D perf_callchain(event, regs); - data->sample_flags |=3D PERF_SAMPLE_CALLCHAIN; - } - + perf_prepare_sample(data, event, regs); ret =3D bpf_prog_run(prog, &ctx); } rcu_read_unlock(); --=20 2.39.0.314.g84b9a713c41-goog