lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190930130615.GN4553@hirez.programming.kicks-ass.net>
Date:   Mon, 30 Sep 2019 15:06:15 +0200
From:   Peter Zijlstra <peterz@...radead.org>
To:     kan.liang@...ux.intel.com
Cc:     acme@...nel.org, mingo@...hat.com, linux-kernel@...r.kernel.org,
        tglx@...utronix.de, jolsa@...nel.org, eranian@...gle.com,
        alexander.shishkin@...ux.intel.com, ak@...ux.intel.com
Subject: Re: [PATCH V4 07/14] perf/x86/intel: Support hardware TopDown metrics

On Mon, Sep 16, 2019 at 06:41:21AM -0700, kan.liang@...ux.intel.com wrote:
> Reset
> ======
> 
> Both PERF_METRICS and fixed counter 3 are required to start from zero.

explain *why*, also in the comments.

> However, current perf has -max_period as default initial value.
> The patch force initial value as 0 for topdown and slots event counting.
> 
> Additionally, for certain scenarios that involve counting metrics at
> high rates, SW is required to periodically clear both MSRs in order to
> maintain accurate measurements. In this patch, both PERF_METRICS and
> Fixed counter 3 are reset for each read.

That forgoes all the good details again :/ 


> Originally-by: Andi Kleen <ak@...ux.intel.com>

This is of dubius value here and in that other patch. In that other
patch I've written more lines than Andi has and here you have pretty
much rewritten everything since v1 or so.

> +static bool is_first_topdown_event_in_group(struct perf_event *event)
> +{
> +	struct perf_event *first = NULL;
> +
> +	if (is_topdown_event(event->group_leader))
> +		first = event->group_leader;
> +	else {
> +		for_each_sibling_event(first, event->group_leader)
> +			if (is_topdown_event(first))
> +				break;
> +	}
> +
> +	if (event == first)
> +		return true;
> +
> +	return false;
> +}

> +static u64 icl_update_topdown_event(struct perf_event *event)
> +{
> +	struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
> +	struct perf_event *other;
> +	u64 slots, metrics;
> +	int idx;
> +
> +	/*
> +	 * Only need to update all events for the first
> +	 * slots/metrics event in a group
> +	 */
> +	if (event && !is_first_topdown_event_in_group(event))
> +		return 0;

This is pretty crap and approaches O(n^2); let me think if there's
anything saner to do here.

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ