From nobody Sun Nov 24 01:28:15 2024 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 52C3584DE0; Mon, 22 Apr 2024 10:49:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782982; cv=none; b=h/Rd/qyO7WkYxUe24h7wVZRqEj9WNY8FC3buhfxIbPd3068NsSHgOEqYWpFAPBzovRrF7eRJu/XDAKgnx+aixEXt4DMP2gq6VRgKfheIkuZOodPQAD3De/QIuSBh5ahwtL2H4MlS9y5VaDoLizfQSchqfJHysKwwIUCz203tWqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782982; c=relaxed/simple; bh=YjXWyHSEbgscaEgpxtkOZ2LyLY0BsD2fw1O+wecDHfg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lnnREEgGHMdd9eyz1H/Ujf+xeuyoLXn+MaNACn9oFmX2O3jmjbYscvHVEjXW9Jhmj9WKgZYmgXK7TCz0Hq3H+F6Tbpy6WGlnZ3BMCrg8RJ+Bzn/aYUvXx1RmJ5MUHJ4K/nrwgrRKKp+2ElbhtulVDHw34C0/6V1NC4H0QuY5ew4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DA1F51063; Mon, 22 Apr 2024 03:50:07 -0700 (PDT) Received: from e126817.cambridge.arm.com (e126817.cambridge.arm.com [10.2.3.5]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 8A9333F7BD; Mon, 22 Apr 2024 03:49:37 -0700 (PDT) From: Ben Gainey To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: ak@linux.intel.com, will@kernel.org, james.clark@arm.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Ben Gainey Subject: [RFC PATCH v2 1/4] perf: Allow periodic events to alternate between two sample periods Date: Mon, 22 Apr 2024 11:49:26 +0100 Message-ID: <20240422104929.264241-2-ben.gainey@arm.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240422104929.264241-1-ben.gainey@arm.com> References: <20240422104929.264241-1-ben.gainey@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change modifies perf_event_attr to add a second, alternative sample period field, and modifies the core perf overflow handling such that when specified an event will alternate between two sample periods. Currently, perf does not provide a mechanism for decoupling the period over which counters are counted from the period between samples. This is problematic for building a tool to measure per-function metrics derived from a sampled counter group. Ideally such a tool wants a very small sample window in order to correctly attribute the metrics to a given function, but prefers a larger sample period that provides representative coverage without excessive probe effect, triggering throttling, or generating excessive amounts of data. By alternating between a long and short sample_period and subsequently discarding the long samples, tools may decouple the period between samples that the tool cares about from the window of time over which interesting counts are collected. It is expected that typically tools would use this feature with the cycles or instructions events as an approximation for time, but no restrictions are applied to which events this can be applied to. Signed-off-by: Ben Gainey --- include/linux/perf_event.h | 5 +++++ include/uapi/linux/perf_event.h | 3 +++ kernel/events/core.c | 39 +++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index d2a15c0c6f8a..212bd302e548 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -267,6 +267,11 @@ struct hw_perf_event { */ u64 freq_time_stamp; u64 freq_count_stamp; + + /* + * Indicates that the alternative_sample_period is used + */ + bool using_alternative_sample_period; #endif }; =20 diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_even= t.h index 3a64499b0f5d..5c1701d091cf 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -379,6 +379,7 @@ enum perf_event_read_format { #define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ #define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ #define PERF_ATTR_SIZE_VER8 136 /* add: config3 */ +#define PERF_ATTR_SIZE_VER9 144 /* add: alternative_sample_period */ =20 /* * Hardware event_id to monitor via a performance monitoring event: @@ -522,6 +523,8 @@ struct perf_event_attr { __u64 sig_data; =20 __u64 config3; /* extension of config2 */ + + __u64 alternative_sample_period; }; =20 /* diff --git a/kernel/events/core.c b/kernel/events/core.c index 724e6d7e128f..07f1f931e18e 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4100,6 +4100,8 @@ static void perf_adjust_period(struct perf_event *eve= nt, u64 nsec, u64 count, bo s64 period, sample_period; s64 delta; =20 + WARN_ON_ONCE(hwc->using_alternative_sample_period); + period =3D perf_calculate_period(event, nsec, count); =20 delta =3D (s64)(period - hwc->sample_period); @@ -9552,6 +9554,7 @@ static int __perf_event_overflow(struct perf_event *e= vent, int throttle, struct perf_sample_data *data, struct pt_regs *regs) { + struct hw_perf_event *hwc =3D &event->hw; int events =3D atomic_read(&event->event_limit); int ret =3D 0; =20 @@ -9564,6 +9567,26 @@ static int __perf_event_overflow(struct perf_event *= event, =20 ret =3D __perf_event_account_interrupt(event, throttle); =20 + /* + * Swap the sample period to the alternative period + */ + if (event->attr.alternative_sample_period) { + bool using_alt =3D hwc->using_alternative_sample_period; + u64 sample_period =3D (using_alt ? event->attr.sample_period + : event->attr.alternative_sample_period); + + hwc->sample_period =3D sample_period; + hwc->using_alternative_sample_period =3D !using_alt; + + if (local64_read(&hwc->period_left) > 0) { + event->pmu->stop(event, PERF_EF_UPDATE); + + local64_set(&hwc->period_left, 0); + + event->pmu->start(event, PERF_EF_RELOAD); + } + } + /* * XXX event_limit might not quite work as expected on inherited * events @@ -12005,6 +12028,12 @@ perf_event_alloc(struct perf_event_attr *attr, int= cpu, =20 local64_set(&hwc->period_left, hwc->sample_period); =20 + /* + * alternative_sample_period cannot be used with freq + */ + if (attr->freq && attr->alternative_sample_period) + goto err_ns; + /* * We currently do not support PERF_SAMPLE_READ on inherited events. * See perf_output_read(). @@ -12459,9 +12488,19 @@ SYSCALL_DEFINE5(perf_event_open, if (attr.freq) { if (attr.sample_freq > sysctl_perf_event_sample_rate) return -EINVAL; + if (attr.alternative_sample_period) + return -EINVAL; } else { if (attr.sample_period & (1ULL << 63)) return -EINVAL; + if (attr.alternative_sample_period) { + if (!attr.sample_period) + return -EINVAL; + if (attr.alternative_sample_period & (1ULL << 63)) + return -EINVAL; + if (attr.alternative_sample_period =3D=3D attr.sample_period) + attr.alternative_sample_period =3D 0; + } } =20 /* Only privileged users can get physical addresses */ --=20 2.44.0 From nobody Sun Nov 24 01:28:15 2024 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 59DE0145B1D; Mon, 22 Apr 2024 10:49:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782983; cv=none; b=KYjZ7uqrqN21weldBTpksc1tauckMahQT8lTyfPFUqpTQxz/mJo3PXUoM7CVp6nGHwQqPTHYGUSXI2zJovkn1rscnM+GsOR45a8DxD10ryPrs33+R49kvEEDS26ZhEW+agd1ECmLhLOBNZWmwaM/LW+59VKEMP/daduEVOOuGZE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782983; c=relaxed/simple; bh=JlMo9/yymdi+OtMCepRzEEO4IMsqxHF7a01c0tOVimw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rVFgFEhCLG55VndRo6AEu9DI16EstZ/XVMSr2oUx4ubk+PGY7wKEm6qgkjBPO9RW/SPIRaEN4LCWkzfozlCxqJ8siV+XQyKnh5VImJ5o/OydxydVaiYx7l6FChyieUvDz2Sb5yrgr5uuwZ/r71iMeKhFIQttWuhUmRv9YTSE2dY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 21F4913D5; Mon, 22 Apr 2024 03:50:10 -0700 (PDT) Received: from e126817.cambridge.arm.com (e126817.cambridge.arm.com [10.2.3.5]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id C605B3F7BD; Mon, 22 Apr 2024 03:49:39 -0700 (PDT) From: Ben Gainey To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: ak@linux.intel.com, will@kernel.org, james.clark@arm.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Ben Gainey Subject: [RFC PATCH v2 2/4] perf: Allow adding fixed random jitter to the alternate sampling period Date: Mon, 22 Apr 2024 11:49:27 +0100 Message-ID: <20240422104929.264241-3-ben.gainey@arm.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240422104929.264241-1-ben.gainey@arm.com> References: <20240422104929.264241-1-ben.gainey@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change modifies the core perf overflow handler, adding some small random jitter to each sample period whenever an event switches between the two alternate sample periods. A new flag is added to perf_event_attr to opt into this behaviour. This change follows the discussion in [1], where it is recognized that it may be possible for certain patterns of execution to end up with biased results. [1] https://lore.kernel.org/linux-perf-users/Zc24eLqZycmIg3d2@tassilo/ Signed-off-by: Ben Gainey --- include/uapi/linux/perf_event.h | 3 ++- kernel/events/core.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_even= t.h index 5c1701d091cf..dd3697a4b300 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h @@ -461,7 +461,8 @@ struct perf_event_attr { inherit_thread : 1, /* children only inherit if cloned with CLONE_THR= EAD */ remove_on_exec : 1, /* event is removed from task on exec */ sigtrap : 1, /* send synchronous SIGTRAP on event */ - __reserved_1 : 26; + jitter_alternate_period : 1, /* add a limited amount of jitter on each= alternate period */ + __reserved_1 : 25; =20 union { __u32 wakeup_events; /* wakeup every n events */ diff --git a/kernel/events/core.c b/kernel/events/core.c index 07f1f931e18e..079ae520e836 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -9546,6 +9547,8 @@ static inline bool sample_is_allowed(struct perf_even= t *event, struct pt_regs *r return true; } =20 +# define MAX_ALT_SAMPLE_PERIOD_JITTER 16 + /* * Generic event overflow handling, sampling. */ @@ -9573,7 +9576,10 @@ static int __perf_event_overflow(struct perf_event *= event, if (event->attr.alternative_sample_period) { bool using_alt =3D hwc->using_alternative_sample_period; u64 sample_period =3D (using_alt ? event->attr.sample_period - : event->attr.alternative_sample_period); + : event->attr.alternative_sample_period) + + (event->attr.jitter_alternate_period + ? get_random_u32_below(MAX_ALT_SAMPLE_PERIOD_JITTER) + : 0); =20 hwc->sample_period =3D sample_period; hwc->using_alternative_sample_period =3D !using_alt; @@ -12503,6 +12509,9 @@ SYSCALL_DEFINE5(perf_event_open, } } =20 + if (attr.jitter_alternate_period && !attr.alternative_sample_period) + return -EINVAL; + /* Only privileged users can get physical addresses */ if ((attr.sample_type & PERF_SAMPLE_PHYS_ADDR)) { err =3D perf_allow_kernel(&attr); --=20 2.44.0 From nobody Sun Nov 24 01:28:15 2024 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A149414430B; Mon, 22 Apr 2024 10:49:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782986; cv=none; b=o3neGfAaY2KSjE10J9RuXBWHU4v8z63YNB7ZQPOcioCL7KUNn41k3YwgaLSsQTSVWBoVx/5T7Mi9iSSZAw/VYm/V5MxjI1/ruRu2N15mWUTX+F62HfhFj/QsDVMeKMpg4hW7tAbanertBPSaTMA1LzzTZLka3wt4YOGRuE+yTrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782986; c=relaxed/simple; bh=m+SmtbuOXbxQXWB/pl6e09Xr7+eW1EW7GI1DlSpYm6A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Bndt5pGfAYdT1iBKDJWeuYK94BstS0okiSDO+0L+oNrah+TjW285aqhTHh7oxlsBWYZhTXZrvNK+PMcF/tKbX7v6+x5pSdNZ+az0ITgVblvoOKjBVvjNCECXnO/Xfq/77LhwdsBZnsxf8HdPjFEcMHD6HfI1KDVkwu3s4Zzj8xo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5D5A4150C; Mon, 22 Apr 2024 03:50:12 -0700 (PDT) Received: from e126817.cambridge.arm.com (e126817.cambridge.arm.com [10.2.3.5]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 0E1393F7BD; Mon, 22 Apr 2024 03:49:41 -0700 (PDT) From: Ben Gainey To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: ak@linux.intel.com, will@kernel.org, james.clark@arm.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Ben Gainey Subject: [RFC PATCH v2 3/4] tools/perf: Modify event parser to support alt-period term Date: Mon, 22 Apr 2024 11:49:28 +0100 Message-ID: <20240422104929.264241-4-ben.gainey@arm.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240422104929.264241-1-ben.gainey@arm.com> References: <20240422104929.264241-1-ben.gainey@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" parse-events is modified, adding the "alt-period" term which can be used to specify the alternative sampling period. Signed-off-by: Ben Gainey --- tools/include/uapi/linux/perf_event.h | 3 +++ tools/perf/tests/attr.c | 1 + tools/perf/tests/attr.py | 1 + tools/perf/tests/attr/base-record | 3 ++- tools/perf/tests/attr/base-record-spe | 1 + tools/perf/tests/attr/base-stat | 3 ++- tools/perf/tests/attr/system-wide-dummy | 3 ++- tools/perf/tests/attr/test-record-alt-period-term | 11 +++++++++++ tools/perf/tests/attr/test-record-dummy-C0 | 3 ++- tools/perf/util/parse-events.c | 15 +++++++++++++++ tools/perf/util/parse-events.h | 3 ++- tools/perf/util/parse-events.l | 1 + tools/perf/util/perf_event_attr_fprintf.c | 1 + 13 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tools/perf/tests/attr/test-record-alt-period-term diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/lin= ux/perf_event.h index 3a64499b0f5d..5c1701d091cf 100644 --- a/tools/include/uapi/linux/perf_event.h +++ b/tools/include/uapi/linux/perf_event.h @@ -379,6 +379,7 @@ enum perf_event_read_format { #define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ #define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ #define PERF_ATTR_SIZE_VER8 136 /* add: config3 */ +#define PERF_ATTR_SIZE_VER9 144 /* add: alternative_sample_period */ =20 /* * Hardware event_id to monitor via a performance monitoring event: @@ -522,6 +523,8 @@ struct perf_event_attr { __u64 sig_data; =20 __u64 config3; /* extension of config2 */ + + __u64 alternative_sample_period; }; =20 /* diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c index 97e1bdd6ec0e..956b58c7ba8f 100644 --- a/tools/perf/tests/attr.c +++ b/tools/perf/tests/attr.c @@ -139,6 +139,7 @@ static int store_event(struct perf_event_attr *attr, pi= d_t pid, struct perf_cpu WRITE_ASS(branch_sample_type, "llu"); WRITE_ASS(sample_regs_user, "llu"); WRITE_ASS(sample_stack_user, PRIu32); + WRITE_ASS(alternative_sample_period, "llu"); =20 fclose(file); return 0; diff --git a/tools/perf/tests/attr.py b/tools/perf/tests/attr.py index e890c261ad26..75c4527393f9 100644 --- a/tools/perf/tests/attr.py +++ b/tools/perf/tests/attr.py @@ -91,6 +91,7 @@ class Event(dict): 'branch_sample_type', 'sample_regs_user', 'sample_stack_user', + 'alternative_sample_period', ] =20 def add(self, data): diff --git a/tools/perf/tests/attr/base-record b/tools/perf/tests/attr/base= -record index b44e4e6e4443..403de2e2c891 100644 --- a/tools/perf/tests/attr/base-record +++ b/tools/perf/tests/attr/base-record @@ -5,7 +5,7 @@ group_fd=3D-1 flags=3D0|8 cpu=3D* type=3D0|1 -size=3D136 +size=3D144 config=3D0|1 sample_period=3D* sample_type=3D263 @@ -39,3 +39,4 @@ config2=3D0 branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 +alternative_sample_period=3D0 \ No newline at end of file diff --git a/tools/perf/tests/attr/base-record-spe b/tools/perf/tests/attr/= base-record-spe index 08fa96b59240..db528d7d8b73 100644 --- a/tools/perf/tests/attr/base-record-spe +++ b/tools/perf/tests/attr/base-record-spe @@ -38,3 +38,4 @@ config2=3D* branch_sample_type=3D* sample_regs_user=3D* sample_stack_user=3D* +alternative_sample_period=3D0 \ No newline at end of file diff --git a/tools/perf/tests/attr/base-stat b/tools/perf/tests/attr/base-s= tat index fccd8ec4d1b0..27ef0fa1386f 100644 --- a/tools/perf/tests/attr/base-stat +++ b/tools/perf/tests/attr/base-stat @@ -5,7 +5,7 @@ group_fd=3D-1 flags=3D0|8 cpu=3D* type=3D0 -size=3D136 +size=3D144 config=3D0 sample_period=3D0 sample_type=3D65536 @@ -39,3 +39,4 @@ config2=3D0 branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 +alternative_sample_period=3D0 diff --git a/tools/perf/tests/attr/system-wide-dummy b/tools/perf/tests/att= r/system-wide-dummy index a1e1d6a263bf..5c4d2a60931d 100644 --- a/tools/perf/tests/attr/system-wide-dummy +++ b/tools/perf/tests/attr/system-wide-dummy @@ -7,7 +7,7 @@ cpu=3D* pid=3D-1 flags=3D8 type=3D1 -size=3D136 +size=3D144 config=3D9 sample_period=3D1 # PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_TIME | @@ -50,3 +50,4 @@ config2=3D0 branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 +alternative_sample_period=3D0 diff --git a/tools/perf/tests/attr/test-record-alt-period-term b/tools/perf= /tests/attr/test-record-alt-period-term new file mode 100644 index 000000000000..ccbebfcbd194 --- /dev/null +++ b/tools/perf/tests/attr/test-record-alt-period-term @@ -0,0 +1,11 @@ +[config] +command =3D record +args =3D --no-bpf-event -e cycles/period=3D3,alt-period=3D2/ -- kill >/= dev/null 2>&1 +ret =3D 1 + +[event-10:base-record] +sample_period=3D3 +alternative_sample_period=3D2 + +freq=3D0 +sample_type=3D7 \ No newline at end of file diff --git a/tools/perf/tests/attr/test-record-dummy-C0 b/tools/perf/tests/= attr/test-record-dummy-C0 index 576ec48b3aaf..d4f0546e02b6 100644 --- a/tools/perf/tests/attr/test-record-dummy-C0 +++ b/tools/perf/tests/attr/test-record-dummy-C0 @@ -10,7 +10,7 @@ cpu=3D0 pid=3D-1 flags=3D8 type=3D1 -size=3D136 +size=3D144 config=3D9 sample_period=3D4000 # PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_TIME | @@ -53,3 +53,4 @@ config2=3D0 branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 +alternative_sample_period=3D0 diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 6f8b0fa17689..d516d84fa1ee 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -773,6 +773,7 @@ static const char *config_term_name(enum parse_events__= term_type term_type) [PARSE_EVENTS__TERM_TYPE_RAW] =3D "raw", [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] =3D "legacy-cache", [PARSE_EVENTS__TERM_TYPE_HARDWARE] =3D "hardware", + [PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD] =3D "alt-period", }; if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) return "unknown term"; @@ -801,6 +802,7 @@ config_term_avail(enum parse_events__term_type term_typ= e, struct parse_events_er case PARSE_EVENTS__TERM_TYPE_NAME: case PARSE_EVENTS__TERM_TYPE_METRIC_ID: case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: case PARSE_EVENTS__TERM_TYPE_PERCORE: return true; case PARSE_EVENTS__TERM_TYPE_USER: @@ -945,6 +947,16 @@ do { \ return -EINVAL; } break; + case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: + CHECK_TYPE_VAL(NUM); + if (term->val.num =3D=3D 0) { + parse_events_error__handle(err, term->err_val, + strdup("expected a non-zero value"), + NULL); + return -EINVAL; + } + attr->alternative_sample_period =3D term->val.num; + break; case PARSE_EVENTS__TERM_TYPE_DRV_CFG: case PARSE_EVENTS__TERM_TYPE_USER: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: @@ -1071,6 +1083,7 @@ static int config_term_tracepoint(struct perf_event_a= ttr *attr, case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: default: if (err) { parse_events_error__handle(err, term->err_term, @@ -1201,6 +1214,7 @@ do { \ case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: default: break; } @@ -1254,6 +1268,7 @@ static int get_config_chgs(struct perf_pmu *pmu, stru= ct parse_events_terms *head case PARSE_EVENTS__TERM_TYPE_RAW: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: + case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: default: break; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 809359e8544e..06e7ce8a29ef 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -79,7 +79,8 @@ enum parse_events__term_type { PARSE_EVENTS__TERM_TYPE_RAW, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, PARSE_EVENTS__TERM_TYPE_HARDWARE, -#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_HARDWARE + 1) + PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD, +#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_P= ERIOD + 1) }; =20 struct parse_events_term { diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index e86c45675e1d..312a4f1837b9 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -246,6 +246,7 @@ percore { return term(yyscanner, PARSE_EVENTS__TERM_T= YPE_PERCORE); } aux-output { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT); } aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMP= LE_SIZE); } metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } +alt-period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PE= RIOD); } cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES)= ; } stalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, P= ERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PER= F_COUNT_HW_STALLED_CYCLES_BACKEND); } diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/pe= rf_event_attr_fprintf.c index 8f04d3b7f3ec..61acd99e08f5 100644 --- a/tools/perf/util/perf_event_attr_fprintf.c +++ b/tools/perf/util/perf_event_attr_fprintf.c @@ -323,6 +323,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_even= t_attr *attr, PRINT_ATTRf(sample_max_stack, p_unsigned); PRINT_ATTRf(aux_sample_size, p_unsigned); PRINT_ATTRf(sig_data, p_unsigned); + PRINT_ATTRf(alternative_sample_period, p_unsigned); =20 return ret; } --=20 2.44.0 From nobody Sun Nov 24 01:28:15 2024 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DCBCF146A93; Mon, 22 Apr 2024 10:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782988; cv=none; b=OFIBz1ya+8ptsO/zyVxOD9dUoFe9asye86GVzp4f9R/E2p7iciQngPkeZ7HV1hz/wLGNb6oOcnn4vfeeN6QCgBoGf1F2jKKa/9YtIASmyQR/iKppZBcQcFLtCMF35R/cePY3K3h0dlfFJE5kUKpKpH8PYlQDvz4znsvYVqwauTw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713782988; c=relaxed/simple; bh=On1b5DkttpFIhWrjyN3UO9TvEDQ5gy9BpjHBe0K+pQQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fFip90dsTT+ZKmXfpdMvMWUW6WlIZ6u1EcwRc/sZu9lfbMMKYpyZpX7QKSUVT0kj7j9s30F4mwY4MccKit4WM0fNeZE5CR8svaKvH8nlZpvdET3EulV1F8L7Ndsb4hZttpLdVQKErhabnwWMkpoMujBiB8gSaI3oCINWcwAt17M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 99FDC339; Mon, 22 Apr 2024 03:50:14 -0700 (PDT) Received: from e126817.cambridge.arm.com (e126817.cambridge.arm.com [10.2.3.5]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 49DFC3F7BD; Mon, 22 Apr 2024 03:49:44 -0700 (PDT) From: Ben Gainey To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org, namhyung@kernel.org Cc: ak@linux.intel.com, will@kernel.org, james.clark@arm.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Ben Gainey Subject: [RFC PATCH v2 4/4] tools/perf: Modify event parser to support alt-period-jitter term Date: Mon, 22 Apr 2024 11:49:29 +0100 Message-ID: <20240422104929.264241-5-ben.gainey@arm.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240422104929.264241-1-ben.gainey@arm.com> References: <20240422104929.264241-1-ben.gainey@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" parse-events is modified, adding the "alt-period-jitter" term which can be used to enable random jitter of the alternative sample period. Signed-off-by: Ben Gainey --- tools/include/uapi/linux/perf_event.h | 3 ++- tools/perf/tests/attr.c | 1 + tools/perf/tests/attr.py | 1 + tools/perf/tests/attr/base-record | 3 ++- tools/perf/tests/attr/base-record-spe | 3 ++- tools/perf/tests/attr/base-stat | 1 + tools/perf/tests/attr/system-wide-dummy | 1 + .../tests/attr/test-record-alt-period-jitter-term | 12 ++++++++++++ tools/perf/tests/attr/test-record-dummy-C0 | 1 + tools/perf/util/parse-events.c | 15 +++++++++++++++ tools/perf/util/parse-events.h | 3 ++- tools/perf/util/parse-events.l | 1 + 12 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 tools/perf/tests/attr/test-record-alt-period-jitter-term diff --git a/tools/include/uapi/linux/perf_event.h b/tools/include/uapi/lin= ux/perf_event.h index 5c1701d091cf..dd3697a4b300 100644 --- a/tools/include/uapi/linux/perf_event.h +++ b/tools/include/uapi/linux/perf_event.h @@ -461,7 +461,8 @@ struct perf_event_attr { inherit_thread : 1, /* children only inherit if cloned with CLONE_THR= EAD */ remove_on_exec : 1, /* event is removed from task on exec */ sigtrap : 1, /* send synchronous SIGTRAP on event */ - __reserved_1 : 26; + jitter_alternate_period : 1, /* add a limited amount of jitter on each= alternate period */ + __reserved_1 : 25; =20 union { __u32 wakeup_events; /* wakeup every n events */ diff --git a/tools/perf/tests/attr.c b/tools/perf/tests/attr.c index 956b58c7ba8f..7fb5d1d0b0ab 100644 --- a/tools/perf/tests/attr.c +++ b/tools/perf/tests/attr.c @@ -140,6 +140,7 @@ static int store_event(struct perf_event_attr *attr, pi= d_t pid, struct perf_cpu WRITE_ASS(sample_regs_user, "llu"); WRITE_ASS(sample_stack_user, PRIu32); WRITE_ASS(alternative_sample_period, "llu"); + WRITE_ASS(jitter_alternate_period, "d"); =20 fclose(file); return 0; diff --git a/tools/perf/tests/attr.py b/tools/perf/tests/attr.py index 75c4527393f9..ecab8e69418f 100644 --- a/tools/perf/tests/attr.py +++ b/tools/perf/tests/attr.py @@ -92,6 +92,7 @@ class Event(dict): 'sample_regs_user', 'sample_stack_user', 'alternative_sample_period', + 'jitter_alternate_period', ] =20 def add(self, data): diff --git a/tools/perf/tests/attr/base-record b/tools/perf/tests/attr/base= -record index 403de2e2c891..39a7228612c2 100644 --- a/tools/perf/tests/attr/base-record +++ b/tools/perf/tests/attr/base-record @@ -39,4 +39,5 @@ config2=3D0 branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 -alternative_sample_period=3D0 \ No newline at end of file +alternative_sample_period=3D0 +jitter_alternate_period=3D0 diff --git a/tools/perf/tests/attr/base-record-spe b/tools/perf/tests/attr/= base-record-spe index db528d7d8b73..b228cd98cfa1 100644 --- a/tools/perf/tests/attr/base-record-spe +++ b/tools/perf/tests/attr/base-record-spe @@ -38,4 +38,5 @@ config2=3D* branch_sample_type=3D* sample_regs_user=3D* sample_stack_user=3D* -alternative_sample_period=3D0 \ No newline at end of file +alternative_sample_period=3D0 +jitter_alternate_period=3D0 diff --git a/tools/perf/tests/attr/base-stat b/tools/perf/tests/attr/base-s= tat index 27ef0fa1386f..d9057d780262 100644 --- a/tools/perf/tests/attr/base-stat +++ b/tools/perf/tests/attr/base-stat @@ -40,3 +40,4 @@ branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 alternative_sample_period=3D0 +jitter_alternate_period=3D0 diff --git a/tools/perf/tests/attr/system-wide-dummy b/tools/perf/tests/att= r/system-wide-dummy index 5c4d2a60931d..4d80542c3a68 100644 --- a/tools/perf/tests/attr/system-wide-dummy +++ b/tools/perf/tests/attr/system-wide-dummy @@ -51,3 +51,4 @@ branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 alternative_sample_period=3D0 +jitter_alternate_period=3D0 diff --git a/tools/perf/tests/attr/test-record-alt-period-jitter-term b/too= ls/perf/tests/attr/test-record-alt-period-jitter-term new file mode 100644 index 000000000000..65f7c06c26e9 --- /dev/null +++ b/tools/perf/tests/attr/test-record-alt-period-jitter-term @@ -0,0 +1,12 @@ +[config] +command =3D record +args =3D --no-bpf-event -e cycles/period=3D3,alt-period=3D2,jitter_alte= rnate_period/ -- kill >/dev/null 2>&1 +ret =3D 1 + +[event-10:base-record] +sample_period=3D3 +alternative_sample_period=3D2 +jitter_alternate_period=3D1 + +freq=3D0 +sample_type=3D7 \ No newline at end of file diff --git a/tools/perf/tests/attr/test-record-dummy-C0 b/tools/perf/tests/= attr/test-record-dummy-C0 index d4f0546e02b6..0f3360c35a5e 100644 --- a/tools/perf/tests/attr/test-record-dummy-C0 +++ b/tools/perf/tests/attr/test-record-dummy-C0 @@ -54,3 +54,4 @@ branch_sample_type=3D0 sample_regs_user=3D0 sample_stack_user=3D0 alternative_sample_period=3D0 +jitter_alternate_period=3D0 diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index d516d84fa1ee..9821e3cd26a4 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -774,6 +774,7 @@ static const char *config_term_name(enum parse_events__= term_type term_type) [PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE] =3D "legacy-cache", [PARSE_EVENTS__TERM_TYPE_HARDWARE] =3D "hardware", [PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD] =3D "alt-period", + [PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER] =3D "alt-period-jitter", }; if ((unsigned int)term_type >=3D __PARSE_EVENTS__TERM_TYPE_NR) return "unknown term"; @@ -803,6 +804,7 @@ config_term_avail(enum parse_events__term_type term_typ= e, struct parse_events_er case PARSE_EVENTS__TERM_TYPE_METRIC_ID: case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER: case PARSE_EVENTS__TERM_TYPE_PERCORE: return true; case PARSE_EVENTS__TERM_TYPE_USER: @@ -957,6 +959,16 @@ do { \ } attr->alternative_sample_period =3D term->val.num; break; + case PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER: + CHECK_TYPE_VAL(NUM); + if ((unsigned int)term->val.num > 1) { + parse_events_error__handle(err, term->err_val, + strdup("expected 0 or 1"), + NULL); + return -EINVAL; + } + attr->jitter_alternate_period =3D (term->val.num !=3D 0); + break; case PARSE_EVENTS__TERM_TYPE_DRV_CFG: case PARSE_EVENTS__TERM_TYPE_USER: case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: @@ -1084,6 +1096,7 @@ static int config_term_tracepoint(struct perf_event_a= ttr *attr, case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER: default: if (err) { parse_events_error__handle(err, term->err_term, @@ -1215,6 +1228,7 @@ do { \ case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER: default: break; } @@ -1269,6 +1283,7 @@ static int get_config_chgs(struct perf_pmu *pmu, stru= ct parse_events_terms *head case PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE: case PARSE_EVENTS__TERM_TYPE_HARDWARE: case PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD: + case PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER: default: break; } diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 06e7ce8a29ef..2b02c5a6a5f3 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -80,7 +80,8 @@ enum parse_events__term_type { PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, PARSE_EVENTS__TERM_TYPE_HARDWARE, PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PERIOD, -#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_P= ERIOD + 1) + PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_JITTER, +#define __PARSE_EVENTS__TERM_TYPE_NR (PARSE_EVENTS__TERM_TYPE_ALT_PERIOD_J= ITTER + 1) }; =20 struct parse_events_term { diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 312a4f1837b9..f5587dff596c 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l @@ -247,6 +247,7 @@ aux-output { return term(yyscanner, PARSE_EVENTS__TERM= _TYPE_AUX_OUTPUT); } aux-sample-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_AUX_SAMP= LE_SIZE); } metric-id { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_METRIC_ID); } alt-period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_ALT_SAMPLE_PE= RIOD); } +alt-period-jitter { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_ALT_PER= IOD_JITTER); } cpu-cycles|cycles { return hw_term(yyscanner, PERF_COUNT_HW_CPU_CYCLES)= ; } stalled-cycles-frontend|idle-cycles-frontend { return hw_term(yyscanner, P= ERF_COUNT_HW_STALLED_CYCLES_FRONTEND); } stalled-cycles-backend|idle-cycles-backend { return hw_term(yyscanner, PER= F_COUNT_HW_STALLED_CYCLES_BACKEND); } --=20 2.44.0