All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Matt Turner" <mattst88@gmail.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v6 08/13] alpha/perf: optionally randomize the ProfileMe sampling interval
Date: Wed, 04 Nov 2026 19:04:28 +0000	[thread overview]
Message-ID: <sashiko-outbox-197912@kernel.org> (raw)
In-Reply-To: <20261104-alpha-profileme-v6-8-63362e9290a3@gmail.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] alpha/perf: negative period_left in alpha_perf_event_set_period() jitter
--

commit 9ea17dccaea7d498bc01f69fffc0c162389f6e92
Author: Matt Turner <mattst88@gmail.com>

alpha/perf: optionally randomize the ProfileMe sampling interval

This commit adds a randomize config bit for raw ProfileMe perf events on
Alpha that varies each sampling interval by up to 1/16 of the period in
either direction using a per-CPU prandom state.

> diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c
> index f6546d6481333..b33677cc23caa 100644
> --- a/arch/alpha/kernel/perf_event.c
> +++ b/arch/alpha/kernel/perf_event.c

[ ... ]

> @@ -389,6 +399,22 @@ static int alpha_perf_event_set_period(struct perf_event *event,
>  		ret = 1;
>  	}
>  
> +	/*
> +	 * Vary each new interval by up to 1/16 of the period either way, so
> +	 * the samples cannot phase-lock with a loop whose length divides the
> +	 * period. The count stays exact because prev_count records the value
> +	 * written.
> +	 */
> +	if (ret && (hwc->flags & ALPHA_PERF_FLAG_RANDOMIZE) && period >= 8) {
> +		long jitter = period / 8;
> +		u32 r = prandom_u32_state(this_cpu_ptr(&alpha_perf_rnd));
> +		long offset = mul_u64_u32_shr(jitter, r, 32) - jitter / 2;
> +
> +		if (check_add_overflow(left, offset, &left))
> +			left = LONG_MAX;
> +		local64_set(&hwc->period_left, left);
> +	}

[Severity: Medium]
Can a negative offset here drive left and hwc->period_left to zero or a
negative value?

In alpha_perf_event_set_period(), when left enters in the range
[-period + 1, -period + (period / 8) / 2], the first check (left <= -period)
is false and the second check (left <= 0) adds period to left, leaving left
in [1, (period / 8) / 2] with ret = 1:

arch/alpha/kernel/perf_event.c:alpha_perf_event_set_period() {
	if (unlikely(left <= -period)) {
		left = period;
		local64_set(&hwc->period_left, left);
		hwc->last_period = period;
		ret = 1;
	}

	if (unlikely(left <= 0)) {
		left += period;
		local64_set(&hwc->period_left, left);
		hwc->last_period = period;
		ret = 1;
	}
	...
	if (unlikely(left < alpha_pmu->pmc_left[idx]))
		left = alpha_pmu->pmc_left[idx];
}

Since offset can be as negative as -(jitter / 2), adding offset to left can
produce left <= 0, which is then stored into hwc->period_left.

The subsequent hardware minimum check only clamps the local variable left to
alpha_pmu->pmc_left[idx] (16) before programming the counter, leaving
hwc->period_left <= 0. If the event is later stopped and reloaded before the
next overflow (for example on a scheduler tick or context switch via
alpha_pmu_stop() and alpha_pmu_start()), alpha_perf_event_set_period() will
see left <= 0 and add another full period without emitting a sample, or the
next overflow will subtract delta from an already non-positive
hwc->period_left.

Should left (and hwc->period_left) be clamped so that the jittered interval
remains positive?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261104-alpha-profileme-v6-0-63362e9290a3@gmail.com?part=8

  reply	other threads:[~2026-11-04 19:04 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-04 18:49 [PATCH v6 00/13] alpha/perf: add ProfileMe sampling Matt Turner
2026-11-04 18:49 ` [PATCH v6 01/13] alpha/perf: pass PERFMON_CMD_LOGGING_ALL to the logging options call Matt Turner
2026-11-04 18:52   ` sashiko-bot
2026-11-04 18:49 ` [PATCH v6 02/13] alpha/perf: add sysfs format and event attributes Matt Turner
2026-11-04 18:52   ` sashiko-bot
2026-11-04 18:49 ` [PATCH v6 03/13] alpha/perf: clear PERF_HES_UPTODATE when an event starts counting Matt Turner
2026-11-04 18:54   ` sashiko-bot
2026-11-04 18:49 ` [PATCH v6 04/13] alpha/perf: do not report user registers from the entry code Matt Turner
2026-11-04 18:56   ` sashiko-bot
2026-11-04 18:49 ` [PATCH v6 05/13] alpha/perf: ignore overflow interrupts the counter does not account for Matt Turner
2026-11-04 19:09   ` sashiko-bot
2026-11-04 21:54   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 06/13] alpha/perf: implement ProfileMe sampling Matt Turner
2026-11-04 19:20   ` sashiko-bot
2026-11-04 21:57   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 07/13] alpha/perf: attach ProfileMe status as PERF_SAMPLE_RAW data Matt Turner
2026-11-04 19:00   ` sashiko-bot
2026-11-04 18:49 ` [PATCH v6 08/13] alpha/perf: optionally randomize the ProfileMe sampling interval Matt Turner
2026-11-04 19:04   ` sashiko-bot [this message]
2026-11-04 18:49 ` [PATCH v6 09/13] alpha/perf: report the ProfileMe window count as the sample weight Matt Turner
2026-11-04 18:56   ` sashiko-bot
2026-11-04 22:11   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 10/13] alpha/perf: report the data source of ProfileMe memory accesses Matt Turner
2026-11-04 18:59   ` sashiko-bot
2026-11-04 22:31   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 11/13] alpha/perf: add ProfileMe sample filters Matt Turner
2026-11-04 18:55   ` sashiko-bot
2026-11-05 19:10   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 12/13] alpha/perf: sample only retired instructions for precise events Matt Turner
2026-11-04 19:10   ` sashiko-bot
2026-11-05 19:11   ` Magnus Lindholm
2026-11-04 18:49 ` [PATCH v6 13/13] alpha/perf: honor exclude_user and exclude_kernel for ProfileMe events Matt Turner
2026-11-04 19:02   ` sashiko-bot
2026-11-05 19:18   ` Magnus Lindholm
2026-11-05 19:19 ` [PATCH v6 00/13] alpha/perf: add ProfileMe sampling Magnus Lindholm

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-197912@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mattst88@gmail.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.